From ec0de8e1ac425b0f6855d46f737c2726cd82df88 Mon Sep 17 00:00:00 2001 From: scipio Date: Mon, 6 Nov 2006 11:56:45 +0000 Subject: [PATCH] Updated files. --- README | 90 +- apps/BaseStationCC2420/BaseStationC.nc | 89 ++ apps/BaseStationCC2420/BaseStationP.nc | 278 +++++ apps/BaseStationCC2420/CC2420ControlP.nc | 284 +++++ apps/BaseStationCC2420/Makefile | 3 + apps/BaseStationCC2420/README.txt | 40 + apps/MViz/.cvsignore | 1 + apps/MViz/MViz.h | 39 + apps/MViz/MVizAppC.nc | 58 + apps/MViz/MVizC.nc | 239 ++++ apps/MViz/MVizSensorC.nc | 16 + apps/MViz/Makefile | 11 + apps/MViz/README.txt | 41 + apps/MViz/mote.gif | Bin 0 -> 2141 bytes apps/tests/TestAM/README.txt | 19 + .../TestFcfsArbiter/TestFcfsArbiterAppC.nc | 89 ++ .../TestFcfsArbiter/TestFcfsArbiterC.nc | 115 ++ .../TestRoundRobinArbiterAppC.nc | 89 ++ .../TestRoundRobinArbiterC.nc | 115 ++ apps/tests/TestDissemination/README | 24 + apps/tests/TestLPL/Makefile | 4 + apps/tests/TestLPL/README.txt | 54 + apps/tests/TestLPL/TestLplAppC.nc | 64 ++ apps/tests/TestLPL/TestLplC.nc | 144 +++ apps/tests/TestPrintf/Makefile | 13 + apps/tests/TestPrintf/PrintfClient.java | 81 ++ apps/tests/TestPrintf/TestPrintfAppC.nc | 43 + apps/tests/TestPrintf/TestPrintfC.nc | 77 ++ apps/tests/TestSharedResource/Makefile | 3 + apps/tests/TestSharedResource/README.txt | 35 + .../TestSharedResource/ResourceOperations.nc | 37 + apps/tests/TestSharedResource/ResourceP.nc | 78 ++ .../TestSharedResource/SharedResourceC.nc | 54 + .../TestSharedResource/SharedResourceImplP.nc | 60 + .../TestSharedResource/SharedResourceP.nc | 55 + .../TestSharedResourceAppC.nc | 76 ++ .../TestSharedResource/TestSharedResourceC.nc | 123 ++ apps/tests/TestTrickleTimer/TestTrickle.h | 6 + apps/tests/eyesIFX/RadioCountToFlash/Makefile | 15 + .../eyesIFX/RadioCountToFlash/README.txt | 22 + .../RadioCountToFlash/RadioCountToFlash.h | 12 + .../RadioCountToFlashAppC.nc | 72 ++ .../RadioCountToFlash/RadioCountToFlashC.nc | 211 ++++ .../RadioCountToFlash/volumes-at45db.xml | 3 + .../tests/storage/Block/volumes-pxa27xp30.xml | 3 + .../storage/CircularLog/volumes-pxa27xp30.xml | 3 + .../storage/Config/volumes-pxa27xp30.xml | 3 + apps/tests/storage/Log/volumes-pxa27xp30.xml | 3 + apps/tutorials/BlinkConfig/BlinkConfigAppC.nc | 8 + apps/tutorials/BlinkConfig/BlinkConfigC.nc | 8 + apps/tutorials/BlinkConfig/README.txt | 2 +- doc/html/porting.html | 378 ++++++ doc/html/tutorial/img/arbiter_pm_graph.png | Bin 0 -> 35831 bytes doc/html/tutorial/img/mviz.png | Bin 0 -> 1161178 bytes .../tutorial/img/shared_resource_graph.png | Bin 0 -> 74338 bytes doc/html/tutorial/lesson10.html | 556 +++++++++ doc/html/tutorial/lesson12.html | 206 ++++ doc/html/tutorial/lesson13.html | 379 ++++++ doc/html/tutorial/lesson7.html | 380 ++++++ doc/html/tutorial/lesson9.html | 93 ++ doc/pdf/tinyos-programming.pdf | Bin 0 -> 778648 bytes doc/txt/porting.txt | 85 ++ overall-todo.txt | 119 ++ .../sdk/java/net/tinyos/mviz/DDocument.java | 520 +++++++++ support/sdk/java/net/tinyos/mviz/DLayer.java | 365 ++++++ support/sdk/java/net/tinyos/mviz/DLink.java | 173 +++ .../sdk/java/net/tinyos/mviz/DLinkModel.java | 162 +++ .../net/tinyos/mviz/DLinkModelListener.java | 39 + support/sdk/java/net/tinyos/mviz/DMote.java | 1 + .../sdk/java/net/tinyos/mviz/DMoteModel.java | 233 ++++ .../net/tinyos/mviz/DMoteModelListener.java | 39 + .../sdk/java/net/tinyos/mviz/DNavigate.java | 212 ++++ support/sdk/java/net/tinyos/mviz/DShape.java | 150 +++ .../sdk/java/net/tinyos/mviz/DShapeModel.java | 218 ++++ .../net/tinyos/mviz/DShapeModelListener.java | 46 + .../sdk/java/net/tinyos/mviz/DataModel.java | 121 ++ support/sdk/java/net/tinyos/mviz/Makefile | 6 + .../java/net/tinyos/mviz/MessageInput.java | 168 +++ .../java/net/tinyos/mviz/images/tmote_sky.gif | Bin 0 -> 4262 bytes .../java/net/tinyos/mviz/images/tmote_sky.jpg | Bin 0 -> 142143 bytes .../java/net/tinyos/mviz/images/tmote_sky.png | Bin 0 -> 9506 bytes support/sdk/java/tinyos.jar | Bin 68609 -> 220613 bytes tools/tinyos/misc/tos-mviz | 8 + tools/tinyos/misc/tos-mviz.1 | 18 + tools/tinyos/misc/tos-storage-pxa27xp30 | 152 +++ tools/tinyos/misc/tos-storage-pxa27xp30.1 | 25 + tools/tinyos/misc/tos-storage-pxa27xp30.in | 152 +++ tos/chips/atm128/Atm128Uart0C.nc | 63 + tos/chips/atm128/Atm128UartP.nc | 180 +++ tos/chips/atm128/HplAtm128Uart.nc | 51 + tos/chips/cc1000_lpl/ByteRadio.nc | 96 ++ tos/chips/cc1000_lpl/CC1000ActiveMessageC.nc | 76 ++ tos/chips/cc1000_lpl/CC1000ActiveMessageP.nc | 169 +++ tos/chips/cc1000_lpl/CC1000Const.h | 469 ++++++++ tos/chips/cc1000_lpl/CC1000Control.nc | 137 +++ tos/chips/cc1000_lpl/CC1000ControlP.nc | 385 +++++++ tos/chips/cc1000_lpl/CC1000CsmaP.nc | 579 ++++++++++ tos/chips/cc1000_lpl/CC1000CsmaRadioC.nc | 115 ++ .../cc1000_lpl/CC1000LowPowerListening.h | 56 + .../cc1000_lpl/CC1000LowPowerListeningC.nc | 77 ++ .../cc1000_lpl/CC1000LowPowerListeningP.nc | 338 ++++++ tos/chips/cc1000_lpl/CC1000Msg.h | 27 + tos/chips/cc1000_lpl/CC1000RssiP.nc | 111 ++ tos/chips/cc1000_lpl/CC1000SendReceiveP.nc | 675 +++++++++++ tos/chips/cc1000_lpl/CC1000Squelch.nc | 54 + tos/chips/cc1000_lpl/CC1000SquelchP.nc | 98 ++ tos/chips/cc1000_lpl/CsmaControl.nc | 41 + tos/chips/cc1000_lpl/HplCC1000.nc | 73 ++ tos/chips/cc1000_lpl/HplCC1000Spi.nc | 93 ++ tos/chips/cc1000_lpl/LowPowerListening.nc | 129 +++ tos/chips/cc2420_lpl/AlarmMultiplexC.nc | 57 + tos/chips/cc2420_lpl/CC2420.h | 321 ++++++ tos/chips/cc2420_lpl/CC2420ActiveMessageC.nc | 88 ++ tos/chips/cc2420_lpl/CC2420ActiveMessageP.nc | 188 +++ tos/chips/cc2420_lpl/CC2420Cca.nc | 46 + tos/chips/cc2420_lpl/CC2420Config.nc | 73 ++ tos/chips/cc2420_lpl/CC2420ControlC.nc | 93 ++ tos/chips/cc2420_lpl/CC2420ControlP.nc | 286 +++++ tos/chips/cc2420_lpl/CC2420CsmaC.nc | 88 ++ tos/chips/cc2420_lpl/CC2420CsmaP.nc | 233 ++++ tos/chips/cc2420_lpl/CC2420DutyCycle.h | 63 + tos/chips/cc2420_lpl/CC2420DutyCycle.nc | 57 + tos/chips/cc2420_lpl/CC2420DutyCycleC.nc | 80 ++ tos/chips/cc2420_lpl/CC2420DutyCycleP.nc | 286 +++++ tos/chips/cc2420_lpl/CC2420Fifo.nc | 93 ++ .../cc2420_lpl/CC2420LowPowerListening.h | 66 ++ .../cc2420_lpl/CC2420LowPowerListeningC.nc | 83 ++ .../cc2420_lpl/CC2420LowPowerListeningP.nc | 505 ++++++++ tos/chips/cc2420_lpl/CC2420LplDummyP.nc | 84 ++ tos/chips/cc2420_lpl/CC2420Packet.nc | 71 ++ tos/chips/cc2420_lpl/CC2420PacketC.nc | 86 ++ tos/chips/cc2420_lpl/CC2420Power.nc | 99 ++ tos/chips/cc2420_lpl/CC2420Ram.nc | 65 ++ tos/chips/cc2420_lpl/CC2420Receive.nc | 64 ++ tos/chips/cc2420_lpl/CC2420ReceiveC.nc | 73 ++ tos/chips/cc2420_lpl/CC2420ReceiveP.nc | 287 +++++ tos/chips/cc2420_lpl/CC2420Register.nc | 57 + tos/chips/cc2420_lpl/CC2420SpiC.nc | 115 ++ tos/chips/cc2420_lpl/CC2420SpiImplP.nc | 233 ++++ tos/chips/cc2420_lpl/CC2420SpiP.nc | 64 ++ tos/chips/cc2420_lpl/CC2420Strobe.nc | 47 + tos/chips/cc2420_lpl/CC2420Transmit.nc | 99 ++ tos/chips/cc2420_lpl/CC2420TransmitC.nc | 96 ++ tos/chips/cc2420_lpl/CC2420TransmitP.nc | 575 ++++++++++ tos/chips/cc2420_lpl/IEEE802154.h | 61 + tos/chips/cc2420_lpl/LowPowerListening.nc | 129 +++ tos/chips/ds2745/DS2745.h | 60 + tos/chips/ds2745/HplDS2745.nc | 159 +++ tos/chips/ds2745/HplDS2745LogicP.nc | 283 +++++ tos/chips/msp430/adc12/AdcP.nc | 383 +++++++ .../msp430/adc12/Msp430Adc12ClientAutoDMAC.nc | 66 ++ .../adc12/Msp430Adc12ClientAutoDMA_RVGC.nc | 73 ++ .../msp430/adc12/Msp430Adc12ClientAutoRVGC.nc | 61 + tos/chips/msp430/adc12/Msp430Adc12DMAP.nc | 196 ++++ tos/chips/msp430/adc12/Msp430Adc12ImplP.nc | 494 ++++++++ .../msp430/adc12/Msp430RefVoltArbiterImplP.nc | 160 +++ tos/chips/msp430/adc12/README.txt | 68 ++ tos/chips/msp430/timer/Alarm32khz16C.nc | 47 + tos/chips/msp430/timer/Alarm32khz32C.nc | 47 + tos/chips/msp430/timer/AlarmMilli16C.nc | 47 + tos/chips/msp430/timer/AlarmMilli32C.nc | 47 + tos/chips/msp430/timer/Counter32khz16C.nc | 40 + tos/chips/msp430/timer/Counter32khz32C.nc | 43 + tos/chips/msp430/timer/CounterMilli16C.nc | 43 + tos/chips/msp430/timer/CounterMilli32C.nc | 43 + tos/chips/msp430/usart/HplMsp430I2C.nc | 102 ++ tos/chips/msp430/usart/HplMsp430I2C0C.nc | 21 + tos/chips/msp430/usart/HplMsp430I2C0P.nc | 249 ++++ .../msp430/usart/HplMsp430I2CInterrupts.nc | 41 + tos/chips/msp430/usart/Msp430I2C0P.nc | 65 ++ tos/chips/msp430/usart/Msp430I2CC.nc | 65 ++ tos/chips/msp430/usart/Msp430I2CConfigure.nc | 40 + tos/chips/msp430/usart/Msp430I2CP.nc | 226 ++++ tos/chips/msp430/usart/Msp430Spi1C.nc | 70 ++ tos/chips/msp430/usart/Msp430SpiConfigure.nc | 40 + tos/chips/msp430/usart/Msp430SpiDma1P.nc | 71 ++ tos/chips/msp430/usart/Msp430SpiNoDma1P.nc | 67 ++ tos/chips/msp430/usart/Msp430Uart0C.nc | 69 ++ tos/chips/msp430/usart/Msp430Uart0P.nc | 73 ++ tos/chips/msp430/usart/Msp430Uart1P.nc | 73 ++ tos/chips/msp430/usart/Msp430UartConfigure.nc | 40 + tos/chips/msp430/usart/Msp430UartControl.nc | 52 + tos/chips/msp430/usart/Msp430Usart1C.nc | 66 ++ tos/chips/msp430/usart/Msp430UsartShare1P.nc | 64 ++ tos/chips/pxa27x/dma/DMA.h | 55 + tos/chips/pxa27x/dma/HalPXA27xDMAChannel.nc | 59 + tos/chips/pxa27x/dma/HalPXA27xDMAChannelC.nc | 47 + tos/chips/pxa27x/dma/HalPXA27xDMAChannelM.nc | 214 ++++ tos/chips/pxa27x/dma/HplPXA27xDMAInfoC.nc | 57 + tos/chips/pxa27x/p30/Flash.nc | 76 ++ tos/chips/pxa27x/p30/FlashC.nc | 17 + tos/chips/pxa27x/p30/HalP30C.nc | 50 + tos/chips/pxa27x/p30/HalP30P.nc | 280 +++++ tos/chips/pxa27x/p30/HplP30.nc | 45 + tos/chips/pxa27x/p30/HplP30P.nc | 179 +++ tos/chips/pxa27x/p30/P30.h | 90 ++ tos/chips/pxa27x/p30/P30BlockC.nc | 47 + tos/chips/pxa27x/p30/P30BlockP.nc | 215 ++++ tos/chips/pxa27x/p30/P30ConfigC.nc | 47 + tos/chips/pxa27x/p30/P30ConfigP.nc | 322 ++++++ tos/chips/pxa27x/p30/P30LogC.nc | 53 + tos/chips/pxa27x/p30/P30LogCircularP.nc | 47 + tos/chips/pxa27x/p30/P30LogP.nc | 584 ++++++++++ tos/chips/pxa27x/p30/Storage_chip.h | 43 + tos/chips/pxa27x/ssp/HalPXA27xPSPDMAC.nc | 71 ++ tos/chips/pxa27x/ssp/HalPXA27xPSPPioC.nc | 60 + tos/chips/pxa27x/ssp/HalPXA27xSSPDMAC.nc | 71 ++ tos/chips/pxa27x/ssp/HalPXA27xSSPPioC.nc | 60 + tos/chips/pxa27x/ssp/HalPXA27xSpiDMAC.nc | 71 ++ tos/chips/pxa27x/ssp/HalPXA27xuWireDMAC.nc | 71 ++ tos/chips/pxa27x/ssp/HalPXA27xuWirePioC.nc | 60 + tos/chips/pxa27x/timer/HalPXA27xSleep.nc | 77 ++ tos/chips/pxa27x/timer/HalPXA27xSleepC.nc | 51 + tos/chips/pxa27x/timer/HalPXA27xSleepM.nc | 119 ++ tos/chips/pxa27x/timer/HalPXA27xWatchdog.nc | 58 + tos/chips/pxa27x/timer/HalPXA27xWatchdogC.nc | 50 + tos/chips/pxa27x/timer/HalPXA27xWatchdogM.nc | 69 ++ tos/chips/pxa27x/timer/HplPXA27xPower.nc | 43 + tos/chips/pxa27x/timer/HplPXA27xPowerM.nc | 55 + tos/chips/pxa27x/timer/HplPXA27xRTC.nc | 49 + tos/chips/pxa27x/timer/HplPXA27xRTCM.nc | 49 + tos/chips/pxa27x/uart/HalPXA27xSerialCntl.nc | 65 ++ .../pxa27x/uart/HalPXA27xSerialPacket.nc | 92 ++ tos/chips/pxa27x/uart/HplPXA27xBTUARTC.nc | 52 + tos/chips/pxa27x/uart/HplPXA27xFFUARTC.nc | 52 + tos/chips/pxa27x/uart/HplPXA27xUARTP.nc | 143 +++ tos/chips/pxa27x/uart/PXA27X_UARTREG.h | 58 + tos/chips/pxa27x/uart/pxa27x_serial.h | 44 + tos/chips/tda5250/HplTda5250DataC.nc | 67 ++ tos/chips/tda5250/HplTda5250DataControl.nc | 29 + tos/interfaces/AdcConfigure.nc | 59 + tos/interfaces/ResourceQueue.nc | 70 ++ tos/interfaces/ResourceRequested.nc | 52 + tos/interfaces/UartByte.nc | 58 + tos/interfaces/UartStream.nc | 101 ++ tos/lib/byte_radio/PacketAck.h | 51 + tos/lib/net/CollectionDebug.nc | 69 ++ tos/lib/net/CollectionDebugMsg.h | 74 ++ tos/lib/net/CollectionId.nc | 47 + tos/lib/net/CollectionIdP.nc | 53 + tos/lib/net/CollectionPacket.nc | 52 + tos/lib/net/NeighborTableEviction.nc | 47 + tos/lib/net/README | 7 + tos/lib/net/RootControl.nc | 44 + tos/lib/net/UARTDebugSenderP.nc | 202 ++++ tos/lib/net/UnicastNameFreeRouting.nc | 54 + tos/lib/net/ctp/.cvsignore | 1 + tos/lib/net/ctp/Collection.h | 40 + tos/lib/net/ctp/CollectionC.nc | 88 ++ tos/lib/net/ctp/CollectionSenderC.nc | 22 + tos/lib/net/ctp/CollectionSenderP.nc | 18 + tos/lib/net/ctp/Ctp.h | 82 ++ tos/lib/net/ctp/CtpCongestion.nc | 15 + tos/lib/net/ctp/CtpDebug.nc | 69 ++ tos/lib/net/ctp/CtpDebugMsg.h | 78 ++ tos/lib/net/ctp/CtpForwardingEngine.h | 118 ++ tos/lib/net/ctp/CtpForwardingEngineP.nc | 1014 +++++++++++++++++ tos/lib/net/ctp/CtpInfo.nc | 86 ++ tos/lib/net/ctp/CtpP.nc | 185 +++ tos/lib/net/ctp/CtpPacket.nc | 70 ++ tos/lib/net/ctp/CtpRoutingEngineP.nc | 780 +++++++++++++ tos/lib/net/ctp/CtpRoutingPacket.nc | 58 + tos/lib/net/ctp/CtpSenderC.nc | 58 + tos/lib/net/ctp/CtpSenderP.nc | 51 + tos/lib/net/ctp/LruCtpMsgCacheC.nc | 47 + tos/lib/net/ctp/LruCtpMsgCacheP.nc | 143 +++ tos/lib/net/ctp/TreeRouting.h | 33 + tos/lib/net/le/LinkEstimator.h | 121 ++ tos/lib/net/le/LinkEstimator.nc | 70 ++ tos/lib/net/le/LinkEstimatorC.nc | 34 + tos/lib/net/le/LinkEstimatorDummyP.nc | 175 +++ tos/lib/net/le/LinkEstimatorP.nc | 741 ++++++++++++ tos/lib/net/le/LinkSrcPacket.nc | 35 + tos/lib/printf/PrintfC.nc | 52 + tos/lib/printf/PrintfFlush.nc | 36 + tos/lib/printf/PrintfP.nc | 164 +++ tos/lib/printf/printf.h | 47 + tos/platforms/eyesIFX/ActiveMessageFilterC.nc | 73 ++ .../eyesIFX/byte_radio/Uart4b6bPhyC.nc | 70 ++ .../eyesIFX/byte_radio/Uart4b6bPhyP.nc | 379 ++++++ .../eyesIFX/byte_radio/UartManchPhyC.nc | 77 ++ .../eyesIFX/byte_radio/UartManchPhyP.nc | 328 ++++++ tos/platforms/eyesIFX/byte_radio/code4b6b.h | 130 +++ .../chips/msp430/Msp430Timer32khzMapC.nc | 73 ++ .../eyesIFX/chips/msp430/Msp430Uart0C.nc | 70 ++ .../eyesIFX/chips/msp430/Msp430Usart0C.nc | 69 ++ .../chips/msp430/Msp430UsartShare0P.nc | 68 ++ .../chips/tda5250/HplTda5250DataIOC.nc | 61 + .../chips/tda5250/HplTda5250DataIOP.nc | 68 ++ .../chips/tda5250/Tda5250ASKNFSKFakePinP.nc | 18 + .../tda5250/tda5250BusResourceSettings.h | 46 + .../eyesIFXv2/chips/at45db/HplAt45dbC.nc | 50 + .../eyesIFXv2/chips/at45db/HplAt45dbP.nc | 69 ++ .../eyesIFXv2/chips/at45db/HplAt45db_chip.h | 45 + .../eyesIFX/sensors/RssiSensorVccP.nc | 99 ++ tos/platforms/intelmote2/BlockStorageC.nc | 57 + tos/platforms/intelmote2/ConfigStorageC.nc | 54 + tos/platforms/intelmote2/LogStorageC.nc | 53 + .../chips/ds2745/DS2745InternalC.nc | 65 ++ .../chips/ds2745/DS2745InternalP.nc | 107 ++ tos/platforms/tinynode/DemoSensorNowC.nc | 60 + tos/platforms/tinynode/DemoSensorStreamC.nc | 57 + tos/platforms/tinynode/VoltageStreamC.nc | 50 + .../tinynode/chips/at45db/HplAt45dbC.nc | 50 + .../tinynode/chips/at45db/HplAt45dbP.nc | 69 ++ .../tinynode/chips/at45db/HplAt45db_chip.h | 45 + tos/system/ArbiterP.nc | 202 ++++ tos/system/FcfsResourceQueueC.nc | 85 ++ tos/system/RoundRobinResourceQueueC.nc | 93 ++ tos/system/SimpleArbiterP.nc | 172 +++ tos/system/SimpleFcfsArbiterC.nc | 94 ++ tos/system/SimpleRoundRobinArbiterC.nc | 94 ++ tos/system/SineSensorC.nc | 45 + tos/system/State.nc | 68 ++ tos/system/StateC.nc | 78 ++ tos/system/StateImplC.nc | 78 ++ tos/system/StateImplP.nc | 138 +++ tos/types/Resource.h | 36 + tos/types/State.h | 44 + 319 files changed, 34399 insertions(+), 45 deletions(-) create mode 100644 apps/BaseStationCC2420/BaseStationC.nc create mode 100644 apps/BaseStationCC2420/BaseStationP.nc create mode 100644 apps/BaseStationCC2420/CC2420ControlP.nc create mode 100644 apps/BaseStationCC2420/Makefile create mode 100644 apps/BaseStationCC2420/README.txt create mode 100644 apps/MViz/.cvsignore create mode 100644 apps/MViz/MViz.h create mode 100644 apps/MViz/MVizAppC.nc create mode 100644 apps/MViz/MVizC.nc create mode 100644 apps/MViz/MVizSensorC.nc create mode 100644 apps/MViz/Makefile create mode 100644 apps/MViz/README.txt create mode 100644 apps/MViz/mote.gif create mode 100644 apps/tests/TestAM/README.txt create mode 100644 apps/tests/TestArbiter/TestFcfsArbiter/TestFcfsArbiterAppC.nc create mode 100644 apps/tests/TestArbiter/TestFcfsArbiter/TestFcfsArbiterC.nc create mode 100644 apps/tests/TestArbiter/TestRoundRobinArbiter/TestRoundRobinArbiterAppC.nc create mode 100644 apps/tests/TestArbiter/TestRoundRobinArbiter/TestRoundRobinArbiterC.nc create mode 100644 apps/tests/TestDissemination/README create mode 100644 apps/tests/TestLPL/Makefile create mode 100644 apps/tests/TestLPL/README.txt create mode 100644 apps/tests/TestLPL/TestLplAppC.nc create mode 100644 apps/tests/TestLPL/TestLplC.nc create mode 100644 apps/tests/TestPrintf/Makefile create mode 100644 apps/tests/TestPrintf/PrintfClient.java create mode 100644 apps/tests/TestPrintf/TestPrintfAppC.nc create mode 100644 apps/tests/TestPrintf/TestPrintfC.nc create mode 100644 apps/tests/TestSharedResource/Makefile create mode 100644 apps/tests/TestSharedResource/README.txt create mode 100644 apps/tests/TestSharedResource/ResourceOperations.nc create mode 100644 apps/tests/TestSharedResource/ResourceP.nc create mode 100644 apps/tests/TestSharedResource/SharedResourceC.nc create mode 100644 apps/tests/TestSharedResource/SharedResourceImplP.nc create mode 100644 apps/tests/TestSharedResource/SharedResourceP.nc create mode 100644 apps/tests/TestSharedResource/TestSharedResourceAppC.nc create mode 100644 apps/tests/TestSharedResource/TestSharedResourceC.nc create mode 100644 apps/tests/TestTrickleTimer/TestTrickle.h create mode 100644 apps/tests/eyesIFX/RadioCountToFlash/Makefile create mode 100644 apps/tests/eyesIFX/RadioCountToFlash/README.txt create mode 100644 apps/tests/eyesIFX/RadioCountToFlash/RadioCountToFlash.h create mode 100644 apps/tests/eyesIFX/RadioCountToFlash/RadioCountToFlashAppC.nc create mode 100644 apps/tests/eyesIFX/RadioCountToFlash/RadioCountToFlashC.nc create mode 100644 apps/tests/eyesIFX/RadioCountToFlash/volumes-at45db.xml create mode 100644 apps/tests/storage/Block/volumes-pxa27xp30.xml create mode 100644 apps/tests/storage/CircularLog/volumes-pxa27xp30.xml create mode 100644 apps/tests/storage/Config/volumes-pxa27xp30.xml create mode 100644 apps/tests/storage/Log/volumes-pxa27xp30.xml create mode 100644 doc/html/porting.html create mode 100644 doc/html/tutorial/img/arbiter_pm_graph.png create mode 100644 doc/html/tutorial/img/mviz.png create mode 100644 doc/html/tutorial/img/shared_resource_graph.png create mode 100644 doc/html/tutorial/lesson10.html create mode 100644 doc/html/tutorial/lesson12.html create mode 100644 doc/html/tutorial/lesson13.html create mode 100644 doc/html/tutorial/lesson7.html create mode 100644 doc/html/tutorial/lesson9.html create mode 100644 doc/pdf/tinyos-programming.pdf create mode 100644 doc/txt/porting.txt create mode 100644 overall-todo.txt create mode 100644 support/sdk/java/net/tinyos/mviz/DDocument.java create mode 100644 support/sdk/java/net/tinyos/mviz/DLayer.java create mode 100644 support/sdk/java/net/tinyos/mviz/DLink.java create mode 100644 support/sdk/java/net/tinyos/mviz/DLinkModel.java create mode 100644 support/sdk/java/net/tinyos/mviz/DLinkModelListener.java create mode 100644 support/sdk/java/net/tinyos/mviz/DMote.java create mode 100644 support/sdk/java/net/tinyos/mviz/DMoteModel.java create mode 100644 support/sdk/java/net/tinyos/mviz/DMoteModelListener.java create mode 100644 support/sdk/java/net/tinyos/mviz/DNavigate.java create mode 100644 support/sdk/java/net/tinyos/mviz/DShape.java create mode 100644 support/sdk/java/net/tinyos/mviz/DShapeModel.java create mode 100644 support/sdk/java/net/tinyos/mviz/DShapeModelListener.java create mode 100644 support/sdk/java/net/tinyos/mviz/DataModel.java create mode 100644 support/sdk/java/net/tinyos/mviz/Makefile create mode 100644 support/sdk/java/net/tinyos/mviz/MessageInput.java create mode 100644 support/sdk/java/net/tinyos/mviz/images/tmote_sky.gif create mode 100644 support/sdk/java/net/tinyos/mviz/images/tmote_sky.jpg create mode 100644 support/sdk/java/net/tinyos/mviz/images/tmote_sky.png create mode 100755 tools/tinyos/misc/tos-mviz create mode 100644 tools/tinyos/misc/tos-mviz.1 create mode 100755 tools/tinyos/misc/tos-storage-pxa27xp30 create mode 100644 tools/tinyos/misc/tos-storage-pxa27xp30.1 create mode 100755 tools/tinyos/misc/tos-storage-pxa27xp30.in create mode 100644 tos/chips/atm128/Atm128Uart0C.nc create mode 100644 tos/chips/atm128/Atm128UartP.nc create mode 100644 tos/chips/atm128/HplAtm128Uart.nc create mode 100644 tos/chips/cc1000_lpl/ByteRadio.nc create mode 100644 tos/chips/cc1000_lpl/CC1000ActiveMessageC.nc create mode 100644 tos/chips/cc1000_lpl/CC1000ActiveMessageP.nc create mode 100644 tos/chips/cc1000_lpl/CC1000Const.h create mode 100644 tos/chips/cc1000_lpl/CC1000Control.nc create mode 100644 tos/chips/cc1000_lpl/CC1000ControlP.nc create mode 100644 tos/chips/cc1000_lpl/CC1000CsmaP.nc create mode 100644 tos/chips/cc1000_lpl/CC1000CsmaRadioC.nc create mode 100644 tos/chips/cc1000_lpl/CC1000LowPowerListening.h create mode 100644 tos/chips/cc1000_lpl/CC1000LowPowerListeningC.nc create mode 100644 tos/chips/cc1000_lpl/CC1000LowPowerListeningP.nc create mode 100644 tos/chips/cc1000_lpl/CC1000Msg.h create mode 100644 tos/chips/cc1000_lpl/CC1000RssiP.nc create mode 100644 tos/chips/cc1000_lpl/CC1000SendReceiveP.nc create mode 100644 tos/chips/cc1000_lpl/CC1000Squelch.nc create mode 100644 tos/chips/cc1000_lpl/CC1000SquelchP.nc create mode 100644 tos/chips/cc1000_lpl/CsmaControl.nc create mode 100644 tos/chips/cc1000_lpl/HplCC1000.nc create mode 100644 tos/chips/cc1000_lpl/HplCC1000Spi.nc create mode 100644 tos/chips/cc1000_lpl/LowPowerListening.nc create mode 100644 tos/chips/cc2420_lpl/AlarmMultiplexC.nc create mode 100644 tos/chips/cc2420_lpl/CC2420.h create mode 100644 tos/chips/cc2420_lpl/CC2420ActiveMessageC.nc create mode 100644 tos/chips/cc2420_lpl/CC2420ActiveMessageP.nc create mode 100644 tos/chips/cc2420_lpl/CC2420Cca.nc create mode 100644 tos/chips/cc2420_lpl/CC2420Config.nc create mode 100644 tos/chips/cc2420_lpl/CC2420ControlC.nc create mode 100644 tos/chips/cc2420_lpl/CC2420ControlP.nc create mode 100644 tos/chips/cc2420_lpl/CC2420CsmaC.nc create mode 100644 tos/chips/cc2420_lpl/CC2420CsmaP.nc create mode 100644 tos/chips/cc2420_lpl/CC2420DutyCycle.h create mode 100644 tos/chips/cc2420_lpl/CC2420DutyCycle.nc create mode 100644 tos/chips/cc2420_lpl/CC2420DutyCycleC.nc create mode 100644 tos/chips/cc2420_lpl/CC2420DutyCycleP.nc create mode 100644 tos/chips/cc2420_lpl/CC2420Fifo.nc create mode 100644 tos/chips/cc2420_lpl/CC2420LowPowerListening.h create mode 100644 tos/chips/cc2420_lpl/CC2420LowPowerListeningC.nc create mode 100644 tos/chips/cc2420_lpl/CC2420LowPowerListeningP.nc create mode 100644 tos/chips/cc2420_lpl/CC2420LplDummyP.nc create mode 100644 tos/chips/cc2420_lpl/CC2420Packet.nc create mode 100644 tos/chips/cc2420_lpl/CC2420PacketC.nc create mode 100644 tos/chips/cc2420_lpl/CC2420Power.nc create mode 100644 tos/chips/cc2420_lpl/CC2420Ram.nc create mode 100644 tos/chips/cc2420_lpl/CC2420Receive.nc create mode 100644 tos/chips/cc2420_lpl/CC2420ReceiveC.nc create mode 100644 tos/chips/cc2420_lpl/CC2420ReceiveP.nc create mode 100644 tos/chips/cc2420_lpl/CC2420Register.nc create mode 100644 tos/chips/cc2420_lpl/CC2420SpiC.nc create mode 100644 tos/chips/cc2420_lpl/CC2420SpiImplP.nc create mode 100644 tos/chips/cc2420_lpl/CC2420SpiP.nc create mode 100644 tos/chips/cc2420_lpl/CC2420Strobe.nc create mode 100644 tos/chips/cc2420_lpl/CC2420Transmit.nc create mode 100644 tos/chips/cc2420_lpl/CC2420TransmitC.nc create mode 100644 tos/chips/cc2420_lpl/CC2420TransmitP.nc create mode 100644 tos/chips/cc2420_lpl/IEEE802154.h create mode 100644 tos/chips/cc2420_lpl/LowPowerListening.nc create mode 100644 tos/chips/ds2745/DS2745.h create mode 100644 tos/chips/ds2745/HplDS2745.nc create mode 100644 tos/chips/ds2745/HplDS2745LogicP.nc create mode 100644 tos/chips/msp430/adc12/AdcP.nc create mode 100644 tos/chips/msp430/adc12/Msp430Adc12ClientAutoDMAC.nc create mode 100644 tos/chips/msp430/adc12/Msp430Adc12ClientAutoDMA_RVGC.nc create mode 100644 tos/chips/msp430/adc12/Msp430Adc12ClientAutoRVGC.nc create mode 100644 tos/chips/msp430/adc12/Msp430Adc12DMAP.nc create mode 100644 tos/chips/msp430/adc12/Msp430Adc12ImplP.nc create mode 100644 tos/chips/msp430/adc12/Msp430RefVoltArbiterImplP.nc create mode 100644 tos/chips/msp430/adc12/README.txt create mode 100644 tos/chips/msp430/timer/Alarm32khz16C.nc create mode 100644 tos/chips/msp430/timer/Alarm32khz32C.nc create mode 100644 tos/chips/msp430/timer/AlarmMilli16C.nc create mode 100644 tos/chips/msp430/timer/AlarmMilli32C.nc create mode 100644 tos/chips/msp430/timer/Counter32khz16C.nc create mode 100644 tos/chips/msp430/timer/Counter32khz32C.nc create mode 100644 tos/chips/msp430/timer/CounterMilli16C.nc create mode 100644 tos/chips/msp430/timer/CounterMilli32C.nc create mode 100644 tos/chips/msp430/usart/HplMsp430I2C.nc create mode 100644 tos/chips/msp430/usart/HplMsp430I2C0C.nc create mode 100644 tos/chips/msp430/usart/HplMsp430I2C0P.nc create mode 100644 tos/chips/msp430/usart/HplMsp430I2CInterrupts.nc create mode 100644 tos/chips/msp430/usart/Msp430I2C0P.nc create mode 100644 tos/chips/msp430/usart/Msp430I2CC.nc create mode 100644 tos/chips/msp430/usart/Msp430I2CConfigure.nc create mode 100644 tos/chips/msp430/usart/Msp430I2CP.nc create mode 100644 tos/chips/msp430/usart/Msp430Spi1C.nc create mode 100644 tos/chips/msp430/usart/Msp430SpiConfigure.nc create mode 100644 tos/chips/msp430/usart/Msp430SpiDma1P.nc create mode 100644 tos/chips/msp430/usart/Msp430SpiNoDma1P.nc create mode 100644 tos/chips/msp430/usart/Msp430Uart0C.nc create mode 100644 tos/chips/msp430/usart/Msp430Uart0P.nc create mode 100644 tos/chips/msp430/usart/Msp430Uart1P.nc create mode 100644 tos/chips/msp430/usart/Msp430UartConfigure.nc create mode 100644 tos/chips/msp430/usart/Msp430UartControl.nc create mode 100644 tos/chips/msp430/usart/Msp430Usart1C.nc create mode 100644 tos/chips/msp430/usart/Msp430UsartShare1P.nc create mode 100644 tos/chips/pxa27x/dma/DMA.h create mode 100644 tos/chips/pxa27x/dma/HalPXA27xDMAChannel.nc create mode 100644 tos/chips/pxa27x/dma/HalPXA27xDMAChannelC.nc create mode 100644 tos/chips/pxa27x/dma/HalPXA27xDMAChannelM.nc create mode 100644 tos/chips/pxa27x/dma/HplPXA27xDMAInfoC.nc create mode 100644 tos/chips/pxa27x/p30/Flash.nc create mode 100644 tos/chips/pxa27x/p30/FlashC.nc create mode 100644 tos/chips/pxa27x/p30/HalP30C.nc create mode 100644 tos/chips/pxa27x/p30/HalP30P.nc create mode 100644 tos/chips/pxa27x/p30/HplP30.nc create mode 100644 tos/chips/pxa27x/p30/HplP30P.nc create mode 100644 tos/chips/pxa27x/p30/P30.h create mode 100644 tos/chips/pxa27x/p30/P30BlockC.nc create mode 100644 tos/chips/pxa27x/p30/P30BlockP.nc create mode 100644 tos/chips/pxa27x/p30/P30ConfigC.nc create mode 100644 tos/chips/pxa27x/p30/P30ConfigP.nc create mode 100644 tos/chips/pxa27x/p30/P30LogC.nc create mode 100644 tos/chips/pxa27x/p30/P30LogCircularP.nc create mode 100644 tos/chips/pxa27x/p30/P30LogP.nc create mode 100644 tos/chips/pxa27x/p30/Storage_chip.h create mode 100644 tos/chips/pxa27x/ssp/HalPXA27xPSPDMAC.nc create mode 100644 tos/chips/pxa27x/ssp/HalPXA27xPSPPioC.nc create mode 100644 tos/chips/pxa27x/ssp/HalPXA27xSSPDMAC.nc create mode 100644 tos/chips/pxa27x/ssp/HalPXA27xSSPPioC.nc create mode 100644 tos/chips/pxa27x/ssp/HalPXA27xSpiDMAC.nc create mode 100644 tos/chips/pxa27x/ssp/HalPXA27xuWireDMAC.nc create mode 100644 tos/chips/pxa27x/ssp/HalPXA27xuWirePioC.nc create mode 100644 tos/chips/pxa27x/timer/HalPXA27xSleep.nc create mode 100644 tos/chips/pxa27x/timer/HalPXA27xSleepC.nc create mode 100644 tos/chips/pxa27x/timer/HalPXA27xSleepM.nc create mode 100644 tos/chips/pxa27x/timer/HalPXA27xWatchdog.nc create mode 100644 tos/chips/pxa27x/timer/HalPXA27xWatchdogC.nc create mode 100644 tos/chips/pxa27x/timer/HalPXA27xWatchdogM.nc create mode 100644 tos/chips/pxa27x/timer/HplPXA27xPower.nc create mode 100644 tos/chips/pxa27x/timer/HplPXA27xPowerM.nc create mode 100644 tos/chips/pxa27x/timer/HplPXA27xRTC.nc create mode 100644 tos/chips/pxa27x/timer/HplPXA27xRTCM.nc create mode 100644 tos/chips/pxa27x/uart/HalPXA27xSerialCntl.nc create mode 100644 tos/chips/pxa27x/uart/HalPXA27xSerialPacket.nc create mode 100644 tos/chips/pxa27x/uart/HplPXA27xBTUARTC.nc create mode 100644 tos/chips/pxa27x/uart/HplPXA27xFFUARTC.nc create mode 100644 tos/chips/pxa27x/uart/HplPXA27xUARTP.nc create mode 100644 tos/chips/pxa27x/uart/PXA27X_UARTREG.h create mode 100644 tos/chips/pxa27x/uart/pxa27x_serial.h create mode 100644 tos/chips/tda5250/HplTda5250DataC.nc create mode 100644 tos/chips/tda5250/HplTda5250DataControl.nc create mode 100644 tos/interfaces/AdcConfigure.nc create mode 100644 tos/interfaces/ResourceQueue.nc create mode 100644 tos/interfaces/ResourceRequested.nc create mode 100644 tos/interfaces/UartByte.nc create mode 100644 tos/interfaces/UartStream.nc create mode 100644 tos/lib/byte_radio/PacketAck.h create mode 100644 tos/lib/net/CollectionDebug.nc create mode 100644 tos/lib/net/CollectionDebugMsg.h create mode 100644 tos/lib/net/CollectionId.nc create mode 100644 tos/lib/net/CollectionIdP.nc create mode 100644 tos/lib/net/CollectionPacket.nc create mode 100644 tos/lib/net/NeighborTableEviction.nc create mode 100644 tos/lib/net/README create mode 100644 tos/lib/net/RootControl.nc create mode 100644 tos/lib/net/UARTDebugSenderP.nc create mode 100644 tos/lib/net/UnicastNameFreeRouting.nc create mode 100644 tos/lib/net/ctp/.cvsignore create mode 100644 tos/lib/net/ctp/Collection.h create mode 100644 tos/lib/net/ctp/CollectionC.nc create mode 100644 tos/lib/net/ctp/CollectionSenderC.nc create mode 100644 tos/lib/net/ctp/CollectionSenderP.nc create mode 100644 tos/lib/net/ctp/Ctp.h create mode 100644 tos/lib/net/ctp/CtpCongestion.nc create mode 100644 tos/lib/net/ctp/CtpDebug.nc create mode 100644 tos/lib/net/ctp/CtpDebugMsg.h create mode 100644 tos/lib/net/ctp/CtpForwardingEngine.h create mode 100644 tos/lib/net/ctp/CtpForwardingEngineP.nc create mode 100644 tos/lib/net/ctp/CtpInfo.nc create mode 100644 tos/lib/net/ctp/CtpP.nc create mode 100644 tos/lib/net/ctp/CtpPacket.nc create mode 100644 tos/lib/net/ctp/CtpRoutingEngineP.nc create mode 100644 tos/lib/net/ctp/CtpRoutingPacket.nc create mode 100644 tos/lib/net/ctp/CtpSenderC.nc create mode 100644 tos/lib/net/ctp/CtpSenderP.nc create mode 100644 tos/lib/net/ctp/LruCtpMsgCacheC.nc create mode 100644 tos/lib/net/ctp/LruCtpMsgCacheP.nc create mode 100644 tos/lib/net/ctp/TreeRouting.h create mode 100644 tos/lib/net/le/LinkEstimator.h create mode 100644 tos/lib/net/le/LinkEstimator.nc create mode 100644 tos/lib/net/le/LinkEstimatorC.nc create mode 100644 tos/lib/net/le/LinkEstimatorDummyP.nc create mode 100644 tos/lib/net/le/LinkEstimatorP.nc create mode 100644 tos/lib/net/le/LinkSrcPacket.nc create mode 100644 tos/lib/printf/PrintfC.nc create mode 100644 tos/lib/printf/PrintfFlush.nc create mode 100644 tos/lib/printf/PrintfP.nc create mode 100644 tos/lib/printf/printf.h create mode 100644 tos/platforms/eyesIFX/ActiveMessageFilterC.nc create mode 100644 tos/platforms/eyesIFX/byte_radio/Uart4b6bPhyC.nc create mode 100644 tos/platforms/eyesIFX/byte_radio/Uart4b6bPhyP.nc create mode 100644 tos/platforms/eyesIFX/byte_radio/UartManchPhyC.nc create mode 100644 tos/platforms/eyesIFX/byte_radio/UartManchPhyP.nc create mode 100644 tos/platforms/eyesIFX/byte_radio/code4b6b.h create mode 100644 tos/platforms/eyesIFX/chips/msp430/Msp430Timer32khzMapC.nc create mode 100644 tos/platforms/eyesIFX/chips/msp430/Msp430Uart0C.nc create mode 100644 tos/platforms/eyesIFX/chips/msp430/Msp430Usart0C.nc create mode 100644 tos/platforms/eyesIFX/chips/msp430/Msp430UsartShare0P.nc create mode 100644 tos/platforms/eyesIFX/chips/tda5250/HplTda5250DataIOC.nc create mode 100644 tos/platforms/eyesIFX/chips/tda5250/HplTda5250DataIOP.nc create mode 100644 tos/platforms/eyesIFX/chips/tda5250/Tda5250ASKNFSKFakePinP.nc create mode 100644 tos/platforms/eyesIFX/chips/tda5250/tda5250BusResourceSettings.h create mode 100644 tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45dbC.nc create mode 100644 tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45dbP.nc create mode 100644 tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45db_chip.h create mode 100644 tos/platforms/eyesIFX/sensors/RssiSensorVccP.nc create mode 100644 tos/platforms/intelmote2/BlockStorageC.nc create mode 100644 tos/platforms/intelmote2/ConfigStorageC.nc create mode 100644 tos/platforms/intelmote2/LogStorageC.nc create mode 100644 tos/platforms/intelmote2/chips/ds2745/DS2745InternalC.nc create mode 100644 tos/platforms/intelmote2/chips/ds2745/DS2745InternalP.nc create mode 100644 tos/platforms/tinynode/DemoSensorNowC.nc create mode 100644 tos/platforms/tinynode/DemoSensorStreamC.nc create mode 100644 tos/platforms/tinynode/VoltageStreamC.nc create mode 100644 tos/platforms/tinynode/chips/at45db/HplAt45dbC.nc create mode 100644 tos/platforms/tinynode/chips/at45db/HplAt45dbP.nc create mode 100644 tos/platforms/tinynode/chips/at45db/HplAt45db_chip.h create mode 100644 tos/system/ArbiterP.nc create mode 100644 tos/system/FcfsResourceQueueC.nc create mode 100644 tos/system/RoundRobinResourceQueueC.nc create mode 100644 tos/system/SimpleArbiterP.nc create mode 100644 tos/system/SimpleFcfsArbiterC.nc create mode 100644 tos/system/SimpleRoundRobinArbiterC.nc create mode 100644 tos/system/SineSensorC.nc create mode 100644 tos/system/State.nc create mode 100644 tos/system/StateC.nc create mode 100644 tos/system/StateImplC.nc create mode 100644 tos/system/StateImplP.nc create mode 100644 tos/types/Resource.h create mode 100644 tos/types/State.h diff --git a/README b/README index c50cc0e8..03dbb4bc 100644 --- a/README +++ b/README @@ -1,44 +1,46 @@ -This contains the TinyOS 2.0 source code as of - -$Date$ - -This tree includes the TinyOS 2.0 documentation in tinyos-2.x/doc; -you can also find the documentation online at: -http://www.tinyos.net/tinyos-2.x/doc/ - -The basic directory structure is as follows: - -apps: Sample TinyOS applications. - tests: Sample TinyOS applications which test a part of the system. - -doc: Documentation - index.html: Index file to all documentation - txt: Text files (TEPs) - html: HTML files (TEPs, installation) - html/tutorial: Tutorials - -support: Non-nesC code for using TinyOS nodes - make: TinyOS make system - sdk: Standard developers kit: serial communication, etc. - c: C SDK (fully supported, but not exhaustively tested yet) - java: Java SDK (fully supported, heavily tested and used) - python: Python SDK (limited, not fully supported) - -tools: TinyOS-specific tools and scripts - platforms: Platform-specific tools - release: Scripts and configurations for packaging release RPMs - tinyos: TinyOS scripts - java: Native support for TinyOS JNI libraries (serial and env) - misc: Assorted utility scripts, begininning with tos- - ncc: The scripts that invoke the nesC compiler: ncc, mig, ncg - -tos: TinyOS source code (nesC, C) - chips: Chip-specific code - interfaces: Core system interfaces - lib: Extensions and larger common subsystems - platforms: Platform-specific code - sensorboards: Sensorboard drivers - system: Core system components - types: Core system data types (header files) - - +This contains the TinyOS 2.0 source code as of + +$Date$ + +This tree includes the TinyOS 2.0 documentation in tinyos-2.x/doc; +you can also find the documentation online at: +http://www.tinyos.net/tinyos-2.x/doc/ + +The basic directory structure is as follows: + +apps: Sample TinyOS applications. + tests: Sample TinyOS applications which test a part of the system. + +doc: Documentation + index.html: Index file to all documentation + txt: Text files (TEPs) + html: HTML files (TEPs, installation) + html/tutorial: Tutorials + +support: Non-nesC code for using TinyOS nodes + make: TinyOS make system + sdk: Standard developers kit: serial communication, etc. + c: C SDK (fully supported, but not exhaustively tested yet) + java: Java SDK (fully supported, heavily tested and used) + python: Python SDK (limited, not fully supported) + +tools: TinyOS-specific tools and scripts + platforms: Platform-specific tools + release: Scripts and configurations for packaging release RPMs + tinyos: TinyOS scripts + java: Native support for TinyOS JNI libraries (serial and env) + misc: Assorted utility scripts, begininning with tos- + ncc: The scripts that invoke the nesC compiler: ncc, mig, ncg + +tos: TinyOS source code (nesC, C) + chips: Chip-specific code + interfaces: Core system interfaces + lib: Extensions and larger common subsystems + platforms: Platform-specific code + sensorboards: Sensorboard drivers + system: Core system components + types: Core system data types (header files) + +You can find documentation for the 2.0.0 release online at: +http://www.tinyos.net/tinyos-2.x/doc/ + diff --git a/apps/BaseStationCC2420/BaseStationC.nc b/apps/BaseStationCC2420/BaseStationC.nc new file mode 100644 index 00000000..016a8b1e --- /dev/null +++ b/apps/BaseStationCC2420/BaseStationC.nc @@ -0,0 +1,89 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2003 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/** + * The TinyOS 2.x base station that forwards packets between the UART + * and radio.It replaces the GenericBase of TinyOS 1.0 and the + * TOSBase of TinyOS 1.1. + * + *

On the serial link, BaseStation sends and receives simple active + * messages (not particular radio packets): on the radio link, it + * sends radio active messages, whose format depends on the network + * stack being used. BaseStation will copy its compiled-in group ID to + * messages moving from the serial link to the radio, and will filter + * out incoming radio messages that do not contain that group ID.

+ * + *

BaseStation includes queues in both directions, with a guarantee + * that once a message enters a queue, it will eventually leave on the + * other interface. The queues allow the BaseStation to handle load + * spikes.

+ * + *

BaseStation acknowledges a message arriving over the serial link + * only if that message was successfully enqueued for delivery to the + * radio link.

+ * + *

The LEDS are programmed to toggle as follows:

+ * + * + * @author Phil Buonadonna + * @author Gilman Tolle + * @author David Gay + * @author Philip Levis + * @date August 10 2005 + */ + +configuration BaseStationC { +} +implementation { + components MainC, BaseStationP, LedsC; + components ActiveMessageC as Radio, SerialActiveMessageC as Serial; + + MainC.Boot <- BaseStationP; + + BaseStationP.RadioControl -> Radio; + BaseStationP.SerialControl -> Serial; + + BaseStationP.UartSend -> Serial; + BaseStationP.UartReceive -> Serial; + BaseStationP.UartPacket -> Serial; + BaseStationP.UartAMPacket -> Serial; + + BaseStationP.RadioSend -> Radio; + BaseStationP.RadioReceive -> Radio.Receive; + BaseStationP.RadioPacket -> Radio; + BaseStationP.RadioAMPacket -> Radio; + + BaseStationP.Leds -> LedsC; +} diff --git a/apps/BaseStationCC2420/BaseStationP.nc b/apps/BaseStationCC2420/BaseStationP.nc new file mode 100644 index 00000000..dd4255a8 --- /dev/null +++ b/apps/BaseStationCC2420/BaseStationP.nc @@ -0,0 +1,278 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. +` * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/* + * @author Phil Buonadonna + * @author Gilman Tolle + * @author David Gay + * Revision: $Id$ + */ + +/* + * BaseStationP bridges packets between a serial channel and the radio. + * Messages moving from serial to radio will be tagged with the group + * ID compiled into the TOSBase, and messages moving from radio to + * serial will be filtered by that same group id. + */ + +#include "AM.h" +#include "Serial.h" + +module BaseStationP { + uses { + interface Boot; + interface SplitControl as SerialControl; + interface SplitControl as RadioControl; + + interface AMSend as UartSend[am_id_t id]; + interface Receive as UartReceive[am_id_t id]; + interface Packet as UartPacket; + interface AMPacket as UartAMPacket; + + interface AMSend as RadioSend[am_id_t id]; + interface Receive as RadioReceive[am_id_t id]; + interface Packet as RadioPacket; + interface AMPacket as RadioAMPacket; + + interface Leds; + } +} + +implementation +{ + enum { + UART_QUEUE_LEN = 12, + RADIO_QUEUE_LEN = 12, + }; + + message_t uartQueueBufs[UART_QUEUE_LEN]; + message_t *uartQueue[UART_QUEUE_LEN]; + uint8_t uartIn, uartOut; + bool uartBusy, uartFull; + + message_t radioQueueBufs[RADIO_QUEUE_LEN]; + message_t *radioQueue[RADIO_QUEUE_LEN]; + uint8_t radioIn, radioOut; + bool radioBusy, radioFull; + + task void uartSendTask(); + task void radioSendTask(); + + void dropBlink() { + call Leds.led2Toggle(); + } + + void failBlink() { + call Leds.led2Toggle(); + } + + event void Boot.booted() { + uint8_t i; + + for (i = 0; i < UART_QUEUE_LEN; i++) + uartQueue[i] = &uartQueueBufs[i]; + uartIn = uartOut = 0; + uartBusy = FALSE; + uartFull = TRUE; + + for (i = 0; i < RADIO_QUEUE_LEN; i++) + radioQueue[i] = &radioQueueBufs[i]; + radioIn = radioOut = 0; + radioBusy = FALSE; + radioFull = TRUE; + + call RadioControl.start(); + call SerialControl.start(); + } + + event void RadioControl.startDone(error_t error) { + if (error == SUCCESS) { + radioFull = FALSE; + } + } + + event void SerialControl.startDone(error_t error) { + if (error == SUCCESS) { + uartFull = FALSE; + } + } + + event void SerialControl.stopDone(error_t error) {} + event void RadioControl.stopDone(error_t error) {} + + uint8_t count = 0; + event message_t *RadioReceive.receive[am_id_t id](message_t *msg, + void *payload, + uint8_t len) { + message_t *ret = msg; + + atomic { + if (!uartFull) + { + ret = uartQueue[uartIn]; + uartQueue[uartIn] = msg; + + uartIn = (uartIn + 1) % UART_QUEUE_LEN; + + if (uartIn == uartOut) + uartFull = TRUE; + + if (!uartBusy) + { + post uartSendTask(); + uartBusy = TRUE; + } + } + else + dropBlink(); + } + + return ret; + } + + uint8_t tmpLen; + + task void uartSendTask() { + uint8_t len; + am_id_t id; + am_addr_t addr; + message_t* msg; + atomic + if (uartIn == uartOut && !uartFull) + { + uartBusy = FALSE; + return; + } + + msg = uartQueue[uartOut]; + tmpLen = len = call RadioPacket.payloadLength(msg); + id = call RadioAMPacket.type(msg); + addr = call RadioAMPacket.destination(msg); + + if (call UartSend.send[id](addr, uartQueue[uartOut], len) == SUCCESS) + call Leds.led1Toggle(); + else + { + failBlink(); + post uartSendTask(); + } + } + + event void UartSend.sendDone[am_id_t id](message_t* msg, error_t error) { + if (error != SUCCESS) + failBlink(); + else + atomic + if (msg == uartQueue[uartOut]) + { + if (++uartOut >= UART_QUEUE_LEN) + uartOut = 0; + if (uartFull) + uartFull = FALSE; + } + post uartSendTask(); + } + + event message_t *UartReceive.receive[am_id_t id](message_t *msg, + void *payload, + uint8_t len) { + message_t *ret = msg; + bool reflectToken = FALSE; + + atomic + if (!radioFull) + { + reflectToken = TRUE; + ret = radioQueue[radioIn]; + radioQueue[radioIn] = msg; + if (++radioIn >= RADIO_QUEUE_LEN) + radioIn = 0; + if (radioIn == radioOut) + radioFull = TRUE; + + if (!radioBusy) + { + post radioSendTask(); + radioBusy = TRUE; + } + } + else + dropBlink(); + + if (reflectToken) { + //call UartTokenReceive.ReflectToken(Token); + } + + return ret; + } + + task void radioSendTask() { + uint8_t len; + am_id_t id; + am_addr_t addr; + message_t* msg; + + atomic + if (radioIn == radioOut && !radioFull) + { + radioBusy = FALSE; + return; + } + + msg = radioQueue[radioOut]; + len = call UartPacket.payloadLength(msg); + addr = call UartAMPacket.destination(msg); + id = call UartAMPacket.type(msg); + if (call RadioSend.send[id](addr, msg, len) == SUCCESS) + call Leds.led0Toggle(); + else + { + failBlink(); + post radioSendTask(); + } + } + + event void RadioSend.sendDone[am_id_t id](message_t* msg, error_t error) { + if (error != SUCCESS) + failBlink(); + else + atomic + if (msg == radioQueue[radioOut]) + { + if (++radioOut >= RADIO_QUEUE_LEN) + radioOut = 0; + if (radioFull) + radioFull = FALSE; + } + + post radioSendTask(); + } +} diff --git a/apps/BaseStationCC2420/CC2420ControlP.nc b/apps/BaseStationCC2420/CC2420ControlP.nc new file mode 100644 index 00000000..fc0c0cec --- /dev/null +++ b/apps/BaseStationCC2420/CC2420ControlP.nc @@ -0,0 +1,284 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include "Timer.h" + +module CC2420ControlP { + + provides interface Init; + provides interface Resource; + provides interface CC2420Config; + provides interface CC2420Power; + + uses interface Alarm as StartupTimer; + uses interface GeneralIO as CSN; + uses interface GeneralIO as RSTN; + uses interface GeneralIO as VREN; + uses interface GpioInterrupt as InterruptCCA; + + uses interface Resource as SpiResource; + uses interface CC2420Ram as PANID; + uses interface CC2420Register as FSCTRL; + uses interface CC2420Register as IOCFG0; + uses interface CC2420Register as IOCFG1; + uses interface CC2420Register as MDMCTRL0; + uses interface CC2420Register as MDMCTRL1; + uses interface CC2420Strobe as SRXON; + uses interface CC2420Strobe as SRFOFF; + uses interface CC2420Strobe as SXOSCOFF; + uses interface CC2420Strobe as SXOSCON; + uses interface AMPacket; + + uses interface Resource as SyncResource; + + uses interface Leds; + +} + +implementation { + + typedef enum { + S_VREG_STOPPED, + S_VREG_STARTING, + S_VREG_STARTED, + S_XOSC_STARTING, + S_XOSC_STARTED, + } cc2420_control_state_t; + + uint8_t channel = CC2420_DEF_CHANNEL; + uint8_t txPower = CC2420_DEF_RFPOWER; + uint16_t pan = TOS_AM_GROUP; + uint16_t shortAddress; + bool syncBusy; + task void syncDoneTask(); + + norace cc2420_control_state_t state = S_VREG_STOPPED; + + command error_t Init.init() { + call CSN.makeOutput(); + call RSTN.makeOutput(); + call VREN.makeOutput(); + shortAddress = call AMPacket.address(); + return SUCCESS; + } + + async command error_t Resource.immediateRequest() { + error_t error = call SpiResource.immediateRequest(); + if ( error == SUCCESS ) + call CSN.clr(); + return error; + } + + async command error_t Resource.request() { + return call SpiResource.request(); + } + + async command uint8_t Resource.isOwner() { + return call SpiResource.isOwner(); + } + + async command error_t Resource.release() { + atomic { + call CSN.set(); + return call SpiResource.release(); + } + } + + event void SpiResource.granted() { + call CSN.clr(); + signal Resource.granted(); + } + + async command error_t CC2420Power.startVReg() { + atomic { + if ( state != S_VREG_STOPPED ) + return FAIL; + state = S_VREG_STARTING; + } + call VREN.set(); + call StartupTimer.start( CC2420_TIME_VREN ); + return SUCCESS; + } + + async event void StartupTimer.fired() { + if ( state == S_VREG_STARTING ) { + state = S_VREG_STARTED; + call RSTN.clr(); + call RSTN.set(); + signal CC2420Power.startVRegDone(); + } + } + + async command error_t CC2420Power.stopVReg() { + state = S_VREG_STOPPED; + call RSTN.clr(); + call VREN.clr(); + call RSTN.set(); + return SUCCESS; + } + + async command error_t CC2420Power.startOscillator() { + atomic { + if ( state != S_VREG_STARTED ) + return FAIL; + + state = S_XOSC_STARTING; + call IOCFG1.write( CC2420_SFDMUX_XOSC16M_STABLE << + CC2420_IOCFG1_CCAMUX ); + call InterruptCCA.enableRisingEdge(); + call SXOSCON.strobe(); + call IOCFG0.write( ( 1 << CC2420_IOCFG0_FIFOP_POLARITY ) | + ( 127 << CC2420_IOCFG0_FIFOP_THR ) ); + call FSCTRL.write( ( 1 << CC2420_FSCTRL_LOCK_THR ) | + ( ( (channel - 11)*5+357 ) + << CC2420_FSCTRL_FREQ ) ); + call MDMCTRL0.write( ( 1 << CC2420_MDMCTRL0_RESERVED_FRAME_MODE ) | + ( 2 << CC2420_MDMCTRL0_CCA_HYST ) | + ( 3 << CC2420_MDMCTRL0_CCA_MOD ) | + ( 1 << CC2420_MDMCTRL0_AUTOCRC ) | + ( 2 << CC2420_MDMCTRL0_PREAMBLE_LENGTH ) ); + } + return SUCCESS; + } + + async event void InterruptCCA.fired() { + nxle_uint16_t id[ 2 ]; + state = S_XOSC_STARTED; + id[ 0 ] = pan; + id[ 1 ] = shortAddress; + call InterruptCCA.disable(); + call IOCFG1.write( 0 ); + call PANID.write( 0, (uint8_t*)&id, 4 ); + call CSN.set(); + call CSN.clr(); + signal CC2420Power.startOscillatorDone(); + } + + async command error_t CC2420Power.stopOscillator() { + atomic { + if ( state != S_XOSC_STARTED ) + return FAIL; + state = S_VREG_STARTED; + call SXOSCOFF.strobe(); + } + return SUCCESS; + } + + async command error_t CC2420Power.rxOn() { + atomic { + if ( state != S_XOSC_STARTED ) + return FAIL; + call SRXON.strobe(); + } + return SUCCESS; + } + + async command error_t CC2420Power.rfOff() { + atomic { + if ( state != S_XOSC_STARTED ) + return FAIL; + call SRFOFF.strobe(); + } + return SUCCESS; + } + + command uint8_t CC2420Config.getChannel() { + atomic return channel; + } + + command void CC2420Config.setChannel( uint8_t chan ) { + atomic channel = chan; + } + + command uint16_t CC2420Config.getShortAddr() { + atomic return shortAddress; + } + + command void CC2420Config.setShortAddr( uint16_t addr ) { + atomic shortAddress = addr; + } + + command uint16_t CC2420Config.getPanAddr() { + return pan; + } + + command void CC2420Config.setPanAddr( uint16_t p ) { + atomic pan = p; + } + + command error_t CC2420Config.sync() { + atomic { + if ( syncBusy ) + return FAIL; + syncBusy = TRUE; + if ( state == S_XOSC_STARTED ) + call SyncResource.request(); + else + post syncDoneTask(); + } + return SUCCESS; + } + + event void SyncResource.granted() { + + nxle_uint16_t id[ 2 ]; + uint8_t chan; + + atomic { + chan = channel; + id[ 0 ] = pan; + id[ 1 ] = shortAddress; + } + + call CSN.clr(); + call FSCTRL.write( ( 1 << CC2420_FSCTRL_LOCK_THR ) | + ( ( (chan - 11)*5+357 ) << CC2420_FSCTRL_FREQ ) ); + call PANID.write( 0, (uint8_t*)id, sizeof( id ) ); + call CSN.set(); + call SyncResource.release(); + + post syncDoneTask(); + + } + + task void syncDoneTask() { + atomic syncBusy = FALSE; + signal CC2420Config.syncDone( SUCCESS ); + } + + default event void CC2420Config.syncDone( error_t error ) {} + +} diff --git a/apps/BaseStationCC2420/Makefile b/apps/BaseStationCC2420/Makefile new file mode 100644 index 00000000..3e098f4c --- /dev/null +++ b/apps/BaseStationCC2420/Makefile @@ -0,0 +1,3 @@ +COMPONENT=BaseStationC +include $(MAKERULES) + diff --git a/apps/BaseStationCC2420/README.txt b/apps/BaseStationCC2420/README.txt new file mode 100644 index 00000000..3961a148 --- /dev/null +++ b/apps/BaseStationCC2420/README.txt @@ -0,0 +1,40 @@ +README for BaseStationCC2420 +Author/Contact: tinyos-help@millennium.berkeley.edu + +Description: + +BaseStation is an application that acts as a simple Active Message +bridge between the serial and radio links. It replaces the GenericBase +of TinyOS 1.0 and the TOSBase of TinyOS 1.1. This base station +is for CC2420-based platforms (e.g., micaz, telos). + +On the serial link, BaseStation sends and receives simple active +messages (not particular radio packets): on the radio link, it sends +radio active messages, whose format depends on the network stack being +used. BaseStation will copy its compiled-in group ID to messages +moving from the serial link to the radio, and will filter out incoming +radio messages that do not contain that group ID. + +BaseStation includes queues in both directions, with a guarantee that +once a message enters a queue, it will eventually leave on the other +interface. The queues allow the BaseStation to handle load spikes more +gracefully. + +BaseStation acknowledges a message arriving over the serial link only if +that message was successfully enqueued for delivery to the radio link. + +The LEDS are programmed to toggle as follows: + +RED Toggle - Message bridged from serial to radio +GREEN Toggle - Message bridged from radio to serial +YELLOW/BLUE Toggle - Dropped message due to queue overflow + in either direction + +Tools: + +tools/java/net/tinyos/sf/SerialForwarder. + +See doc/serialcomm/index.html for more information using these tools. + + + diff --git a/apps/MViz/.cvsignore b/apps/MViz/.cvsignore new file mode 100644 index 00000000..040264a0 --- /dev/null +++ b/apps/MViz/.cvsignore @@ -0,0 +1 @@ +build .*.swp diff --git a/apps/MViz/MViz.h b/apps/MViz/MViz.h new file mode 100644 index 00000000..82b60d2e --- /dev/null +++ b/apps/MViz/MViz.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2006 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/** + * @author David Gay + * @author Kyle Jamieson + * @author Phil Levis + */ + +#ifndef MVIZ_H +#define MVIZ_H + +#include "AM.h" + +enum { + /* Default sampling period. */ + DEFAULT_INTERVAL = 1024, + AM_MVIZ_MSG = 0x93 +}; + +typedef nx_struct mviz_msg { + nx_uint16_t version; /* Version of the interval. */ + nx_uint16_t interval; /* Samping period. */ + nx_uint16_t origin; /* Mote id of sending mote. */ + nx_uint16_t count; /* The readings are samples count * NREADINGS onwards */ + nx_uint16_t reading; + nx_uint16_t etx; + nx_uint16_t link_route_value; + nx_am_addr_t link_route_addr; +} mviz_msg_t; + +#endif diff --git a/apps/MViz/MVizAppC.nc b/apps/MViz/MVizAppC.nc new file mode 100644 index 00000000..56847e21 --- /dev/null +++ b/apps/MViz/MVizAppC.nc @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2006 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/** + * MViz demo application using the collection layer. + * See README.txt file in this directory and TEP 119: Collection. + * + * @author David Gay + * @author Kyle Jamieson + * @author Philip Levis + */ + +#include + +configuration MVizAppC { } +implementation { + components MainC, MVizC, LedsC, new TimerMilliC(), + new MVizSensorC() as Sensor, RandomC; + + //MainC.SoftwareInit -> Sensor; + + MVizC.Boot -> MainC; + MVizC.Timer -> TimerMilliC; + MVizC.Read -> Sensor; + MVizC.Leds -> LedsC; + MVizC.Random -> RandomC; + // + // Communication components. These are documented in TEP 113: + // Serial Communication, and TEP 119: Collection. + // + components CollectionC as Collector, // Collection layer + ActiveMessageC, // AM layer + new CollectionSenderC(AM_MVIZ_MSG), // Sends multihop RF + SerialActiveMessageC, // Serial messaging + new SerialAMSenderC(AM_MVIZ_MSG); // Sends to the serial port + + components CtpP as Ctp; + + MVizC.RadioControl -> ActiveMessageC; + MVizC.SerialControl -> SerialActiveMessageC; + MVizC.RoutingControl -> Collector; + + MVizC.Send -> CollectionSenderC; + MVizC.SerialSend -> SerialAMSenderC.AMSend; + MVizC.Snoop -> Collector.Snoop[AM_MVIZ_MSG]; + MVizC.Receive -> Collector.Receive[AM_MVIZ_MSG]; + MVizC.RootControl -> Collector; + MVizC.CtpInfo -> Ctp; + MVizC.LinkEstimator -> Ctp; + +} diff --git a/apps/MViz/MVizC.nc b/apps/MViz/MVizC.nc new file mode 100644 index 00000000..6719d8f0 --- /dev/null +++ b/apps/MViz/MVizC.nc @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2006 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/** + * MViz demo application using the collection layer. + * See README.txt file in this directory and TEP 119: Collection. + * + * @author David Gay + * @author Kyle Jamieson + * @author Philip Levis + */ + +#include "MViz.h" + +module MVizC { + uses { + // Interfaces for initialization: + interface Boot; + interface SplitControl as RadioControl; + interface SplitControl as SerialControl; + interface StdControl as RoutingControl; + + // Interfaces for communication, multihop and serial: + interface Send; + interface Receive as Snoop; + interface Receive; + interface AMSend as SerialSend; + interface CollectionPacket; + interface RootControl; + + // Miscalleny: + interface Timer; + interface Read; + interface Leds; + interface CtpInfo; + interface LinkEstimator; + interface Random; + } +} + +implementation { + task void uartSendTask(); + static void startTimer(); + static void fatal_problem(); + static void report_problem(); + static void report_sent(); + static void report_received(); + + uint8_t uartlen; + message_t sendbuf; + message_t uartbuf; + bool sendbusy=FALSE, uartbusy=FALSE; + + /* Current local state - interval, version and accumulated readings */ + mviz_msg_t local; + + uint8_t reading; /* 0 to NREADINGS */ + + /* When we head an Oscilloscope message, we check it's sample count. If + it's ahead of ours, we "jump" forwards (set our count to the received + count). However, we must then suppress our next count increment. This + is a very simple form of "time" synchronization (for an abstract + notion of time). */ + bool suppress_count_change; + + // + // On bootup, initialize radio and serial communications, and our + // own state variables. + // + event void Boot.booted() { + local.interval = DEFAULT_INTERVAL; + local.origin = TOS_NODE_ID; + + // Beginning our initialization phases: + if (call RadioControl.start() != SUCCESS) + fatal_problem(); + + if (call RoutingControl.start() != SUCCESS) + fatal_problem(); + } + + event void RadioControl.startDone(error_t error) { + if (error != SUCCESS) + fatal_problem(); + + if (sizeof(local) > call Send.maxPayloadLength()) + fatal_problem(); + + if (call SerialControl.start() != SUCCESS) + fatal_problem(); + } + + event void SerialControl.startDone(error_t error) { + if (error != SUCCESS) + fatal_problem(); + + // This is how to set yourself as a root to the collection layer: + if (local.origin % 500 == 0) + call RootControl.setRoot(); + + startTimer(); + } + + static void startTimer() { + call Timer.startPeriodic(local.interval); + reading = 0; + } + + event void RadioControl.stopDone(error_t error) { } + event void SerialControl.stopDone(error_t error) { } + + // + // Only the root will receive messages from this interface; its job + // is to forward them to the serial uart for processing on the pc + // connected to the sensor network. + // + event message_t* + Receive.receive(message_t* msg, void *payload, uint8_t len) { + if (uartbusy == FALSE) { + mviz_msg_t* in = (mviz_msg_t*)payload; + mviz_msg_t* out = (mviz_msg_t*)call SerialSend.getPayload(&uartbuf); + if (len != sizeof(mviz_msg_t)) { + return msg; + } + else { + memcpy(out, in, sizeof(mviz_msg_t)); + } + uartbusy = TRUE; + uartlen = sizeof(mviz_msg_t); + post uartSendTask(); + } + + return msg; + } + + task void uartSendTask() { + if (call SerialSend.send(0xffff, &uartbuf, uartlen) != SUCCESS) { + uartbusy = FALSE; + } + } + // + // Overhearing other traffic in the network. + // + event message_t* + Snoop.receive(message_t* msg, void* payload, uint8_t len) { + mviz_msg_t *omsg = payload; + + report_received(); + + // If we receive a newer version, update our interval. + if (omsg->version > local.version) { + local.version = omsg->version; + local.interval = omsg->interval; + startTimer(); + } + + // If we hear from a future count, jump ahead but suppress our own + // change. + if (omsg->count > local.count) { + local.count = omsg->count; + suppress_count_change = TRUE; + } + + return msg; + } + + /* At each sample period: + - if local sample buffer is full, send accumulated samples + - read next sample + */ + event void Timer.fired() { + if (!sendbusy) { + mviz_msg_t *o = (mviz_msg_t *)call Send.getPayload(&sendbuf); + memcpy(o, &local, sizeof(local)); + if (call Send.send(&sendbuf, sizeof(local)) == SUCCESS) + sendbusy = TRUE; + else + report_problem(); + } + + reading = 0; + /* Part 2 of cheap "time sync": increment our count if we didn't + jump ahead. */ + if (!suppress_count_change) + local.count++; + suppress_count_change = FALSE; + call Timer.stop(); + call Timer.startPeriodic(local.interval); + if (call Read.read() != SUCCESS) + fatal_problem(); + } + + event void Send.sendDone(message_t* msg, error_t error) { + if (error == SUCCESS) + report_sent(); + else + report_problem(); + + sendbusy = FALSE; + } + + event void Read.readDone(error_t result, uint16_t data) { + uint16_t val; + if (result != SUCCESS) { + data = 0xffff; + report_problem(); + } + local.reading = data; + call CtpInfo.getEtx(&val); + local.link_route_value = val; + call CtpInfo.getParent(&val); + local.link_route_addr = val; + local.link_route_value = call LinkEstimator.getLinkQuality(local.link_route_addr); + } + event void LinkEstimator.evicted(am_addr_t addr){} + + event void SerialSend.sendDone(message_t *msg, error_t error) { + uartbusy = FALSE; + } + + // Use LEDs to report various status issues. + static void fatal_problem() { + call Leds.led0On(); + call Leds.led1On(); + call Leds.led2On(); + call Timer.stop(); + } + + static void report_problem() { call Leds.led0Toggle(); } + static void report_sent() { call Leds.led1Toggle(); } + static void report_received() { call Leds.led2Toggle(); } +} diff --git a/apps/MViz/MVizSensorC.nc b/apps/MViz/MVizSensorC.nc new file mode 100644 index 00000000..10e96c3a --- /dev/null +++ b/apps/MViz/MVizSensorC.nc @@ -0,0 +1,16 @@ +/** + * The default sensor for MViz is a simple sine wave. + * + * @author Philip Levis + */ + +generic configuration MVizSensorC() +{ + provides interface Read; +} +implementation +{ + components new SineSensorC() as DemoChannel; + + Read = DemoChannel; +} diff --git a/apps/MViz/Makefile b/apps/MViz/Makefile new file mode 100644 index 00000000..9756b234 --- /dev/null +++ b/apps/MViz/Makefile @@ -0,0 +1,11 @@ +COMPONENT=MVizAppC +CFLAGS += -I$(TOSDIR)/lib/net/ -I$(TOSDIR)/lib/net/ctp -I$(TOSDIR)/lib/net/le -I. +BUILD_EXTRA_DEPS = MVizMsg.class + +MVizMsg.java: MViz.h + mig -target=null -java-classname=MVizMsg java MViz.h mviz_msg -o $@ + +MVizMsg.class: MVizMsg.java + javac MVizMsg.java + +include $(MAKERULES) diff --git a/apps/MViz/README.txt b/apps/MViz/README.txt new file mode 100644 index 00000000..a9df8794 --- /dev/null +++ b/apps/MViz/README.txt @@ -0,0 +1,41 @@ +README for MViz +Author/Contact: tinyos-help@millennium.berkeley.edu + +Description: + +MViz is a sample application for the MViz network visualization tool. The MViz +application is a multihop collection network. Nodes whose (ID % 500) == 0 are +collection roots. The application samples a platform's DemoSensorC and routes +those values to the collection roots. The roots send the packets to the serial +port, which the MViz java application then visualizes. + +To run this application, install the TinyOS application on several nodes, one +of whom is a root. Then run the tos-mviz script with MVizMsg as a parameter: + +tos-mviz [-comm source] MVizMsg + +This will cause the MViz java tool to parse the fields of MVizMsg and make +them displayable. As nodes send readings to the base station, they will be +displayed in the GUI. + +By default, the TinyOS program uses an artificial demonstration sensor that +just generates a sine wave (MVizSensorC). To change the sensor that +the MViz application uses, change the wiring in MVizAppC to your sensor +of choice. + +Tools: + +The Java application lives in support/sdk/java/net/tinyos/mviz. It is +invoked by the tos-mviz script, which is part of a TinyOS tools distribution. +The top-level Java class is net.tinyos.mviz.DDocument. To display a mote image, +the tool looks for a mote.gif in either the local directory (default) or a +directory specified with the -dir parameter. + +Known bugs/limitations: + +Under Ubuntu Linux, the MViz Java visualization can be painfully slow. + +Notes: + +MViz configures a mote whose TOS_NODE_ID modulo 500 is zero to be a +collection root. diff --git a/apps/MViz/mote.gif b/apps/MViz/mote.gif new file mode 100644 index 0000000000000000000000000000000000000000..bfb252dc77781c3ab639ebdba0b7f0d64ee08bec GIT binary patch literal 2141 zcmV-j2%`5#Nk%w1VJHA60O$Vz6B!>DAtoIuE*~i>9xo&&Dl8r^E)z8}BrY!_EjSu8 zF&;B5CoeS#Jw7NiGZ{KJ7d$j1HZ>gw0Ogk((KPfv! zCOx@uTTCivR7P1?A8lDtRZ>w`O+Q~)Rar_=TT2{s zUOQz~Nncn_T~{}1SVUx1R$Ev|VP8#OUOH)BP+?C`VpdaMUuIiNRbp2)a$iVjVO(HW zRb*dMWn^GuQc-AOTw`BcW>!LRVrFAjPHkjTY-(6+T2*XhS!-)pZed?)Yb=FmP;zcw zZD(p~Tx4r!Y-?CfdSgs`X?$o@Ty$+^ab{z5Vq0}{U~_VBZf0$8Vrp|=YjI~}bZ&uY zVOV;0b8c;Fb8tn6Y-D(BcynNXZ)IzEZDM+Pa%^*VXl;0Swpvwmc5`}nX?S;U zZG3igdU0xgeP)4vbbf8bSz2;}ZgzfpbANzkhwfX>*H%fQ5&Chk}EJf{KHDiG_HCihzcTdV!9Dcaw#Jj){tliFuZdgOQQ0fq99K zlVzihhLn$$kbIGoki>y|kDHvOnTMaAmZPDcr=pOPsidB$oT8U9NxyQ!0$;iLb%EQ{y%huJ*)ZN_CX>@2HRA^-&M@dak03rDV0SW;B04x9i001ZeCjbBl z{s8|897wRB!Gj1BDjb-pld4GzBPLwrNJ|zbTbS5bVWf{8i6FH=L2=*#h!QC{Oo-6q z!iqk&KqAaS0Rj{iF|OcvF+<4=B7PnmFv5$BCYb|CwYczM0TN(1eE3jOWX203c*Ml$ z5vh-_MMx7Z3gP5Xol7N3D3L04h7VwCxKI&Phtw!oAUjlnqeBQGBr;N!n7Y=-iyTUj z?P4_Tk`W_JrbLVsxGAuWE!&f3)_^vU@W9)+vGzb9b2M~aN1W?8_!O1e^h;c##EL?z>K~(^P1tDh$ z!U-;75aY)T-6fzQ1{}Un1QJhxLP#M_>~RVNamW%(L6)#$%{bp=bBi$ANOFu-y5Zmf z4kCzv!v-(Jz(pM;NFYTXoIHR+9MlxVizTE$(+e%8prQ>IPtf3l1|E2TftMJFuz?2} z&`<{h0u&*}Aq%MBg&A`Yl!g~6kTQ%iRgP1L5ZG~u!3!Rk@WKlsXg~r80~8>D0W=`- z01a)7a+E+F{Ln)L%{+5UEw!983l=_*pn(V`go%R*CU~%c1{^rBodW(r>~aJLZAg>J zKrMt}hziIcqYXBGtRo2*G-zO~2qci;L9!xPumK4rEa8J5V4Pyb0Vwpb!az(wV~aP{ zaG^&bON^5W7BOsq!Kgg)IHm<6)F25Sl6+V^oT(TGvFc#D7s*gM+XY9V#o^H2y_7zoghI79gUO{!7P4IQNpn}jM}52 z7?AK*Jnodkj3f^zAj>E$g#3>cSk&SSF?2-oN*!&~L5B<$kU6TLfqq%D7z&Ia12)M( zpaB+rTrdz2iToiBG1pMD%p-msBE!P){+R0As!AaVBtbMH2L1~!ba6xy1Cf!&GrUwX z#u$&#@xvjUATg?;3~!LC2O?mwK@n1{v4ajgMA3y4L#ROz4}(0G#v7m@^T;D($Uwpd z3_sqZs>v21i7lb zBZfK8`E!j81&z^xD6K^DNFMI^flXY|w$TO}h)6PvFwR(0$0Jgx^G*@rFlqLLc{Nhdks_k9O2h9{Z?AGe7}_N~~cJ{=YB)1%PLe5JbTbsSw94>c9n8 z_|rZphq7J0EbQ(;0b$> zh!rRx1wF_B6v;3LIX2OaZb*X^gW!cMFwqKW{6Gjjc*FzBfRryZ0Sn;JLo+Nvj!x9! z5NBA!ARN)w0z=kw1@e3|Up%mA^j1EX42nY;O5zHLO7g#`n zE<|A!QE0>tAh8A=j9>y|U_u7S5QuOZWCctnxWf=GKmi!Qzy&Pm!W|URM|&2;4r-V} T7Lu@shAQF?292mh0s;U#Xc9iX literal 0 HcmV?d00001 diff --git a/apps/tests/TestAM/README.txt b/apps/tests/TestAM/README.txt new file mode 100644 index 00000000..c3248eb3 --- /dev/null +++ b/apps/tests/TestAM/README.txt @@ -0,0 +1,19 @@ +README for TestAM +Author/Contact: tinyos-help@millennium.berkeley.edu + +Description: + +TestAM sends active message broadcasts at 1Hz and blinks LED 0 whenever +it has sucessfully sent a broadcast. Whenever it receives one of these +broadcasts from another node, it blinks LED 1. It uses the radio HIL +component ActiveMessageC, and its packets are AM type 240. This application +is useful for testing AM communication and the ActiveMessageC component. + +Tools: + +None. + +Known bugs/limitations: + +None. + diff --git a/apps/tests/TestArbiter/TestFcfsArbiter/TestFcfsArbiterAppC.nc b/apps/tests/TestArbiter/TestFcfsArbiter/TestFcfsArbiterAppC.nc new file mode 100644 index 00000000..aa897643 --- /dev/null +++ b/apps/tests/TestArbiter/TestFcfsArbiter/TestFcfsArbiterAppC.nc @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2004, Technische Universitat Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitat Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Please refer to TEP 108 for more information about the components + * this application is used to test.

+ * + * This application is used to test the functionality of the + * FcfsArbiter component developed using the Resource + * interface. Three Resource users are created and all three request + * control of the resource before any one of them is granted it. + * Once the first user is granted control of the resource, a timer + * is set to allow this user to have control of it for a specific + * amount of time. Once this timer expires, the resource is released + * and then immediately requested again. Upon releasing the resource + * control will be granted to the next user that has + * requested it in FCFS order. Initial requests are made + * by the three resource users in the following order
+ *
  • Resource 0 + *
  • Resource 2 + *
  • Resource 1 + *
    + * It is expected then that using a first-come-first-serve policy, control of the + * resource will be granted in the order of 0,2,1 and the Leds + * corresponding to each resource will flash whenever this occurs.
    + *
  • Led 0 -> Resource 0 + *
  • Led 1 -> Resource 1 + *
  • Led 2 -> Resource 2 + *
    + * + * @author Kevin Klues + * @version $Revision$ + * @date $Date$ + */ + +#define TEST_ARBITER_RESOURCE "Test.Arbiter.Resource" +configuration TestFcfsArbiterAppC{ +} +implementation { + components MainC, TestFcfsArbiterC as App,LedsC, + new TimerMilliC() as Timer0, + new TimerMilliC() as Timer1, + new TimerMilliC() as Timer2, + new FcfsArbiterC(TEST_ARBITER_RESOURCE) as Arbiter; + + enum { + RESOURCE0_ID = unique(TEST_ARBITER_RESOURCE), + RESOURCE1_ID = unique(TEST_ARBITER_RESOURCE), + RESOURCE2_ID = unique(TEST_ARBITER_RESOURCE), + }; + + App -> MainC.Boot; + + App.Resource0 -> Arbiter.Resource[RESOURCE0_ID]; + App.Resource1 -> Arbiter.Resource[RESOURCE1_ID]; + App.Resource2 -> Arbiter.Resource[RESOURCE2_ID]; + App.Timer0 -> Timer0; + App.Timer1 -> Timer1; + App.Timer2 -> Timer2; + + App.Leds -> LedsC; +} + diff --git a/apps/tests/TestArbiter/TestFcfsArbiter/TestFcfsArbiterC.nc b/apps/tests/TestArbiter/TestFcfsArbiter/TestFcfsArbiterC.nc new file mode 100644 index 00000000..8a093088 --- /dev/null +++ b/apps/tests/TestArbiter/TestFcfsArbiter/TestFcfsArbiterC.nc @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2004, Technische Universitat Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitat Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "Timer.h" + +/** + * Please refer to TEP 108 for more information about the components + * this application is used to test + * + * This application is used to test the functionality of the + * FcfsArbiter component developed using the Resource + * interface. Three Resource users are created and all three request + * control of the resource before any one of them is granted it. + * Once the first user is granted control of the resource, a timer + * is set to allow this user to have control of it for a specific + * amount of time. Once this timer expires, the resource is released + * and then immediately requested again. Upon releasing the resource + * control will be granted to the next user that has + * requested it in FCFS order. Initial requests are made + * by the three resource users in the following order
    + *
  • Resource 0 + *
  • Resource 2 + *
  • Resource 1 + *
    + * It is expected then that using a first-come-first-serve policy, control of the + * resource will be granted in the order of 0,2,1 and the Leds + * corresponding to each resource will flash whenever this occurs.
    + *
  • Led 0 -> Resource 0 + *
  • Led 1 -> Resource 1 + *
  • Led 2 -> Resource 2 + *
    + * + * @author Kevin Klues + * @version $Revision$ + * @date $Date$ + */ + +module TestFcfsArbiterC { + uses { + interface Boot; + interface Leds; + interface Resource as Resource0; + interface Resource as Resource1; + interface Resource as Resource2; + interface Timer as Timer0; + interface Timer as Timer1; + interface Timer as Timer2; + } +} +implementation { + + #define HOLD_PERIOD 250 + + //All resources try to gain access + event void Boot.booted() { + call Resource0.request(); + call Resource2.request(); + call Resource1.request(); + } + + //If granted the resource, turn on an LED + event void Resource0.granted() { + call Timer0.startOneShot(HOLD_PERIOD); + call Leds.led0Toggle(); + } + event void Resource1.granted() { + call Timer1.startOneShot(HOLD_PERIOD); + call Leds.led1Toggle(); + } + event void Resource2.granted() { + call Timer2.startOneShot(HOLD_PERIOD); + call Leds.led2Toggle(); + } + + //After the hold period release the resource + event void Timer0.fired() { + call Resource0.release(); + call Resource0.request(); + } + event void Timer1.fired() { + call Resource1.release(); + call Resource1.request(); + } + event void Timer2.fired() { + call Resource2.release(); + call Resource2.request(); + } +} + diff --git a/apps/tests/TestArbiter/TestRoundRobinArbiter/TestRoundRobinArbiterAppC.nc b/apps/tests/TestArbiter/TestRoundRobinArbiter/TestRoundRobinArbiterAppC.nc new file mode 100644 index 00000000..593fea7b --- /dev/null +++ b/apps/tests/TestArbiter/TestRoundRobinArbiter/TestRoundRobinArbiterAppC.nc @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2004, Technische Universitat Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitat Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Please refer to TEP 108 for more information about the components + * this application is used to test.

    + * + * This application is used to test the functionality of the + * RoundRobinArbiter component developed using the Resource + * interface. Three Resource users are created and all three request + * control of the resource before any one of them is granted it. + * Once the first user is granted control of the resource, a timer + * is set to allow this user to have control of it for a specific + * amount of time. Once this timer expires, the resource is released + * and then immediately requested again. Upon releasing the resource + * control will be granted to the next user that has + * requested it in Round Robin order. Initial requests are made + * by the three resource users in the following order
    + *
  • Resource 0 + *
  • Resource 2 + *
  • Resource 1 + *
    + * It is expected then that using a round robin policy, control of the + * resource will be granted in the order of 0,1,2, and the Leds + * corresponding to each resource will flash whenever this occurs.
    + *
  • Led 0 -> Resource 0 + *
  • Led 1 -> Resource 1 + *
  • Led 2 -> Resource 2 + *
    + * + * @author Kevin Klues + * @version $Revision$ + * @date $Date$ + */ + +#define TEST_ARBITER_RESOURCE "Test.Arbiter.Resource" +configuration TestRoundRobinArbiterAppC{ +} +implementation { + components MainC, TestRoundRobinArbiterC as App,LedsC, + new TimerMilliC() as Timer0, + new TimerMilliC() as Timer1, + new TimerMilliC() as Timer2, + new RoundRobinArbiterC(TEST_ARBITER_RESOURCE) as Arbiter; + + enum { + RESOURCE0_ID = unique(TEST_ARBITER_RESOURCE), + RESOURCE1_ID = unique(TEST_ARBITER_RESOURCE), + RESOURCE2_ID = unique(TEST_ARBITER_RESOURCE), + }; + + App -> MainC.Boot; + + App.Resource0 -> Arbiter.Resource[RESOURCE0_ID]; + App.Resource1 -> Arbiter.Resource[RESOURCE1_ID]; + App.Resource2 -> Arbiter.Resource[RESOURCE2_ID]; + App.Timer0 -> Timer0; + App.Timer1 -> Timer1; + App.Timer2 -> Timer2; + + App.Leds -> LedsC; +} + diff --git a/apps/tests/TestArbiter/TestRoundRobinArbiter/TestRoundRobinArbiterC.nc b/apps/tests/TestArbiter/TestRoundRobinArbiter/TestRoundRobinArbiterC.nc new file mode 100644 index 00000000..de621148 --- /dev/null +++ b/apps/tests/TestArbiter/TestRoundRobinArbiter/TestRoundRobinArbiterC.nc @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2004, Technische Universitat Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitat Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "Timer.h" + +/** + * Please refer to TEP 108 for more information about the components + * this application is used to test + * + * This application is used to test the functionality of the + * RoundRobinArbiter component developed using the Resource + * interface. Three Resource users are created and all three request + * control of the resource before any one of them is granted it. + * Once the first user is granted control of the resource, a timer + * is set to allow this user to have control of it for a specific + * amount of time. Once this timer expires, the resource is released + * and then immediately requested again. Upon releasing the resource + * control will be granted to the next user that has + * requested it in Round Robin order. Initial requests are made + * by the three resource users in the following order
    + *
  • Resource 0 + *
  • Resource 2 + *
  • Resource 1 + *
    + * It is expected then that using a round robin policy, control of the + * resource will be granted in the order of 0,1,2, and the Leds + * corresponding to each resource will flash whenever this occurs.
    + *
  • Led 0 -> Resource 0 + *
  • Led 1 -> Resource 1 + *
  • Led 2 -> Resource 2 + *
    + * + * @author Kevin Klues + * @version $Revision$ + * @date $Date$ + */ + +module TestRoundRobinArbiterC { + uses { + interface Boot; + interface Leds; + interface Resource as Resource0; + interface Resource as Resource1; + interface Resource as Resource2; + interface Timer as Timer0; + interface Timer as Timer1; + interface Timer as Timer2; + } +} +implementation { + + #define HOLD_PERIOD 250 + + //All resources try to gain access + event void Boot.booted() { + call Resource0.request(); + call Resource2.request(); + call Resource1.request(); + } + + //If granted the resource, turn on an LED + event void Resource0.granted() { + call Timer0.startOneShot(HOLD_PERIOD); + call Leds.led0Toggle(); + } + event void Resource1.granted() { + call Timer1.startOneShot(HOLD_PERIOD); + call Leds.led1Toggle(); + } + event void Resource2.granted() { + call Timer2.startOneShot(HOLD_PERIOD); + call Leds.led2Toggle(); + } + + //After the hold period release the resource + event void Timer0.fired() { + call Resource0.release(); + call Resource0.request(); + } + event void Timer1.fired() { + call Resource1.release(); + call Resource1.request(); + } + event void Timer2.fired() { + call Resource2.release(); + call Resource2.request(); + } +} + diff --git a/apps/tests/TestDissemination/README b/apps/tests/TestDissemination/README new file mode 100644 index 00000000..554bfa1e --- /dev/null +++ b/apps/tests/TestDissemination/README @@ -0,0 +1,24 @@ +README for TestDisseminationAppC + +This application will disseminate 2 constant data objects to all nodes +every 20 seconds. Nodes whose TOS_NODE_ID mod 4 equals 1 will act as +disseminators, and all others will act as receivers. + +Every 20 seconds: +* The disseminator toggles its led0 and led1. + Sim debugging msg: Timer fired. + +* The disseminator sends a new 32-bit value and a new 16-bit value. + +* When a receiver receives the correct 32-bit value, it toggles led0. + Sim debugging msg: Received new correct 32-bit value + +* When a receiver receives the correct 16-bit value, it toggles led1. + Sim debugging msg: Received new correct 16-bit value + +Thus, in a successful test, you should see all nodes toggling both +led0 and led1 roughly in unison. + + + + diff --git a/apps/tests/TestLPL/Makefile b/apps/tests/TestLPL/Makefile new file mode 100644 index 00000000..1c579628 --- /dev/null +++ b/apps/tests/TestLPL/Makefile @@ -0,0 +1,4 @@ +COMPONENT=TestLplAppC + +include $(MAKERULES) + diff --git a/apps/tests/TestLPL/README.txt b/apps/tests/TestLPL/README.txt new file mode 100644 index 00000000..02e00812 --- /dev/null +++ b/apps/tests/TestLPL/README.txt @@ -0,0 +1,54 @@ +README for TestLPL +Author/Contact: tinyos-help@millennium.berkeley.edu + +Description: + +A simple low-power-listening test app, which cycles through different +low-power-listening settings every ~32s, repeating every ~256s. + +This application currently runs on motes using the CC1000 and CC2420 +radios. To compile for motes with CC2420 radios, you must do: + env CFLAGS="-I%T/chips/cc2420_lpl -DLOW_POWER_LISTENING" make + +This application blinks LED 0 every time it sends a message, and toggles +LED 1 every time it receives a message. + +It's low-power-listening settings are as follows (repeating every 256s): + +0-32s: receive: fully on + send: every second, to fully on listener + +32-64s: receive: fully on + send: every second, to low-power-listeners with 100ms interval + +64-96s: receive: low-power-listening with 250ms interval + send: every second, to low-power-listeners with 250ms interval + +96-128s: receive: low-power-listening with 250ms interval + send: every second, to fully on listener + +128-160s: receive: low-power-listening with 10ms interval + send: every second, to low-power-listeners with 10ms interval + +160-192s: receive: low-power-listening with 2000ms interval + send: every 7 seconds, to low-power-listeners with 2000ms interval + +192-224s: receive: low-power-listening with 1% duty cycle + send: every 7 seconds, to low-power-listeners with 1% duty cycle + +224-256s: receive: low-power-listening with 0.1% duty cycle + send: every 7 seconds, to low-power-listeners with 0.1% duty cycle + +Whether two motes running TestLPL can receive each others messages depends +on their current send and receive low-power-listening settings. If you reset +two such motes at the same time, they will be able to receive each other's +messages in the following intervals: 0-96s and 128-256s. + +Tools: + +None. + +Known bugs/limitations: + +None. + diff --git a/apps/tests/TestLPL/TestLplAppC.nc b/apps/tests/TestLPL/TestLplAppC.nc new file mode 100644 index 00000000..1499eb52 --- /dev/null +++ b/apps/tests/TestLPL/TestLplAppC.nc @@ -0,0 +1,64 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/** + * Simple test code for low-power-listening. Sends a sequence of packets, + * changing the low-power-listening settings every ~32s. See README.txt + * for more details. + * + * @author Philip Levis, David Gay + * @date Oct 27 2006 + */ + +configuration TestLplAppC {} +implementation { + components MainC, TestLplC as App, LedsC; + components ActiveMessageC; + components new TimerMilliC(); +#if defined(PLATFORM_MICA2) || defined(PLATFORM_MICA2DOT) + components CC1000CsmaRadioC as LplRadio; +#elif defined(PLATFORM_MICAZ) || defined(PLATFORM_TELOSB) + components CC2420ActiveMessageC as LplRadio; +#else +#error "LPL testing not supported on this platform" +#endif + + App.Boot -> MainC.Boot; + + App.Receive -> ActiveMessageC.Receive[240]; + App.AMSend -> ActiveMessageC.AMSend[240]; + App.SplitControl -> ActiveMessageC; + App.Leds -> LedsC; + App.MilliTimer -> TimerMilliC; + App.LowPowerListening -> LplRadio; +} + + diff --git a/apps/tests/TestLPL/TestLplC.nc b/apps/tests/TestLPL/TestLplC.nc new file mode 100644 index 00000000..0920f136 --- /dev/null +++ b/apps/tests/TestLPL/TestLplC.nc @@ -0,0 +1,144 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2003 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +#include "Timer.h" + +/** + * Simple test code for low-power-listening. Sends a sequence of packets, + * changing the low-power-listening settings every ~32s. See README.txt + * for more details. + * + * @author Philip Levis, David Gay + * @date Oct 27 2006 + */ + +module TestLplC { + uses { + interface Leds; + interface Boot; + interface Receive; + interface AMSend; + interface Timer as MilliTimer; + interface SplitControl; + interface LowPowerListening; + } +} +implementation +{ + message_t packet; + bool locked; + uint8_t counter = 0, sendSkip; + int16_t sendInterval; + + event void Boot.booted() { + call SplitControl.start(); + } + + void nextLplState() + { + switch (counter >> 5) { + case 0: + sendSkip = 0; + sendInterval = 0; + call LowPowerListening.setLocalSleepInterval(0); + break; + case 1: + sendInterval = 100; /* Send to sleepy listener */ + break; + case 2: + sendInterval = -1; /* Send to listener like us */ + call LowPowerListening.setLocalSleepInterval(250); + break; + case 3: + sendInterval = 0; /* Send to awake listener */ + break; + case 4: + sendInterval = -1; /* Send to listener like us */ + call LowPowerListening.setLocalSleepInterval(10); + break; + case 5: + sendSkip = 7; /* Send every 7s */ + call LowPowerListening.setLocalSleepInterval(2000); + break; + case 6: + call LowPowerListening.setLocalDutyCycle(100); + break; + case 7: + call LowPowerListening.setLocalDutyCycle(10); + break; + } + } + + event void MilliTimer.fired() + { + counter++; + if (!(counter & 31)) + nextLplState(); + + if (!locked && ((counter & sendSkip) == sendSkip)) + { + if (sendInterval >= 0) + call LowPowerListening.setRxSleepInterval(&packet, sendInterval); + if (call AMSend.send(AM_BROADCAST_ADDR, &packet, 0) == SUCCESS) + { + call Leds.led0On(); + locked = TRUE; + } + } + } + + event message_t* Receive.receive(message_t* bufPtr, + void* payload, uint8_t len) + { + call Leds.led1Toggle(); + return bufPtr; + } + + event void AMSend.sendDone(message_t* bufPtr, error_t error) + { + if (&packet == bufPtr) + { + locked = FALSE; + call Leds.led0Off(); + } + } + + event void SplitControl.startDone(error_t err) + { + call MilliTimer.startPeriodic(1000); + } + + event void SplitControl.stopDone(error_t err) { } +} + + + + diff --git a/apps/tests/TestPrintf/Makefile b/apps/tests/TestPrintf/Makefile new file mode 100644 index 00000000..9f2960ff --- /dev/null +++ b/apps/tests/TestPrintf/Makefile @@ -0,0 +1,13 @@ +COMPONENT=TestPrintfAppC +CFLAGS += -I$(TOSDIR)/lib/printf + +BUILD_EXTRA_DEPS += PrintfMsg.class PrintfClient.class + +%.class: %.java + javac $< + +PrintfMsg.java: $(TOSDIR)/lib/printf/printf.h + mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=PrintfMsg $(TOSDIR)/lib/printf/printf.h PrintfMsg -o $@ + +include $(MAKERULES) + diff --git a/apps/tests/TestPrintf/PrintfClient.java b/apps/tests/TestPrintf/PrintfClient.java new file mode 100644 index 00000000..55b38e55 --- /dev/null +++ b/apps/tests/TestPrintf/PrintfClient.java @@ -0,0 +1,81 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +import java.io.IOException; + +import net.tinyos.message.*; +import net.tinyos.packet.*; +import net.tinyos.util.*; + +public class PrintfClient implements MessageListener { + + private MoteIF moteIF; + + public PrintfClient(MoteIF moteIF) { + this.moteIF = moteIF; + this.moteIF.registerListener(new PrintfMsg(), this); + } + + public void messageReceived(int to, Message message) { + PrintfMsg msg = (PrintfMsg)message; + for(int i=0; i]"); + } + + public static void main(String[] args) throws Exception { + String source = ""; + if (args.length == 2) { + if (!args[0].equals("-comm")) { + usage(); + System.exit(1); + } + source = args[1]; + } + else { + usage(); + System.exit(1); + } + + PhoenixSource phoenix; + if (source == null) { + phoenix = BuildSource.makePhoenix(PrintStreamMessenger.err); + } + else { + phoenix = BuildSource.makePhoenix(source, PrintStreamMessenger.err); + } + System.out.print(phoenix); + MoteIF mif = new MoteIF(phoenix); + PrintfClient client = new PrintfClient(mif); + } +} diff --git a/apps/tests/TestPrintf/TestPrintfAppC.nc b/apps/tests/TestPrintf/TestPrintfAppC.nc new file mode 100644 index 00000000..37c0bb1d --- /dev/null +++ b/apps/tests/TestPrintf/TestPrintfAppC.nc @@ -0,0 +1,43 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +#include "printf.h" + +configuration TestPrintfAppC{ +} +implementation { + components MainC, TestPrintfC, LedsC; + components PrintfC; + + TestPrintfC.Boot -> MainC; + TestPrintfC.Leds -> LedsC; + TestPrintfC.PrintfControl -> PrintfC; + TestPrintfC.PrintfFlush -> PrintfC; +} + diff --git a/apps/tests/TestPrintf/TestPrintfC.nc b/apps/tests/TestPrintf/TestPrintfC.nc new file mode 100644 index 00000000..79f3f086 --- /dev/null +++ b/apps/tests/TestPrintf/TestPrintfC.nc @@ -0,0 +1,77 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +module TestPrintfC { + uses { + interface Boot; + interface Leds; + interface SplitControl as PrintfControl; + interface PrintfFlush; + } +} +implementation { + + #define NUM_TIMES_TO_PRINT 100 + uint16_t counter=0; + uint32_t dummyVar = 345678; + + event void Boot.booted() { + call PrintfControl.start(); + } + + event void PrintfControl.startDone(error_t error) { + printf("Hi my name is Kevin Klues and I am writing to you from my telos mote\n"); + printf("Here is a uint8: %hd\n", 123); + printf("Here is a uint16: %d\n", 12345); + printf("Here is a uint32: %ld\n", 1234567890); + call PrintfFlush.flush(); + } + + event void PrintfControl.stopDone(error_t error) { + counter = 0; + printf("This should not be printed..."); + call PrintfFlush.flush(); + } + + event void PrintfFlush.flushDone(error_t error) { + if(counter < NUM_TIMES_TO_PRINT) { + printf("I am now iterating: %d\n", counter); + call PrintfFlush.flush(); + } + else if(counter == NUM_TIMES_TO_PRINT) { + printf("This is a really short string...\n"); + printf("I am generating this string to have just less than 250 characters since that is the limit of the size I put on my maximum buffer when I instantiated the PrintfC component.\n"); + printf("Only part of this line should get printed because by writing this sentence, I go over my character limit that the internal Printf buffer can hold. If I were to flush before trying to write this, or increase my buffer size when I instantiate my PrintfC component to 1000, we would see this line too\n"); + call PrintfFlush.flush(); + } + else call PrintfControl.stop(); + counter++; + } +} + diff --git a/apps/tests/TestSharedResource/Makefile b/apps/tests/TestSharedResource/Makefile new file mode 100644 index 00000000..fe39435a --- /dev/null +++ b/apps/tests/TestSharedResource/Makefile @@ -0,0 +1,3 @@ +COMPONENT=TestSharedResourceAppC +include $(MAKERULES) + diff --git a/apps/tests/TestSharedResource/README.txt b/apps/tests/TestSharedResource/README.txt new file mode 100644 index 00000000..8464c748 --- /dev/null +++ b/apps/tests/TestSharedResource/README.txt @@ -0,0 +1,35 @@ +README for TestFcfsArbiter +Author/Contact: tinyos-help@millennium.berkeley.edu +@author Kevin Klues + +Description: + +This application is used to test the use of Shared Resources. +Three Resource users are created and all three request +control of the resource before any one of them is granted it. +Once the first user is granted control of the resource, it performs +some operation on it. Once this operation has completed, a timer +is set to allow this user to have control of it for a specific +amount of time. Once this timer expires, the resource is released +and then immediately requested again. Upon releasing the resource +control will be granted to the next user that has requested it in +round robin order. Initial requests are made by the three resource +users in the following order. + -- Resource 0 + -- Resource 2 + -- Resource 1 +It is expected then that using a round robin policy, control of the +resource will be granted in the order of 0,1,2 and the Leds +corresponding to each resource will flash whenever this occurs. + -- Led 0 -> Resource 0 + -- Led 1 -> Resource 1 + -- Led 2 -> Resource 2 + +Tools: + +None. + +Known bugs/limitations: + +None. + diff --git a/apps/tests/TestSharedResource/ResourceOperations.nc b/apps/tests/TestSharedResource/ResourceOperations.nc new file mode 100644 index 00000000..8a7e9c67 --- /dev/null +++ b/apps/tests/TestSharedResource/ResourceOperations.nc @@ -0,0 +1,37 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * An EXAMPLE of an interface for performing operations on a resource. + * In this test application it is provided by the dedicated ResourceP component + * and passed through all of the proper components before being exposed by the + * shared resource at the topmost level. + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +interface ResourceOperations { + command error_t operation(); + event void operationDone(error_t error); +} diff --git a/apps/tests/TestSharedResource/ResourceP.nc b/apps/tests/TestSharedResource/ResourceP.nc new file mode 100644 index 00000000..b1d644a0 --- /dev/null +++ b/apps/tests/TestSharedResource/ResourceP.nc @@ -0,0 +1,78 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * This is an example implementation of a dedicated resource. + * It provides the SplitControl interface for power management + * of the resource and an EXAMPLE ResourceOperations interface + * for performing operations on it. + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +module ResourceP { + provides { + interface SplitControl; + interface ResourceOperations; + } +} +implementation { + + bool lock; + + task void startDone() { + lock = FALSE; + signal SplitControl.startDone(SUCCESS); + } + + task void stopDone() { + signal SplitControl.stopDone(SUCCESS); + } + + task void operationDone() { + lock = FALSE; + signal ResourceOperations.operationDone(SUCCESS); + } + + command error_t SplitControl.start() { + post startDone(); + return SUCCESS; + } + + command error_t SplitControl.stop() { + lock = TRUE; + post stopDone(); + return SUCCESS; + } + + command error_t ResourceOperations.operation() { + if(lock == FALSE) { + lock = TRUE; + post operationDone(); + return SUCCESS; + } + return FAIL; + } +} + diff --git a/apps/tests/TestSharedResource/SharedResourceC.nc b/apps/tests/TestSharedResource/SharedResourceC.nc new file mode 100644 index 00000000..a6f8468f --- /dev/null +++ b/apps/tests/TestSharedResource/SharedResourceC.nc @@ -0,0 +1,54 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * SharedResourceC is used to provide a generic configuration around + * the SharedResourceP component so that new instantiations of + * it provide a single set of interfaces that are all properly associated + * with one another rather than requiring the user to deal with the complexity + * of doing this themselves. + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +#define TEST_SHARED_RESOURCE "Test.Shared.Resource" +generic configuration SharedResourceC() { + provides interface Resource; + provides interface ResourceRequested; + provides interface ResourceOperations; + uses interface ResourceConfigure; +} +implementation { + components SharedResourceP; + + enum { + RESOURCE_ID = unique(TEST_SHARED_RESOURCE) + }; + + Resource = SharedResourceP.Resource[RESOURCE_ID]; + ResourceRequested = SharedResourceP.ResourceRequested[RESOURCE_ID]; + ResourceOperations = SharedResourceP.ResourceOperations[RESOURCE_ID]; + ResourceConfigure = SharedResourceP.ResourceConfigure[RESOURCE_ID]; +} + diff --git a/apps/tests/TestSharedResource/SharedResourceImplP.nc b/apps/tests/TestSharedResource/SharedResourceImplP.nc new file mode 100644 index 00000000..ae9d0f05 --- /dev/null +++ b/apps/tests/TestSharedResource/SharedResourceImplP.nc @@ -0,0 +1,60 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * The SharedResourceImplP component is used to wrap all of the operations + * from a dedicated resource so that access to them is protected when + * it is used as a shared resource. It uses the ArbiterInfo interface + * provided by an Arbiter to accomplish this. + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +module SharedResourceImplP { + provides { + interface ResourceOperations as SharedResourceOperations[uint8_t id]; + } + uses { + interface ArbiterInfo; + interface ResourceOperations; + } +} +implementation { + uint8_t current_id = 0xFF; + + event void ResourceOperations.operationDone(error_t error) { + signal SharedResourceOperations.operationDone[current_id](error); + } + + command error_t SharedResourceOperations.operation[uint8_t id]() { + if(call ArbiterInfo.userId() == id && call ResourceOperations.operation() == SUCCESS) { + current_id = id; + return SUCCESS; + } + return FAIL; + } + + default event void SharedResourceOperations.operationDone[uint8_t id](error_t error) {} +} + diff --git a/apps/tests/TestSharedResource/SharedResourceP.nc b/apps/tests/TestSharedResource/SharedResourceP.nc new file mode 100644 index 00000000..a5e72623 --- /dev/null +++ b/apps/tests/TestSharedResource/SharedResourceP.nc @@ -0,0 +1,55 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * The SharedResourceP component is used to create a shared resource + * out of a dedicated one. + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +#define TEST_SHARED_RESOURCE "Test.Shared.Resource" +configuration SharedResourceP { + provides interface Resource[uint8_t id]; + provides interface ResourceRequested[uint8_t id]; + provides interface ResourceOperations[uint8_t id]; + uses interface ResourceConfigure[uint8_t id]; +} +implementation { + components new RoundRobinArbiterC(TEST_SHARED_RESOURCE) as Arbiter; + components new SplitControlPowerManagerC() as PowerManager; + components ResourceP; + components SharedResourceImplP; + + ResourceOperations = SharedResourceImplP; + Resource = Arbiter; + ResourceRequested = Arbiter; + ResourceConfigure = Arbiter; + SharedResourceImplP.ArbiterInfo -> Arbiter; + PowerManager.ResourceController -> Arbiter; + + PowerManager.SplitControl -> ResourceP; + SharedResourceImplP.ResourceOperations -> ResourceP; +} + diff --git a/apps/tests/TestSharedResource/TestSharedResourceAppC.nc b/apps/tests/TestSharedResource/TestSharedResourceAppC.nc new file mode 100644 index 00000000..bf2975b5 --- /dev/null +++ b/apps/tests/TestSharedResource/TestSharedResourceAppC.nc @@ -0,0 +1,76 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * + * This application is used to test the use of Shared Resources. + * Three Resource users are created and all three request + * control of the resource before any one of them is granted it. + * Once the first user is granted control of the resource, it performs + * some operation on it. Once this operation has completed, a timer + * is set to allow this user to have control of it for a specific + * amount of time. Once this timer expires, the resource is released + * and then immediately requested again. Upon releasing the resource + * control will be granted to the next user that has requested it in + * round robin order. Initial requests are made by the three resource + * users in the following order.
    + *
  • Resource 0 + *
  • Resource 2 + *
  • Resource 1 + *
    + * It is expected then that using a round robin policy, control of the + * resource will be granted in the order of 0,1,2 and the Leds + * corresponding to each resource will flash whenever this occurs.
    + *
  • Led 0 -> Resource 0 + *
  • Led 1 -> Resource 1 + *
  • Led 2 -> Resource 2 + *
    + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +configuration TestSharedResourceAppC{ +} +implementation { + components MainC,LedsC, TestSharedResourceC as App, + new TimerMilliC() as Timer0, + new TimerMilliC() as Timer1, + new TimerMilliC() as Timer2; + App -> MainC.Boot; + App.Leds -> LedsC; + App.Timer0 -> Timer0; + App.Timer1 -> Timer1; + App.Timer2 -> Timer2; + + components + new SharedResourceC() as Resource0, + new SharedResourceC() as Resource1, + new SharedResourceC() as Resource2; + App.Resource0 -> Resource0; + App.Resource1 -> Resource1; + App.Resource2 -> Resource2; + App.ResourceOperations0 -> Resource0; + App.ResourceOperations1 -> Resource1; + App.ResourceOperations2 -> Resource2; +} diff --git a/apps/tests/TestSharedResource/TestSharedResourceC.nc b/apps/tests/TestSharedResource/TestSharedResourceC.nc new file mode 100644 index 00000000..833fe812 --- /dev/null +++ b/apps/tests/TestSharedResource/TestSharedResourceC.nc @@ -0,0 +1,123 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +#include "Timer.h" + +/** + * + * This application is used to test the use of Shared Resources. + * Three Resource users are created and all three request + * control of the resource before any one of them is granted it. + * Once the first user is granted control of the resource, it performs + * some operation on it. Once this operation has completed, a timer + * is set to allow this user to have control of it for a specific + * amount of time. Once this timer expires, the resource is released + * and then immediately requested again. Upon releasing the resource + * control will be granted to the next user that has requested it in + * round robin order. Initial requests are made by the three resource + * users in the following order.
    + *
  • Resource 0 + *
  • Resource 2 + *
  • Resource 1 + *
    + * It is expected then that using a round robin policy, control of the + * resource will be granted in the order of 0,1,2 and the Leds + * corresponding to each resource will flash whenever this occurs.
    + *
  • Led 0 -> Resource 0 + *
  • Led 1 -> Resource 1 + *
  • Led 2 -> Resource 2 + *
    + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +module TestSharedResourceC { + uses { + interface Boot; + interface Leds; + interface Timer as Timer0; + interface Timer as Timer1; + interface Timer as Timer2; + + interface Resource as Resource0; + interface ResourceOperations as ResourceOperations0; + + interface Resource as Resource1; + interface ResourceOperations as ResourceOperations1; + + interface Resource as Resource2; + interface ResourceOperations as ResourceOperations2; + } +} +implementation { + + #define HOLD_PERIOD 250 + + //All resources try to gain access + event void Boot.booted() { + call Resource0.request(); + call Resource2.request(); + call Resource1.request(); + } + + //If granted the resource, run some operation + event void Resource0.granted() { + call ResourceOperations0.operation(); + } + event void Resource1.granted() { + call ResourceOperations1.operation(); + } + event void Resource2.granted() { + call ResourceOperations2.operation(); + } + + //When the operation completes, flash the LED and hold the resource for a while + event void ResourceOperations0.operationDone(error_t error) { + call Timer0.startOneShot(HOLD_PERIOD); + call Leds.led0Toggle(); + } + event void ResourceOperations1.operationDone(error_t error) { + call Timer1.startOneShot(HOLD_PERIOD); + call Leds.led1Toggle(); + } + event void ResourceOperations2.operationDone(error_t error) { + call Timer2.startOneShot(HOLD_PERIOD); + call Leds.led2Toggle(); + } + + //After the hold period release the resource and request it again + event void Timer0.fired() { + call Resource0.release(); + call Resource0.request(); + } + event void Timer1.fired() { + call Resource1.release(); + call Resource1.request(); + } + event void Timer2.fired() { + call Resource2.release(); + call Resource2.request(); + } +} + diff --git a/apps/tests/TestTrickleTimer/TestTrickle.h b/apps/tests/TestTrickleTimer/TestTrickle.h new file mode 100644 index 00000000..33f99cb1 --- /dev/null +++ b/apps/tests/TestTrickleTimer/TestTrickle.h @@ -0,0 +1,6 @@ +#ifndef TEST_TRICKLE_H +#define TEST_TRICKLE_H + +#define UQ_TEST_TRICKLE "TestTrickle.TrickleTimer" + +#endif diff --git a/apps/tests/eyesIFX/RadioCountToFlash/Makefile b/apps/tests/eyesIFX/RadioCountToFlash/Makefile new file mode 100644 index 00000000..14ef6855 --- /dev/null +++ b/apps/tests/eyesIFX/RadioCountToFlash/Makefile @@ -0,0 +1,15 @@ +COMPONENT=RadioCountToFlashAppC +BUILD_EXTRA_DEPS = RadioCountMsg.py RadioCountMsg.class + +RadioCountMsg.py: RadioCountToFlash.h + mig python -target=$(PLATFORM) $(CFLAGS) -python-classname=RadioCountMsg RadioCountToFlash.h RadioCountMsg -o $@ + +RadioCountMsg.class: RadioCountMsg.java + javac RadioCountMsg.java + +RadioCountMsg.java: RadioCountToFlash.h + mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=RadioCountMsg RadioCountToFlash.h RadioCountMsg -o $@ + + +include $(MAKERULES) + diff --git a/apps/tests/eyesIFX/RadioCountToFlash/README.txt b/apps/tests/eyesIFX/RadioCountToFlash/README.txt new file mode 100644 index 00000000..2bf61d2d --- /dev/null +++ b/apps/tests/eyesIFX/RadioCountToFlash/README.txt @@ -0,0 +1,22 @@ +README for RadioCountToFlash + +Description: + +RadioCountToLeds maintains a 1Hz counter and broadcsts its value repeatedly. A +RadioCountToLeds node that hears a counter writes the counter to the flash. +After LOG_LENGTH (default = 16) successful receiptions the previously stored counters +are read from the flash with a delay of 100ms between each read. The bottom three bits +are displayed on the LEDs. This application tests the coexistance between +the radio and the flash. + +Tools: + +RadioCountMsg.java is a Java class representing the message that +this application sends. RadioCountMsg.py is a Python class representing +the message that this application sends. + +Known bugs/limitations: + +None. + + diff --git a/apps/tests/eyesIFX/RadioCountToFlash/RadioCountToFlash.h b/apps/tests/eyesIFX/RadioCountToFlash/RadioCountToFlash.h new file mode 100644 index 00000000..2c8a0ac1 --- /dev/null +++ b/apps/tests/eyesIFX/RadioCountToFlash/RadioCountToFlash.h @@ -0,0 +1,12 @@ +#ifndef RADIO_COUNT_TO_FLASH_H +#define RADIO_COUNT_TO_FLASH_H + +typedef nx_struct RadioCountMsg { + nx_uint16_t counter; +} RadioCountMsg; + +enum { + AM_RADIOCOUNTMSG = 6, +}; + +#endif diff --git a/apps/tests/eyesIFX/RadioCountToFlash/RadioCountToFlashAppC.nc b/apps/tests/eyesIFX/RadioCountToFlash/RadioCountToFlashAppC.nc new file mode 100644 index 00000000..67ce4a6d --- /dev/null +++ b/apps/tests/eyesIFX/RadioCountToFlash/RadioCountToFlashAppC.nc @@ -0,0 +1,72 @@ +/* + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/** + * This application tests the coexistence of radio and flash. + * (based on RadioCountToLeds) + * + * @see README.TXT + * @author Philipp Huppertz + * @author Philip Levis (RadioCountToLeds) + * @date June 6 2005 + */ + +#include "RadioCountToFlash.h" +#include "StorageVolumes.h" + + +configuration RadioCountToFlashAppC {} +implementation { + components MainC, RadioCountToFlashC as App, LedsC, PlatformLedsC; + components new AMSenderC(AM_RADIOCOUNTMSG); + components new AMReceiverC(AM_RADIOCOUNTMSG); + components new TimerMilliC() as RadioTimer; + components new TimerMilliC() as FlashTimer; + components ActiveMessageC; + components new LogStorageC(VOLUME_LOGTEST, TRUE); + + + + + App.Boot -> MainC.Boot; + + App.Receive -> AMReceiverC; + App.AMSend -> AMSenderC; + App.AMControl -> ActiveMessageC; + App.Leds -> LedsC; + App.FailureLed -> PlatformLedsC.Led3; + App.FlashTimer -> FlashTimer; + App.RadioTimer -> RadioTimer; + App.Packet -> AMSenderC; + + App.LogRead -> LogStorageC.LogRead; + App.LogWrite -> LogStorageC.LogWrite; +} + + diff --git a/apps/tests/eyesIFX/RadioCountToFlash/RadioCountToFlashC.nc b/apps/tests/eyesIFX/RadioCountToFlash/RadioCountToFlashC.nc new file mode 100644 index 00000000..0ec35e67 --- /dev/null +++ b/apps/tests/eyesIFX/RadioCountToFlash/RadioCountToFlashC.nc @@ -0,0 +1,211 @@ +/* + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2003 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/** + * This application tests the coexistence of radio and flash. + * (based on RadioCountToLeds) + * + * @see README.TXT + * @author Philipp Huppertz + * @author Philip Levis (RadioCountToLeds) + * @date June 6 2005 + */ + +#include "Timer.h" +#include "RadioCountToFlash.h" +#define LOG_LENGTH 15 + +module RadioCountToFlashC { + uses { + interface Leds; + interface Boot; + interface Receive; + interface AMSend; + interface Timer as FlashTimer; + interface Timer as RadioTimer; + interface SplitControl as AMControl; + interface Packet; + interface LogRead; + interface LogWrite; + interface GeneralIO as FailureLed; + } +} +implementation { + + message_t packet; + + bool locked; + uint16_t sendingCounter = 0; + uint16_t receiveCounter = 0; + uint16_t readBuffer = 0; + uint16_t logCounter = 0; + + void failure() { + call FailureLed.set(); + for (;;) { + ; + } + } + + task void readingTask() { + if (call LogRead.read((void*) &readBuffer, sizeof(receiveCounter)) != SUCCESS) { + post readingTask(); + } + } + + task void writingTask() { + if (call LogWrite.append((void*)receiveCounter, sizeof(receiveCounter)) != SUCCESS) { + post writingTask(); + } + } + + event void Boot.booted() { + call LogWrite.erase(); + call AMControl.start(); + } + + event void AMControl.startDone(error_t err) { + if (err == SUCCESS) { + call RadioTimer.startPeriodic(1000); + } + else { + call AMControl.start(); + } + } + + event void AMControl.stopDone(error_t err) { + // do nothing + } + + event void FlashTimer.fired() { + if (call LogRead.read((void*) &readBuffer, sizeof(receiveCounter)) != SUCCESS) { + post readingTask(); + } + } + + event void RadioTimer.fired() { + dbg("RadioCountToLedsC", "RadioCountToLedsC: timer fired, counter is %hu.\n", counter); + if (locked) { + return; + } + else { + RadioCountMsg* rcm = (RadioCountMsg*)call Packet.getPayload(&packet, NULL); + if (call Packet.maxPayloadLength() < sizeof(RadioCountMsg)) { + return; + } + ++sendingCounter; + rcm->counter = sendingCounter; + if (call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(RadioCountMsg)) == SUCCESS) { + dbg("RadioCountToLedsC", "RadioCountToLedsC: packet sent.\n", counter); + locked = TRUE; + } + } + } + + event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) { + dbg("RadioCountToLedsC", "Received packet of length %hhu.\n", len); + if (len != sizeof(RadioCountMsg)) {return bufPtr;} + else { + RadioCountMsg* rcm = (RadioCountMsg*)payload; + receiveCounter = rcm->counter; + if (call LogWrite.append((void*)&receiveCounter, sizeof(receiveCounter)) != SUCCESS) { + post writingTask(); + } + } + return bufPtr; + } + + event void AMSend.sendDone(message_t* bufPtr, error_t error) { + if (&packet == bufPtr) { + locked = FALSE; + } + } + + event void LogRead.readDone(void* buf, storage_len_t len, error_t error) { + --logCounter; + if (error != SUCCESS) { + failure(); + } + readBuffer = *(uint16_t*)buf; + if ( logCounter > 0 ) { + if (readBuffer & 0x1) { + call Leds.led0On(); + } + else { + call Leds.led0Off(); + } + if (readBuffer & 0x2) { + call Leds.led1On(); + } + else { + call Leds.led1Off(); + } + if (readBuffer & 0x4) { + call Leds.led2On(); + } + else { + call Leds.led2Off(); + } + call FlashTimer.startOneShot(100); + } + } + + event void LogRead.seekDone(error_t error) { + if (error != SUCCESS) { + failure(); + } + } + + event void LogWrite.appendDone(void* buf, storage_len_t len, bool recordsLost, error_t error) { + ++logCounter; + if (error != SUCCESS) { + failure(); + } + if (logCounter > LOG_LENGTH) { + if (call LogWrite.sync() != SUCCESS) { + failure(); + } + } + } + + event void LogWrite.syncDone(error_t error) { + if (error != SUCCESS) { + failure(); + } + call FlashTimer.startOneShot(100); + } + + event void LogWrite.eraseDone(error_t error) { + if (error != SUCCESS) { + failure(); + } + } + +} + diff --git a/apps/tests/eyesIFX/RadioCountToFlash/volumes-at45db.xml b/apps/tests/eyesIFX/RadioCountToFlash/volumes-at45db.xml new file mode 100644 index 00000000..daa0d507 --- /dev/null +++ b/apps/tests/eyesIFX/RadioCountToFlash/volumes-at45db.xml @@ -0,0 +1,3 @@ + + + diff --git a/apps/tests/storage/Block/volumes-pxa27xp30.xml b/apps/tests/storage/Block/volumes-pxa27xp30.xml new file mode 100644 index 00000000..50bf1889 --- /dev/null +++ b/apps/tests/storage/Block/volumes-pxa27xp30.xml @@ -0,0 +1,3 @@ + + + diff --git a/apps/tests/storage/CircularLog/volumes-pxa27xp30.xml b/apps/tests/storage/CircularLog/volumes-pxa27xp30.xml new file mode 100644 index 00000000..cc81eb17 --- /dev/null +++ b/apps/tests/storage/CircularLog/volumes-pxa27xp30.xml @@ -0,0 +1,3 @@ + + + diff --git a/apps/tests/storage/Config/volumes-pxa27xp30.xml b/apps/tests/storage/Config/volumes-pxa27xp30.xml new file mode 100644 index 00000000..31c65904 --- /dev/null +++ b/apps/tests/storage/Config/volumes-pxa27xp30.xml @@ -0,0 +1,3 @@ + + + diff --git a/apps/tests/storage/Log/volumes-pxa27xp30.xml b/apps/tests/storage/Log/volumes-pxa27xp30.xml new file mode 100644 index 00000000..cc81eb17 --- /dev/null +++ b/apps/tests/storage/Log/volumes-pxa27xp30.xml @@ -0,0 +1,3 @@ + + + diff --git a/apps/tutorials/BlinkConfig/BlinkConfigAppC.nc b/apps/tutorials/BlinkConfig/BlinkConfigAppC.nc index 46c75967..f990b6cc 100644 --- a/apps/tutorials/BlinkConfig/BlinkConfigAppC.nc +++ b/apps/tutorials/BlinkConfig/BlinkConfigAppC.nc @@ -25,6 +25,14 @@ */ #include "StorageVolumes.h" +/** + * Application to demonstrate the ConfigStorageC abstraction. A value + * is written to, and read from, the flash storage. A successful test + * will turn on both the green and blue (yellow) LEDs. A failed test + * is any other LED configuration. + * + * @author Prabal Dutta + */ configuration BlinkConfigAppC { } implementation { diff --git a/apps/tutorials/BlinkConfig/BlinkConfigC.nc b/apps/tutorials/BlinkConfig/BlinkConfigC.nc index 394f5b2e..91853c7d 100644 --- a/apps/tutorials/BlinkConfig/BlinkConfigC.nc +++ b/apps/tutorials/BlinkConfig/BlinkConfigC.nc @@ -24,6 +24,14 @@ * UPDATES, ENHANCEMENTS, OR MODIFICATIONS." */ +/** + * Application to demonstrate the ConfigStorageC abstraction. A value + * is written to, and read from, the flash storage. A successful test + * will turn on both the green and blue (yellow) LEDs. A failed test + * is any other LED combination.. + * + * @author Prabal Dutta + */ module BlinkConfigC { uses { interface Boot; diff --git a/apps/tutorials/BlinkConfig/README.txt b/apps/tutorials/BlinkConfig/README.txt index 01332157..7cf9967d 100644 --- a/apps/tutorials/BlinkConfig/README.txt +++ b/apps/tutorials/BlinkConfig/README.txt @@ -8,7 +8,7 @@ Application to demonstrate the ConfigStorageC abstraction. A value is written to, and read from, the flash storage. A successful test will turn on both the green and blue (yellow) -LEDs. A failed test will turn on the red led. +LEDs. A failed test is any other LED combination. Tools: diff --git a/doc/html/porting.html b/doc/html/porting.html new file mode 100644 index 00000000..be841068 --- /dev/null +++ b/doc/html/porting.html @@ -0,0 +1,378 @@ + + + + + + +Porting TinyOS 1.x Code to TinyOS 2.0 + + + + + +
    +

    Porting TinyOS 1.x Code to TinyOS 2.0

    + +++ + + + + + +
    Author:Tahir Azim and Philip Levis
    Date:October 26 2006
    +
    +

    Note

    +

    This document provides a few important points that describe +major steps required for porting TinyOS 1.x code to TinyOS 2.0. +It is based on Tahir Azim's experience porting Beacon Vector +Routing (BVR[1]) from TinyOS 1.x to T2. This document is not +a complete porting guide, but the hope is that it will provide +some help or guidance.

    +
    +
    +

    1. Porting Points

    +

    As these observations come from porting a network protocol, they are +rather protocol-centric and do not consider other abstractions such +as storage. We hope to add such points in the future.

    +
    +
      +
    1. SUCCESS was a non-zero error code in TinyOS 1.x, while FAIL was non-zero. So any "if blocks" of the following form need to be changed:

      +
      +if (call Packet...) {
      +    //SUCCESS!: do this...
      +}
      +
      +
    2. +
    +

    In TinyOS 2.x, SUCCESS is equal to a zero error code, while other error codes are non-zero. So calls like this should be changed to make sure they test the result for equality with SUCCESS:

    +
    +if (call Packet... () == SUCCESS ) {
    +      //SUCCESS!: do this...
    +  }
    +
    +
      +
    1. The "init()" and "start/stop()" methods in StdControl have been separated in TinyOS 2.x. The init() method is now part of the "Init" interface. Therefore all modules implementing StdControl should now implement Init also. Modules wired to the StdControl interface of a module should also wire to its Init interface.
    2. +
    3. The nx_bool data type should be replaced by nx_uint8_t.
    4. +
    5. Radios need to be started manually using SplitControl.start() and SplitControl.stop() at the beginning of the simulation. In TinyOS 1.x, this was assumed to be done automatically by TOSSIM/TinyOS.
    6. +
    7. Packets are now an abstract data type (ADT) in TinyOS 2.x. Therefore, destination addresses from packets can no longer be obtained by using "msg -> addr". Instead the AMPacket.destination() method of the AMPacket interface should be used for this purpose. AMSenderC or AMReceiverC can be used to wire the AMPacket interface.
    8. +
    9. Similarly, in order to get a pointer to the payload of received message_t structures, and to get the payload lengths and maximum payload lengths of message_t structures, the Packet interface is used. This can also be wired to an AMSenderC or AMReceiverC component. Similarly, instead of using "msg->strength" to get the strength of a received signal, CC2420Packet.getRssi(msg) can be used. The CC2420Packet interface can be wired to CC2420ActiveMessageC.
    10. +
    11. Communication interfaces are very similar but require straightforward porting. SendMsg and ReceiveMsg interfaces (wherever used or provided by various modules) should be replaced by AMSend and Receive interfaces. At the lowest layer of the communication stack, AMSend and Receive interfaces should be wired to AMSenderC and AMReceiverC.
    12. +
    13. Where a module that previously provided SendMsg is changed to provide AMSend, extra methods have to be added that are part of the AMSend signature. These include the cancel, getPayload and maxPayloadLength methods. The Packet interface wired to AMSenderC can generally be used to implement these methods.
    14. +
    15. TOS_UART_ADDRESS no longer exists. Use an SerialAMSenderC component when you would like to send to the serial port.
    16. +
    17. TOS_LOCAL_ADDRESS no longer exists. There is now a distinction between the local node's ID (which is TOS_NODE_ID) and the active message address. The active message address of a communication interface can be obtained through the AMPacket.localAddress() command. By default, node ID and AM address are the same. TOS_NODE_ID is bound at compile-time, while an interface's AM address can be changed at runtime.
    18. +
    19. Calls such as Leds.greenToggle(), Leds.yellowToggle() etc need to be replaced by Leds.led1Toggle(), Leds.led2Toggle() etc.
    20. +
    21. You should no longer use "#ifdef PLATFORM_PC" to separate pieces of code that are to run only on the 'pc' target. Instead, "#ifdef TOSSIM" is used to identify blocks of code that should be run only in TOSSIM.
    22. +
    23. dbg messages no longer use one of the debug modes of the form, DBG_* as their first argument. Instead, they should be replaced with strings identifying the sources from where the messages originated.
    24. +
    +
    +
    +
    +

    2. Author's Address

    +
    +
    Tahir Azim
    +
    358 Gates Hall
    +
    Computer Systems Laboratory
    +
    Stanford University
    +
    Stanford, CA 94305
    +

    + +

    +
    Philip Levis
    +
    358 Gates Hall
    +
    Computer Systems Laboratory
    +
    Stanford University
    +
    Stanford, CA 94305
    +

    +
    phone - +1 650 725 9046
    +

    + +
    +
    +
    +

    3. Citations

    + + + + + +
    [1]Rodrigo Fonseca, David Culler, Sylvia Ratnasamy, Scott Shenker, and Ion Stoica. "Beacon Vector Routing: Scalable Point-to-Point Routing in Wireless Sensornets." In Proceedings of the Second USENIX/ACM Symposium on Network Systems Design and Implementation (NSDI 2005).
    +
    +
    + + diff --git a/doc/html/tutorial/img/arbiter_pm_graph.png b/doc/html/tutorial/img/arbiter_pm_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..0c9954b06d45c71472c12bd8eea71848827aab0b GIT binary patch literal 35831 zcmbTebx@UE)c*}q(%p@MbhmW3bT^0YluqeGNq2*EclRNrLrPj2r5oOh`+1(3-{0>H z4&j-@zV=>w#dm!ck;+Qas7OReP*6~)vN95?P*5<&P*BiR@8N-;(M?j@P0i85?W>84Ih2aKwVAEDwY@n7 z4>KDx2L-L7i5bNgH41GyD4OD(w>Lp>lU0;NSVV@wqG9*)b6A3cqJWZ>5LNfgI>|=V zS6{#%K}SNO&#*0PD`}gL*VSP@Y+dDcNQNseHZ2Za3A?VDuAhFvZ8T1q?_tHSl=!JS z^A1_9PHYHAL7h=lMU>P=dHOMTBin1B78PdVpT(x{v;GF_xX*3Z*WX>YYYqD7Cf^9c zO#b(yR89I6i4|qwe?I2%w4u%Z??20E{{MU>rPVt=CWAqiA^a@KPts7;O=Is9%16fI1;jmnSngv5CUAtWN)N#E1c=~kOu_a|}b ztad2SgoQ}Ws$7ENV?U~@}2U(HgnTj2m?DaYw znO=zC>UBEfno4_^e(#H=%+%0J9$H4T$Hch=~<_5{zV1PexXC7 zLeuRh*V6QYmJyTuxu{Bq$0=x?@D{q>d9xS#VJA))wA>TWvnI9`d;*0+Titb|>-D!P z`4b9GUMs#^GCK)Eh|BS4M1$qj*gnEk^lY}6f4j%29M5mh59>|?s44dQli3TM z3QcHhuk-WjI%uT)pyik6+l`bU+CY>%(m(-PBeeX_1a2OV)%+nk)UH*Nr?>WImoU-|lWJ-)9UP zLuFyVKJ#5YWe+XH+%4?jJ=;zdjy}3=DC!c-B1)1{HorLQGjTVczomtrS zYJa|2Eem*knXfStK3Z+5ArWBHK(JqP?0Kd!7hT?7MzCthTcd@WYP^P;9vLZJIg0dv zcyAw13BM-EQ6f!3%L$2)I(FY%=sa8fn{fJD^Tbq&Oj+g@s-U)KKockg?Q=*s&3d$0L5%LAj#9_N2+Lr7gCc%5mTb zRHK=sU{Iz=es_$>2+NCKrO7b9*%z`WfvM(~C#=kPLPtl3cTA7N8i+_n3p`f7h+YTv zzyq2jvL@s3JdGG;h@DGt-K+xhl>S%Y)Vsf2AkR=1Mz9Wgr_k6ABJ0+gVlh zyLq${RD-S6-OPd6zaV%y>q_IgK1O0ScUGTpLYv~bp{5ZEjBGf5q>1gV6~J=!(4La2 zIwp+UiQq$mxb1$4Flbd5{mkSUCscE5FO-V;4yRcp6+={J@KX-vcm!SeiDJrrJcVf% z3E6hy8zMGjVe|`QGlZDVr71nUW=SOZ4Nap=|DJoDmF>A)wvtDQ;m|0OnlTq%Z5J# z6T&}>UiZF+V9T&%w#T4r^T(Uhly1CJ9s!x@(t-dv@r zfAI|qdji9e&QfRhO@oIun9SdfJsQdu2|m}^*;)0xAKco~(sK1YVs}^7@|&I*7j5?| zx-p@+Ww+0*!=ZOrD-H_97B{S<9VDKT)9x3mbyMZ3aULlyt|YntUA`~cw6oCDzX7)m zzgt=SQL;o9MNSWPn8E#+?Gt#BWjN`c!o*DqB` z;TOFWZqE*QR?8p3ID1iTdu6K}BziVc{pjY=0srKD4D?KzaqJCWW>x<7}7;JzQXsv&f zgd;7jE$CvXOy3rsKt>F4K!L$jbNbw<)k$<1uD2L1#15s_R_%sE0OoJ!C0Z8{d+Q5P z-oMWyXe^RP+jv}b!Pe@3>!NjE85n+9w!)g7! z@m;$-N-6`C7N3Fzqfxg${a^8LwBo!xin7kd#a&S=OJh;VC)x+yLDD`h5{C&VBS|CV zq3DKTGOm>}60QSkRpC z1is>1+k`DE&=x0o@uG+$c~GN-P^LP=F~rhlBe7L=%wHpl-vjaB>xQ2e8d9#;AHobi zSBolDAqFIiulS7G6ijALAsNB}-AUMA5#-+OZWhJ~eXobA_?h@cXf$PuKKKUi6sdAd zS%CFe`0JUzwT?$BL3%kDVMcCY+}gC(<-A3@!LjVDa0sCe$zo zt}`3`W3k`p7Q&1PhRd?}T%{NdJGIxGM@ahz2E+*v()%|yj4E}TL+G{_9BmK0(=DacRE26A|4dt@zju{4z#yaYe?{R?ZfA` z5i%czEFnMLQ~EZp&mJcjUEbGN*T+lvm-|y+Gd=b$_Qp*|zf%`TM&lI#5t)jSQGoyj zzNtck;muR24<0R6F+ALyGI*S>6ni9>EBO0&-~GvS1g&l#9?~Jq0?WeANWdjTT z@5W((5ZU3DT~bKufJ=ZTQL_|%``hP>+v$o18mDwD37ux8HYJd;7&TQ4x6%O{{Xee{ z28%APh1PUG$mw2t-<;54VPVZzE5+pJ<%x`m4TPZ%F}18wp^*z!dL-Mq01*J zZ;v`B;Kj@N<;kn5LY+ZYNeK^lDYpC3JZ6K%PpsFc%eWPda@JC%Y^<8Dn+&Vf<|-1# zIMUCWl{yVlK;ouyTF&P1w$HHX!FHm<6t?kv()~yT1H6GJCw7=vSXArftkZ*=R7^~Y zr#5U{C=eVFGCRCZ$b{&PKCbrXO$&I(+jI`g`r-ju5`H(CtHU|zF<1*{gM>KY7wx;d zyNFeX4n=w>@B<^@i6(Ep{{3z6k(#>9fV3kJ7u_Baga~8S%4P`y{V-rE346Evwg(ih z@q&=N55{m{lX9p^?EL(E7ZET5&Kc(!DBXAs8$tj=Wk*=nYjw&W*U@2%=5^kdIHU>> zBHPi=TNAo~d~g}&rl*%XJ<^7Zk0&yh);1gWLuq~Z9?{zB6CBbjW+s6(6$Et(*vP7%joqQu~tmRPYAt$2n zl+p3BT2MllfEgy9+X9)kS_gkqRH~u3Y?g1 z9ZxhKlWGUQr1F|wCZ{!3b0!u(S*VC`v0!4rHypsvlD@jEIj z)n9=FmywG6_iG^~D}+7oU|`JkXIXll3Ty;z7=X|93XQeSJ5mcrfvp8V#D<`RKi>Y; zsv-kF`(DjRt0MYb{^VJxj)El=N?;sZTGHx#JnOJKH`RxSP=T=O5ecglxOFvq2}<6b zthRj7C5nG<0>m>Lt#FelsPu1kR12IS4OEO{7|CgkO6R6zX>vdH$!Q?tYFvqnQOE{N zyQcNwsA8R4(cgX#a9as%nKpXLTGje=sk8)KHc7nxPp#$dCTaD7c2uHxAY67m%(pB3 zdAZ%a!fO6U0)eoO(sjw4Cv64hzxN3}SwUtnMlnM; zKRtc*S^?u+%9z|{4m_&J*vKNS$Oy>CPcIZI(SK#Xn zmDX9SV=o#>n{~2n)XnF@iwWD^kRZyxM90ZbV54GMeMWfJp!`g&^zF{}=TdR)9YT0i zyhzM+7!CjFuZKqMEu*Ja6T||VHB57r(IY4E)sC+lvgaZ;b3RiliY9F8+vLcfvOLPE*HFk{p`6(!a5tO~s3aO72`UH;T0mTaAg z%XILqJEoFuAq|5PnK-e9Aqnq?N#9&Isy6sFGzcRIpZ&zHRtO3HK_fI5ccg%Jc)CkOp@jg(=a2Gbp*?Y1S$B4lasmrK+` zD)#A09IIeSxzL|l%T!{PPgUGvo2kx}C6`F9VZ&Ay7rUdw&>h3pk1c=x_PnO(sMV>9 z?#)F1!pLsR{)azE)9Gzt|HofNDM2?yfk zQAN$zogSo->FsV119=>JebB>c%SL%?sU4<;!wFTT&)pLaX3@lK=tuQ)f-`A3P@XwA zGkaMQJST&w2gzi8AhqZiYBlIU%15PugN*XjlD9ydsOI15YreV-;;4TnWI zh54;j0FA>TH|;V2s>y6&ppB#HBQ#}Ps91;@Jk36v8{-0fCB?rTF z=}C?kvf|2(Rr#EI46nAfBrQA3dNjT^bF#vDSID{|i-I1#(GivA^t_>>{7dZ~lr9#w z%sI=82p{#4+N2jQj(-^ce#)IG+38B>@74un_W~+py@oT$^NM;fgqT@ za|AO51fz}8qfGd2k@2JT!zaHA8rvO;vY+y4W?&>=o+K~%}jl!joW`gW;_*zUa(a!vq^AH9CD#&*E?W`-X9@pvX3&iQ@PJ!X+`t@{8;q@<$dg$N*(LCp@}_P7D0|-r&@itW9bjQG?f--+sStjNllD#7NN|elo#GB`5lyAfJa}9Et8{M-;F0RTy-1 zqm0IPe?LnhcU(?>E>;k49xt*9;|?oZ1`3y{YU8nsnarQ7|CYlmNbApvBWR<0+RvXQ zZ1Fo$FyEy@zrIhX=7|6g%E$}M*W)Dm3GlsRg9@TDcu8iWdX}}CaNvIU*g!00oCIMd zh)c-^Ide^i(Um;7UHY{5=c)M>P{SkrH6N6GU*$gCqA8n%`4O#%k)!SA+pw$_I&6ko z0&f%w+n1byZLEC^bAj;PA&VYg`?T7n4@FOxWB9T&l#*CBuwjzX2dqO2Y|2G4=&8Q> zQ*vwuX0s6oNhk@Sj1kt6B_a;CJh0;RhZzS7*AtpY6lQ!+F+B@f_qu1X91DC@lm-MC z3|OF-3E}eoNCY_;b`%{Cy!RQ>e#l5jB(*#vf(-E-tqxo52qP8{M@#us?y5bZ<;zOY zAZ)UenLN@QZg*-fGu69jnuM8*os?ixw1^)fi6n!?#Jl(DFWfKOv%4$FTf2{Oj1liq zzH-Z~Y(l`%vrRJCG&Q2_L!pe2CzQ-OuhY3uq2(j5YjivllRmurz)W2wse<>2s;1wN za(()+30{En8D#U~_;=Uc6}I3|?-oK3Q2BoTYj@LeLJnpFqZI#|L@A&Cz!^jm;> z)KiXV4L)66UkX79qhB+G-O{eHrm98&D9dpH*+)6~)-2lncyaXM&)%Mfmr=@NRSZV` zHLGDo(l=Upl%$Jpv9_t4pEm>Zf5#qkzfE0Ax~RuXreIAVsP;TNIc3sUKKK-_nWx8L zVyklgu3x)szSK64b-#$&iAcj3cTGr0rsN1o2@ph~;-8+sm8Q;|{4B`aC_$`@OELb7 z9Mr-1Uz~pv>m?*4c#Xe=q8gtUprT;b4VlKWPh{Imn6|5<)Pu*wezd7^4~Y{>D8x&7 zz|Q=Emnf1%3RwP;PRzMu>8xpQyYkg39a`BQlTwYeGrp($gQkd055hOI z+nsHA!7|aE^9kjeVqco!6=BB#Y)N&BQgkpaWJk8;*Q97k*FLp`>5sAm^hiaX0ESg{ zBU`vpmoMOb8|P@2LxgI#gU~vBcuey%x57E(TU?bxTQ3>d@nhqY!1@LWZ>bcSXtg96 z`($=@I*~BS@yYGSzdfnf3&*7S%)B=`Y(*K1QLJ zAe)cSer1PzG%6}JkC>298zIXuzApOsO?OnieeUn8Wv(C1TW95(G#O?wCmIZPo0z;% zlc0d_mg|kZcdREu!B>4~N*&O+ysSWtZ1Da3xs0`%k$s3lF7B0fStx0PIrSQx>7lG@ z@h$5|f?OtzM3LTadOAlrJGB{Y?#I=^vEb17QiXKYV!xyjpkSq)Vq&N`>eG?LIir$f z5TgQ**(Qvuyfj!=JS)RLtWce+-BWS@s#MQ3d!Ba`CJ}sraNmA?(e(S2R1cxr2Tgft z*;krf>uY1VCkF^7$wv1Jt-Hlgk>J44{7q0vaYli7=&1i(PBF3J1tf?9KmeZx6LOF= zPfh>&c=R;zF{2f-i*dd?erYA)bL_Y~vp9u6s>MtPFSld$hwK|#_fEVs?BDan z#98f2a}tUix@07hCVh$4_jWrUvOB`R*V_K1Z6Bqt9BX(s_7<~Uv-D*z&YHz;x-IaI z8Lx57Sq|0VG3RU=j!vm6^E-3U#gF?{<@2L>FO$joObF)ZR*U8i4-P_Och!z^=;5~mC;($wv8_p7 z1ums*Dz&uAo@H?rx>w7g?1iijXF>*(u5AGL^ zVVTuN8`r5}Pspal=M$QWPv*V)V>}ZyUmP9BD#9KEt`1aema4O1Za|qp`(!3J;N>vh z&zz?6qeO%h=S0c;b19?(T7?+)oZ#u&DpvMv$`sD7nRd6Hg2Px(x1-`>x{U^ze->K)h^<`9xt<(3}h59pepwstrfpFz1XdS6Qs@Er0s@ZIB4hX&E0-MakwuIpRL@Z$|*iJs{8ZujP^z@=Bi zgt=<-Ienbg*7bF+X&>b!O!0mmn7oKx@XZqIm6oJzJgO24@4O%WMc0xn^e;IM10vXI zF#N%aNiH(DMdiMqyJpSx7q){xW=|yAA0gS6m1A#%GcR11$T76QCj7q^_6p(IuXy(9 z7cq4W^m&5@PI%}=l)+peXx z-+F)J9()od9VXO^yB$#xY5AxtROm!C)@}KBn0+M)> zt%hFZer3E3Z>OHo@v5fw>FexAE41Uva`h z3#;n`MA0(YM4GEHh8kYG+!98KQ)^MFNdX0#U&Ntb4@+~iGB!m_)>@sD($ZwY(MZc@{V!CPrn5W?(!jpoWVMqSk>)bGIb6?g z)suaTl5;ca)|ppB1>qBrwn*-uFUDE+pa7w@PopA-wDaj=yb;jYqGDp)C(u|hMiABC`GIA1B8}|kP!#bL%DLwM>Zia; zDftw}guP5hK)y0mbd}1flAiw4iZQ2m?rQaGjpvPplPVQnDvJ!Wy5GqjEjy}65&xb@zJHhALrFNa4h3lUc8mvh((=VzS z68lr&rC;OPW^5#KG^^o;&h6#~);w8?KjGQcp?pJ9`dbo7>OIFS{^5vc#SM)^PB2_> z9`aWx3XQX?#cftyH(OU1OaG&Ym{i|k(vkJ6mqxafW`h}DU92DZ*EU4j8#+kOye>-j z#xqi5_VrC~ocX<<8vR}nis@}MEwx4OtKQ3mzV;!ID;pcrh`Pm8rU;blZ*RnUg}^AH}DmImopP#NAPC;H$5-WX#;`1V0B-#w?O zD54)luIL(H^pAomk@@RhPKe02hW872WE>yqML`FsR2zBtI)|evjEa41bbrRJHoPQh z33D0Kv+E~DW}^D<{HWQaXKs@=q>9rDqLW2TXAi*p1Rvj8P);&GA|k+eqlEC|Y~vj% zKV&@!mu7Y0IbZsyIOns<6oI#8^o-X4RKgbiR^R*jgT<=Mw|-Vd^9KZB203MaiGq7s zHh&{C+(7#{1s%Mv)G;bjW)ejjH>{w3a6;dfoH2i-@-f)-p{StVIEgZ#VU12_Hp}@{ z)Wf4$q5EPxnnlxu1=nn$T%!QUJxl>&CHbN2yE*4{7IZCa%1MFtH1CS9-&pHS|Iz(| zqcv5;I9o5#Ep4q7T*2?BF^&YM-2)yDc9XA&NM8MU;$4@PB15|Muy z*vk-O89JF$p2P4)iENEBwViW(&iI@cG_)cCa7NRc9Cyf=HNyY-A@Xd!BO2(Es@sr9 zn!Kbu7V4wRCU{UOf6QobPP#o=b`Y+g@Oxhm{V8p=oUyPnE!Xk#i#m|p3cWz^>qJA{ zkzymT5==x>dfbPwK)(e3(#N_ZJz9b=P_c=2TpQ~;k4+ZB;+Z7|scE7Pru*Bi-TJ5~ z3%5sYDH`GpAgrJ^f&aArbU~kHg}pA{`wOIJW+s}}+L^i}3YAt0zZ7k|?0m?^yv*)L zX?#U%J3FU>?@2T=j-!L&!-}?(-*D5l(?}TwP3rb;b*sumFVQ)Q!CI_ELpauJ;%3_t zX_NC-lEWXPiVpHjuWwpx(om=<>ksyWhHi50FG+B~Fa?nK{`u*}ptebd1ioLy^JC$stBYW#Rh!o>W@GU}SKLno%~0DLjc?c+ zj@w~YfkM^!>o#dsB85cW5r$TZSyUtf)Qsk$AJ7K^PFHYBPJ(VKiiuB+-8G$GbB=2f zUJ|dZx!D})K(g|BQxuz*PH3$=#G7s=ds@lQkd1eq94AI5Um)ZfytW|s@B!2Hn0_rU=3KJ6~Wb9T6C z^kAiV4 zs}P&?7@CfH!l>&x*I%%5XP_{Gw(G5SJ|pQ&X%=e?;9eEzvPG^(nz5>iS! zOi`j|;x)cmMtv%|qK+?qggp$mB$eH%DW;XSQ8M!K_&Vl`TEDyuV<{y)jE95Ny_+FY za)(!L2{{%59;%fJ(FShAT{cUqj%&iz8Y$f_`>;U&OH7Kg!sZ_!$VY2d=|%$U=;BgKxw`yzgNSyEK)KSOqj~JHoc65) zd%Dtu{Xq(hfzM)Cd9#xm)puprPp_TuSORo3mWTd^ciHQ@n}$EF3;+U{B+yshbFIW{ zYil#@|AyEtY4{N$BUVfZ}4yBs%P~d4HLccvk^(oj;cJJ=#Rx za2=DYlXYl08(6u-0h!4f7ta?pK<6u9cz^Y&b64x4T@-kvcpXS}*MGbGk(*ny(Rxlw zKj8V=6liAxoj+%qd%6;x`uJIWui2t^cxoCPp&@~cVlUH zBKZO^apjBQbmZbLhe+CraO{Z7-@sy;3`n20jMI=zeK%?O_;gDCEZ8(%ZHAzaUB{&n z$prCvdcKGdvHLMI88&ACc#q@TPtSeai^7D-qgO`GcDk;U)#cZ8N;Wp-ZsK!RoZENjJ2qOSnowT{;8BSpoOgyJ z0U8zPp^v^iKT3|ol1c*cWe8|KReQLnsYXOZ#IqIdjKtNDEj`H9+AXsan#~o-VxI#Y zCQVxxj1rQIISH#eAys0M9saX6w0A%=Jp@Gzk1|ms=&k8Z<&+!|8=K;wm6MaRogYqy z6&V?6qZRGUdVddZ0-36*-RLe1`d?H4LI#?~4cdl-Lt!%!ez_}LStzTcfH9YmiTL;L zAI2A<`yyIeTICKoNnXE)Mz@7N3i7(hYR#UNF@P@$RVu{>^fz2&JVvKw4+-e%%D-K= zId6bMmQ@;?S(sZUXntf?c+B*N6KxwqNUIEl2!vLTKY z^Yk3rBqgMz#?lDF%8=qIAy^=!dN{(6%C?6ms1L4F$w|KyA=8D+gNFZ77U8N@bi@# zU)zT&CfzFSI@8c`-M<94F#j(%G2BoOI4vcpYHqbsCEOSyuI~*r(9qD^K6eG{#lr_{ zO$LgZ(9&;W$pp(il5KD^x$UulcEhaueJH-6lTR_636!=E##B&EO^xSC-3SP);3)$X zY*G#fK>;DK!|DVph&E>>+r_+bbyPB$Q99TY1-s#gIVeZ(7R0)yB@vY-%7HXCR?qUS`+be;5u~d8D9c* zNrKMj{Pz?om?;9oULxm2yiR$(H}UCMY#CgLMW2iSK==wR&?OEIQit{%sM=d=%*SBs zp$Y%r4M~6VMGLT+vgpXjiDzO2+GZYmK&uuH*dG6wV-&*2zOHZ-5j+a)cvQ%H5FEQ2 zcAwZ!o^`iG0j(2GNNlzlA zH7t~l!vi27}FV7ue$JsSb9g7(Yxk|jrH)A=x{gzOS2fV&>=Nzah>_U5-=Z3fn{4eHwf z@b84Oo#d-6fWcGm$WTHsm;yTgij(zzKx`?I?Hx5W;}Wk$urliK}sAs-bH zkq6wPkT-k`pp#089XkO)hYviS$}*>A{SiV4IJ`J7dt(5IuI2-IzHsPed8iya)4 zh>D6T01$S$d#}wPgoAX;oc!NiJ{1N{HVA&F04F64;LrdjrW(;=zpBZ+8Wh~!Y`au# zqm}4P74ULjdg8jXvt!N&Q0iRvE9y6GQq2v& zaciKYzi28gZ9k4I8v+(fOG6VTbhin!ENjYoHHiHszNbgn!1X7Wjn)^g+U5x$6A|W% zmm&^2#>Byq08HLS>u1^1!*R{kvSsc}xkkl7e<-plWjIxss44(E%~$7)2g`y1I5{kZ zNlyykapw!A(Y*lz#(K6$w&{Vd9zN;?$cD{@ql25KYKIBnHvr%<@tNsi1u)=rA|8iI z5BGGrKyDcOPY?QQ8-PA5L%jyX-QPx6ZL}@Fy%`p&^t2Y*-!3^bJU{HjyH6iKLV}lo zjrqXB!ZK^cS??Oi9=5E2G7N~;KRl8NKLGd@`sr#*-1qO_i)KTWprWbv_xIm0eaV(} zk4*go9JrbpN><6f>)>MP^tO?ctHDTYYarUs7f2#ERqVUn{M}%|jXOB7;`hC)RhKIL zlB=XvqEO~OHZl~AZ@u2`el>(|G`(1*x3@_+g~nJ6usDuYExMcDc>#C8-LwXt&n1OC zYS8a?{Sz(=Ef(0Gbtck-2-~bRCGAPT{V1ui_v`VZ;!TsbGRZTOoc%uqr%!p>`8ATu zZxBgpT123(>-B=xc%)(@VcOtu*Wh3&!<&@Y%IhhCPRjq$(v8*U7Et@ghv8w=-Egw` z-3y2vT1DGWjml&{H--y!$Ivvzp+$)&r!6oW z1}DIAJaKKcDJKFEa@-#eF43Bn;2;FZ>_)rshT3a}IL3L=J!7g(%w_m#nH zlrh2G(8Yd_H}p&GzHjvm53GY;8fEwp91;{Gf>r$N>?}wcb<-nwk`M+vX)^n>8W5EC zdf}XL*Hlu`s_iW-O29w)Jx&Nn`CKFnwQwfba|OIq{n432TC0_Plix*y0Ji^bg&zZj z-OS8v4~k?DaC#{(k7*0vRxvF2^0P$G-QAVHPSg)D!NbAW2-Kuyhnhxu!e*h5e_8G= z0NaM&$qu@1diO8jhZv)DvYzMTe2pO&Cx+z_Q)s4x16tIdlc1>m5v$dep$PWBCnT60 z+9o6NtdT1Ozw^w`Ti1HfY1H|;<{X|RO8f4l*pwK;g=17aC23S~)j_bo=^Drl5XfgK zh?d1u0EHPdW~s~v>_Qq5Ec_>{#%aD@n-WgrU#9;MT5zGhN)4vvZ}n3YSH5fc)bw0L z3O6bE`LiCqmN~9lW2;hYEYyDN@wZr9Qbt2@#9lD5#d`8DfivR@bd!u{L03-XpKhO#vWe$If zdW(6A$!PKZLv4xIlqf-Ab@bNK}@rL1z6c#Mrn2D{ZJ+fN8qw4MgOP;u$}+H_7`P?fl8$!hSj za$qtB^97h){1C@MXq>MILtT9zVJz~KgQ4T72ITsB5nx=7-`xjNq1{Rs1KFxslrJ5e zd!Rlo++XOAKUHwVQHm(ZBVJt*Y_mIpp~>qbw{-_#L^3}$NysvbI*dX)OF0Y^g-oswtO?Y~Iw|3pgfLyv+xf zKNEy}%0U6{&XOf}8&-i;#O6=k{C!ZX?J#06M*1p@FFg95tg8`4Xvyx^{fwV13UTq1 zW{-+#&7G2cp3X-qTrw2kf*8pJJeAw)XsemV@L)_J4(B>YQ3VQ0A|-i)X8-a~J_3G< zh@4~*mq;xIDA7$s+}U|!C4|@ zW^2e-FmK3a5|^h$=l!2dcC;zOX?Vcp2I2m=D>6A>I&e(t#_Op%+xomB@G(yHK_Al0 z6pE<_5q!|YQ4-L=0RnQEGeO!jlaPE^dgCmk?xLRZ8oj3PA2bf1AkVd-l9ZI?eTc~*%}(qQWREK@nh8r7G#hGfZ(vwJ19Q6#FF)E_-eRs{yVJf-TPLw_wQ-Xh2Vpo8Ep zAi;3F$QM~WJp&#NOI`e^Di?-Z$(%5UjB}Wb&tSH10N7E9nAA0d2V?;}g5l*_z_$_%2VDVK+r&ip-3c&zlUN4}$%}9w1cnlIesX~-gOCfP z3ROCYz^H$wa#^s+1+M4STu!MqyVJ@8uN!{*-5LP0qe-WT$GKBmX1x&!;t(61u~EraxB2Cp_?QC)oR6xhDoK2qGIwW_X{wm`mmR3#5+f+ zMu#(mTpcD;85GG(YiMF(;s#`K6$XMODFbge5j+Ma6V#=L(XG;?Arw(~_im7IKNuxK zn;**hfN*JZggl@KP>x3>xFK#o7*BgyZ&dZqRT&MHJFDCN5H(eduwwmZLHbaG6u@jv zmS&A16E^Ca+nl1yO|CPUa__I_X?Jblu4jP>_*^~$*r7^=X4QN(){d0Oxi?VdGe#|i zpbJ5w@OSF}JBl5#wSd>>St1~j@hS_?bF>2uy1mi(wzyM*R*$5ipoqfW2O zqH%&0-M8|h3{axpl%fCf7`;;rbGH1SC4Pvn7NVh% zvbgIPfjtg02}>&@$bzo(7VU=xmA=gwuK+`~?RcwA0&C;Fs7G~%T zBW`VGiy~JR%m~7Jbub9SOxAD)C)a?wc2?5)X9gEQ>9GLv1l|)cxIEwO=W{rWSV6U; z&zdK7LbV9$C;BQLhN1$SXs|F{~(!_^j+ zHlxvw!$$}Lor4e;XrclFjt zS}B0Jy2nP(bJMr!F@-7c)o+Ev-gm=`Ec-zacuf8V;SH$PPooY0x zz2FPL`R$=_s6l}7dGiTGy%T z2+TvyA`P=P{r9xaCP=g_JgFB*7ql!jdH+s31?XuXrJ1G3NWTb*@xkqN?eo_5GMPHC zR`@=iwx|Ikw618oVHB;xQ?$aBfqZza$&_>`l?D-~TPNR}GNbWXW&sbU0Bp1%pwYKQW)CZwGLW(TO78ptZU7Ny zSNW;*(kdbx|BWw>OGUrG^Gq0thteewihJ@sD=N}&VzAB(o>=GPF-E!fx>F86GdpxL zJp9WS4Oow?JnXx*g!d+Z+CKR?jTriNfZzQ{c`8S6p;|5mI(j#jfGxODm&tyk+o0sm z(&iJOF%*U(zK&;hFz(wJiTloSI^Nlw+R2@g%ObCkp*S#i zkd#Cq-2l&1P#kSowRz6 zzbXk89K*m>0)Lty>-P#YMJ$3Wx5Z=@9samMmp2#i=MhAJ+>PF8dl1q4tZl#O0u>Gg zk!$mNlw`|!CmV_yN*^njp5Xh3+V|}g21TseUAcIqAn#mGDrWhnqp}c69oR9~Px**o ztYzx%cowXFx8bQKs{Gw>4H`NH2HKA^K|Y)jGNhBzpT1u;|8`|gWii5g(_evsf789O zp{b(G_DBw@K)tVuhZ+uB~X-gIl- zrC0gbHjr@#j+3&_3Ic<@I2afrxxN>X>pfN0z3<>#6iO~AhL2P99P)vEn29C*4EZr# zZa`g<5#-aLRGL_qq&gLF!FcXtR#iFAXsba&n7@cX~-xMSQq?)`GVT*hz= zW4q5j&wgU9Ip><|$Heh|Xg`LnypGPgF@xbIQ?|5mNm_OKX81AbvdOSnMR`OREs9!8 z-_G<0pfKll{pCWZC_Nduy;Ad719{$8KUDoQ3(=z~Jp;8QjpOIZ(wT9gQsfVb=4mg< z@j#b9KaXl_oL2A^!=|9R{G!%veEznHAvFx$HP+rC4e34{?YD>T8Pg6v>GZB;Kj;t} zn#~?apPJrox7$w*CL~9G+}Y5c!ZDY#H_YCCULu1D1?J zF9dg|N@J3k-ogW3D7V&PdJII2f*|P4bUWWE)D{h}C7IytWR%L7ET=EFWFYfzNr+Zmt;4hzcS)2(-A>TzQ9XB z&zIb=S+gOJsdUE767(b&X<8y>!y@cuh9nql*`qw zHm6pT)tjxCOW0zRiVSKM84B&rssIJ1E`MDo-ScZ?1P{7>O&>OHrC}o?BATlP z7gC*^oQN11<@^KTnkAP5x8duA$PDPpE7b?_l2TWePaKT~CKe`r)k$f4DwCgaOQO7M z|8J~q0(CM*rk^MGBH2RN*f~+<*)hY}k2T^eHYz!>ux*?_o5qLmDmw|s`TYzK(DUVx z=`%rr)D@m9vp|oQjZ8sgQJ}oK#0Xo^-p@Z+1Bxns+kDz0RlkDJIB5xjx5?Q^TU z6%ByPLYCmyXSMtR6`ZzE3_}7y;nP824h2IinBTnr0^LWY!#l}n-(KagbnQ{9dFB=v$f1E*R1nGG^-^g?c-9sc0>^j zmxv+BM|P8;NU)=~T^Yn(Y@v537Xi{@k4_o(jE`TLMjGwpCwTxLSZr*rs=sY9luRaEr+L!((=PG7D*ub z^>nd;(9em~OGE@8`MWq``)U=VPxPZ$=W(d%8< z9^Bqup;wTY?aU0G*@lZI`z&CHbV7N;6Xf@jg_Wz z&R8y^f+j~;`Gws-k$zlFDDAyvz(p~(}(sm(aVEZ zF%YHoXS_nYBF{vx)=(OaSPrsmr-@H?k9Rqv9G6;Ju-zr*O0AoHJxZ6_BUKCdQ`+@Z zPW&__%~y>-s?_lL7+k{&;_x zi?|2G5RP4#6VD|@H8cp%LDqA}JZ%6?b_DQwCYjT_vHl95RtM5ir%sx|SV0 zC~X3aZOz7lA`9>_39{&=(X)>6So>$mcvy#0U|CE43H9G}F$B;&2nu%TO8JLU;eB8( zeSwaK)A^8>gA>*7FTpitD2x(Oh=PekOVAZ*^YUhoA?i)OQ7|elt(*JEpo`TI5Q|$ZZUGm%C&2Te$&AoF+YdiZiEX2WpHC2B_g$_@FzWXp`l72@Ugobs=v7M* zV&BC2f?jHmmc+0^dJhT5q#-B6%b`oR%`fPjEFW1!XXzf@2*(UVQt5*e;=PqtTU8Cm z!H5Wl?7O{BgyzcNB>Ch4&>mTCKW=FD&rUi=3LGtT(vR2rLQ(LT3bcuOJ4vnXpwu|j z*VT^VTtTU1Ne zIJ6*DedoAz*NtpmP4$F~ghbbTvTg5h-d<e1`!2!;!1>}7U>K=2>6C{>w4eE zLESpit+L6e@Z3%D#rU2QT>TIq>lF~==K?$#Jjtxk{q3b{v!wE~ud)?s+H|9;C=8=|~`qMt0atLsf`2!-|0>JkH8w+JUGy)bqpD_Qg z^qWAJCzF!8O1Ocbd=F zF}4Cvi7{@p>jxkL$r)tnW;uX;0v5t#{$@R+WcctQ2?{XV)i224XLRA93>aC#A0#lh zo?&e}a6@QkD-EAJZjXtAhzSQ~7FECY4Zs!8cP2xxq&1Xci(R6;(78$(9UD?dZaRS{a=sb6QCP8DI>OA}G_(2QXED?aL=X zQh#p~D6^su#Cuy6u^CIP1tJ<}lC&1%K8lCW{kfAu> z_V)IeL9k^20O6_Vbx{?&^+0+Hu<*Am9iOytVp)H_>f{?$7TgqL5Yv3E^^(;L3U?cq z5I;Lqlm20A1-$ks@T3Eb36QM6Ky{*z{oiO&yC<|}pn!U}QX-{P{I72?K!v~zco(t# zomix)M>vi}xH_kOjh)42u8qyjF@WW(U)$+N;v-r(1C5j?)a=q!B!Cbw}~7V1F}Iaok+UY>e30BMmYE;UNl;1 z_$euB4A>gc=|Uiov7#`F*Wkg>XAq-+ab)2u@gtw4JAk7OQoyEr-4xC#)4^)Ba62DJ z0|lCLGadSK_)91>XRif>T@FabS}1DGoYo68Yt0q@(dRRU5%PL^q+m!L%~d1x@#Fqy z&>+?=$6_C@KA{c*g;%kYBgHSWzy@ZR!D+As`y zaN`9uAphDQ?`=4yd%g7dd~tH$CsKRvmew1U5NXY2XjPr$GBwCm*o70Yi^+0&T&)DM z`SY$GdtI$OcLTyDFckQC(*Ny!Z-l^R0wh9WRDmBA&})6L)Ck4B{uYH|8U97@;o#+M z`E^@S){%P(D33gF3W%c^sv}dadFZV`0rElseb`l6wCXUg9Ut+>8aZ(o;r9~%&yAl& zqd<+Qp2Rc2%_c{ZNK&x_Xm)6x|1JXt3?Orl3MR}j6C{BDY;u2hxBizHMTcDZgF*uP zB#Od4P{~e@?Yyv+%BWRXSa=3}EeE7yE%(90lRbgx-S1<;ocJLmBxDBkunM*X z){@mP`G6dV$>M|Gqy@0oIpK(9p)mxKvV`5@%sa3{w!AM#-dk=@hjJHS|0`9h`smA#7lXf{_<=rG&$7k5`#8E=YJ@3Vnk=NHiuZH!R(T-0+WMtZU} z{78mPz@tSaQAYhkm=Z5BO#lw3Yxq&JX@&=2t9$l8(<~0a{0X3{gO;B^?HMZm-?O!i zt*ybH;L%q7Vdj$i4f77lle{0+bdxv6Xl0AQ=B%htg@eS1@eT-H*SXDsg==+o5MeN&Rqa%$hKJ`m(I^r=+Rk(xEs&7 zffAnp5W!jvZ7vJCh9#&-o~aV*5(q?jgXhf^-=}{?kr!GoHkqqN=_hJD(}eQ2`1vuw zM;6MuF!@4Fq{g+IGd$knw9)s<`}_M# zN;;*WpgG#;EbU4Z-2x6aHI!3(2M(9e^I{-fvJ=#$(GL3Hw@abu3N>`a0mL9UHH zBEWzH52uMb9QT)6c{o69O{ev_<>m8UrSOFXt;RDLEYpt33i)g?1t$z0^ zcoc9&oKrT!51@@9%=Tf0?qkLFpwgvK8?hdd7)g8{BNrvcD2V=>|8A=DQWQ1_961!B z=P!%Xlkfoih6#nuv<0q$GZ=OaNI` zKdL%vcPv^7df5GY@_@3s$mnPT`6dNL#SMf0Upn|NU;d3wVgx%iolv-PM}~(jDuy95 zK8NFKsA0w)rMc?n!z2N9_vF>iqp z{%xlSqNbB&w}i*ub0&Wfy4JRs0LR>D6f?O*7GL1f2LYgvQobw^lw?6&`(obmbkMSd z?ZV`uAmd3I7-VU^ave%!g~lR;{2uRJ-A?{|(@#uBtG5H+8tl<=AV5=R&<+{naN1J~ z9oyL0$aTU2&t8P~#3O-a_Fg=v5@>qWy>9oplBkF!r@;vY6>63^fQ`Wd3c@{YIgzok zM)FPQfH(pnYV?7>P0R5!G{6wXF@f1`@ZVL5l6D&dI7yE9$g0xPVM9hiwT)0ED~ab> zlom}AHUt_f|3`{}n5b8ejZ!VhZdhFTa?K^-PQWPjS96J8twwsxfO2iE?CHR`s>XHO`*`-17sapPsXV-(EA2H z#fSlgxhcG^(a_ichv}!|_PHC7eX^zPg5s-85Fn?N%64~RVQ|-8*Z)on7LLTBA!%q3t<(_taScc-CK~Nc34z6$)+>Tt z`~N5uum?;K{&#{U5{l^P5K~f6h#R9AgFIqv09-(;8Vp^^{mFq*H*Kqb6-UhpAUx8XoYx8!juvu*H81^OPRq2{aLecNJYyl({+ zudjf31DaA4{&m0DQ(txOiy+Ad*me~3xSj*{ZPIz8Ew1*^iRTGUa)slji#ZGB_we8r zc~5m;V4j8hweX&tU6d_EoB|!lQi4W(&GD_DR<>QV%G(OFv$zR{+v{-?=WP&gLY$Y-?KRRdgG=UWzR`?a9OmzS^mJF zzN48w4si*0W2;HDw!**uC+9>Z4jpYp25DwWA%XGSDbKR$CMr7%DIF?Yx^sCxyZz>! z>u(l&-euRcE%zzc2m$#iO%(*wKju;*!k_r!KZ*R^hF?sL;wxFPAFVadegWc0gMU(}x1_lSu*@*q)RFsrs4J20OE!C=Du~YZz z&E~=1YmXA6q&r~DSxz?K*zu~UogRql%c#CpX6G#LpU78nyp!;sbUB)DRuQYX_QJi2+mdk==oV2ou{a&8?swVLJT#LGiX=J65O=$zJ2X=5|d8K#3U=T?0(qlRp3v={K!3i&tk(kKC(17W*4EzCZI5>{$=Fh z!^4zq*48cCEfo<7xAu;{eBtEK^w&1)y*sTQTlb4eF^3!5S^ud`6GsvPcf4D+9r%Rm zLERbc3zc_VTv?TkySjh1WqC9-n+5Wg+-!mZ$gaI4rDni#`MN~6S+pFSOWDg#|6pjZ zTtDc1$J8t|VmpFQypw8E|2(8X2$Se_X}TOQHH<2GnsicLdS{=ZT83Ny2d&?JNj)BBh-8N)E2%abpTN>~hYGDx8ciimup z(|;?WR=@AFMe>C@B;Mbp5BLq`6aCr!-&z16`+H7~x&fZLA@<&)I+|{F8~zKoGT$9% ztBC|OVG%X_t}`})wGZM8>s4F^BXu%r@vr=Pa&z61^TUnHUZ+L<~C zkpfmOzuOnOJ}g{cnpWAjr|BZCgU#5M1Bnq81^5dNioC0RB5!H4Up!=%5N*gY39E^` zGB7wZL`D&m?B(WFJxkHKaOulF-*gv#H{ocB6SL(Bxje*!FYGBO9+Dp!WKaLOgnq2( zyu888H|U{N3%?srS#&Kgk0~zgidCDoKl9o`UZ+MrHNopFho@t{j+dBT`LC*9lKjmz z=eC3grCjQ{i^j5SVoLW$N>+Mc`uw;{ms`rg2V(#!6ix1eii^Et?r0==WK2vn^gXMo z(O)Y;NBof9&Dsce;(RiQ0mYs>7n#W%@;wBWknT{h#E@B~M_PCj4qIoqP-Iq^y~50p zLuceiNiX-S@<#Yd+srFn3;rzWvANiAE?&bDDh4rTOlZ&e+EK#y;wJMb4*SBkbjx>f#-u9VX|@|846(tfu8NP11itV3Ma{^7xS0&^Zmx$BLzjyKq@|wZ<;6Vjgaqef z?X(hNjZ?O$q?GR|DVoR2^wZr<#*|cZ*?RL{B znxD1qHMRKcD8w=`Elj@mn2(E1%pQE2>BRdI>ebflY=R_IWYthu*)Z~(76>Ouoc3mH zlQrLxWx>k4MgTBuK}dO47TLZL`iRM}@*unkBO|?(l$_KBZ-T)nam7iAr<3bb?cpZpnGe8L2aqzY>i5O?%-~`R%uzT zM6re07n_D$jk5cW*}#-VmVk}=-__YS{@pq&nVXEXF*Yiv!IvqV zR?(foL#oYjM{HGQdFgq0PlpUo#TuXPtaz0}kKG$h2u|1jWQUe=K(Q7?zb zIR5+afuw9|#Ls$iB-iaC;egK>f3AqDNq6^1yH0)abhvo1Ww1_Z!+m$3ul(8jKK!jR zx)IvU%y-(1)s#Mmp&Vpz+nG?w>o)ieWbmKcq^b3a=?>0qc9iIK6^*L#+rbP zig`aPEBiQnxOz8Om0X?J!%if3tl1to=ej*gBE z!24J3wt2h^b7Zj^QM~OXV=c$~&x)aSr%XpJb;O!Z*Ume;H_dze-=iwCTL#7CWPFLW zXgLGNs~?WbinE%;c#dyKCI}D*y?ODt7VS{1n;>s>h^%~jEQMD6F{ullg8|>x$NTx6 z!I^w5lf*eaVDSdW@TWqW8@fdk`^LpO)H=X0%}gMX6HFeq`bgZVMg|4> zg)!=-zS$L2>Hd1vWpm_0!xZ$ooS4WKpB$l!m1mM~=B}Oi3Mm@T@}rY6e39My)*P?& z_oOghMNWno-pn-9d`(F@Zba;|UcQ;S;)k4wpO;N!@AT1;7YWWQ^|uX5rkVNK@MK>! zq`9Y;zZLUiw&x_Q!DDeBF#4J1@XQELXRtvYQFqoD&1EHXHt~(Ke7?qSuOf7X+Gq|g zas~6FE`?kS({1Vrs4rR=+dGn3n5YJLxZHY)#HaJ8P8eyXNfx=t z(G?HHkK58N%-9UVWpq7=l;o15bJaAJ)~dG&OG46vo#&d`ugy%E?mXo_hy}j>go{2{ zF% zRi$0+#}nIORdgu+Udh(-s-2APuI+N|6WcO zMKv7YI=A=W^jp|=P(LePtV3qU+Y`ojC&a>(CozE89G#e1cddC{tGz_}4z`%CYBGCB zT}u8yz07sQ+tA+&P4BlCVLkP?8%A&MHp1a=HLDv3AE{PU){DGvV{9KWJh@@SWP6ya zhIdwOdSapyqkSEB*&^{-30^Z?yUe@^^7vVWj-+my2M8XfL zG+j0+kxp9Cu9>}|THyOCd6ZwjSSo=@zEG~tu4=HDC!@ya9hQH)(l>MTCvPsM`5G}rH=Zxh{&T+tBW!?$jeVCky&%LIeEU z-2i2mwq7En#-PweoWpBc|}=#;m0sbGl+4;!wn-LSB1XiE@4Ih&heSc%%lQnSLqD;+`so zl$-BVM!90;hZ?%fg{4>B635YU)gtM3Wtdy}Svb zVg2H%vElvGF%-I*u{Y%GMnx)>rlHiQ+4&Tv7CngSUh}N^3Ff!Ro;wDz({x3WwMJ`v zza33qS8pcrOm@28iB0wDxY@vMhchILeC^*hJ+6ja_qQ$gD-G{B`#G5PKvLT;XCJSt z%i0IO3u{;x<#zAlmSz-Xdj25#jmcta5$!X1nPMi%Jhg5)W6pS%);C|j@q65*Y3r4V zAjq{2zWsWX<@4ZSXV9n-mpS*IX*pegkYQ^dK_4;xWGIaNo!ckMa1|48(J>t-e=+z- ze0e(c3wJl>QV-q5rdZrM`8zto%BcHUyk122V#V@L6k%y$vdu)9QBl+htv!&yMVt`v zH8m~SOZ(Y^)@KCMGQBJ5Du10Xbp|L<3s^*dgz`mM>h_kzkJ&k+J^|P`7>-uQ0Hmb zEZ63M_50stL{QKT(WyXc(I4@jlp=1upB$N66f^!f9#N7RuDPXQmdI@jD%5z(bdk$t znyf@U^kEZz7ayT6&%2T@si(>|??3;{YH8%|_4vn=+-G9@sQ=3QSu2;w1oK(UR$&S} z*{2?-G}^7>_i6G$K{O5cKJt$W-Q0D08Y1vx)p)A|{l^_qauxT5aWe+B8Ch=&+bzU_ z-KWTe1-P<3*&MAz^|3hAfLzA4UxNIU=tp zP&e2 zZL0&E*+Usz>I$$d4hv;!Drhejd`H>>RP*=R{_Mod;O0BOGcY=UVte7-_^LB0QX*?lqva<0EFFFdg*6~2>MD`5#X#nnh4FA6zrvFdJ{QtK%`?>%KSI|OamC*p$_;{U` zHSH96l~F>c*XW-P7|Td0X=xF_kkt#qUc&$qz6tL>wf z)|)Va`mkGbOUv~u=BIxoH9(npX$xe*`kO;ZOIy-y0003?%mcL};N`M)(4N=R+Wzm) zORnu>2NYZ=|0^2gOC~p$4S3Q+qBq^jE367G4b`^8Lby_K3F4>dWK?ZfmRyR zON9*cQEvhf47SqTnG6gKCnsp4dq!!1IHE0ipz7)4;la+6ihyu_e!gUPb)^69-MfMl zP^VS64KkUH`tJxbSP1yOeuoogqfv#&Y9RrQu9w&!V*gBdli2uuChIN;Qg%)>kC z3JWD8+)B)V$ zKr&gycPB*gv?sQ^bn@CtnU`;uE^m&50;nM2F+M|P{;{tmUc**_Z(UA6vRhHXa(WOTMSmF#&xVoWQnJ_!SIz1CI;mM)Cm~Y z7N@7}cOfTmuf)g>6s20Af|eyox=0+^J4rH97J5sEqTg3A(!EH^Dk`f$#C?hj>4`L# zVu7Ob%Im8$X01V?p}U9X<1mzq@)qXiO7ukt=L!@Z3Ah}rVClsTJObZQC1bESiYVit z<6A)ey8uSI$sgLrtDvBu15^Zk1s31+uup!QhsvhFLE3Y`R*HkyBd5xUT#g@Y=cq!|Mp1BW@n$ zC3F`+K6*C-~xAgDNA9;*uH>mskks~ zo{TVz!m16y0NP9IW>m0>ZNLhZ;-zMVp6?C%ulphBpqZKdtA>%r!s7*Mff>ND47}$8 zm7zoF0wh3nrCh2tCKGB_5VcM`2G?RW&pD|;#kCcGC}L;F2FAU6;u88EziO3(nUVSh zY@=7*Bo7%HO%&mmK)&J+Ey;4Er^s>|<5mHPJG5nyV_%&6ME|AnY?X1tY6$&Jvm5jd z6VKf!VPdArsMB2F0AURts{=??!=cy#B^hZJ_AS^WkH9YjAWt%1NDK> zj(mE6Ul8qCiK%*M^QXle6$LwBdy<`*2`k5U{^~1pRt)J{7qQ#Fx95fd3x0yum86SU z8v&~)ts$3I(UQW)L<6_XSz%aBJ1R@~XYa^tm z>bHVkYo@m?kCGU64i2aB7M#f*ZTQ(|pjp_?Dd&A^u3wd%+0S=*`P<|j=RADN zU%%E#^!8G8zkBW<_8cea{hvmlVIiA&9a^vgy5(R|> zcaiLBf7NSe^5iLI6`;k$H0)iyVBEjuJF-OXm3COQU!N^FZWVf=mGC4C6b&aP(jg34I~#X_<}up2Lb%js}|h0b!(qW}>X z#W(cGdnf8wYbMM7w_88B_qi-xa*}&74zH4SJl>S`YOCSme$C0X_-rlvDXA8nk@H89 z>TgOFqcSacda*1U>;1+1TQ@eL?7o$Uz=Oc8#rLH*590#&F_II<|FRq?F;xuSy{+lLZP8$Po(atKQ{Kc>bevL2Up^Vhzp)dKJ% zTH~eOvXzGDcTw-f66F-j9=8nY!`*&cvuoTB#Gxw2Jolydd!_>8pmW^2z;4@{*U&gW zi+|b}Wd;b)LP1kda&mHb5L5i?i5&5tK8<%vSD$`-?&LV#@s}XbfqShdMU4E1R402U1dg>} z(3f<4MPYjV@|FYN`*p%1@zK3~EfGq^_-Bzmv0d-zi(Gi3zNN<-oRf)cqgR#<&qrbF z?C*u!Md=3QZ{!0pq6w*|^h?zGnw(E(|6O=;^rjS^bJwgoH7_p_6;dr?0>u;X?fN&l zj|C0fNVe(N+<~l2sknQkJJ6kL-GWYWo{`t#*Z3IRaI^(lh29Sn#v!}<*d*yR+-jrJ z0h4j$Xc_Y~^%nxrZBnKx?su}ig|13X-T*STm!7**qUKb#&p{`%1F`cq+ zt&QyRrr8pf`guMpL>ctMa zasrd$cdF?$M}J5fiZY+x&J5nLd~OmDv`H=A|J6{c7p+#IrROfHeK&$=ZLY6<%guHwl+f zV766OQ2FazdTqy5inyZxW3f6@>z8l%ed7h;ULe5@ZTm0T3Ly3u9>7Se zs_r#5)UKQNI$CO1*6Ka4$FZ6!fd|3YY3!8V-p@B{y=5l_MVBT1gaiXOe zQgrl8rZLUR$rAQdd)is2Z|%z)I;Y2bxQTLlG-I(pN-ONDz2&ZOWi z=4D&0{_(l|eO4Nana}pu(hlk|;3}k;Ta|7n%e^Lf{%0eY+`z8@R&ilOJh(tfq0MMF zMo6!twC0K>R+F*W0Xs2O|8^-A3w>ABO00UMYUMb=u!Wydw;iALE$vKAF|Kp#5rauX z%+_1|1G}7ouhBR(B~h%PN2Ut}M!$dPTp!Z^iLGEQ@ua?xt7z3~fAz4f_0!F?m&~vo z9=*?og|@|W^v_J8T5BuXWbTJF1}7g58`|EX<$tC1&JGb#G=J0sqp>{AlYMRZ=aJtb z7aT8=shyMGjK+$$Uz?tIrKVMCujT8YA6grf_jS*j$T`lz?TvbC>k>tfdki5Ste8no z&!0H1A0E8BKDB9IxHS8+FTiXou<(dvX+DL-{~C5@O<>w@zAQv}UN-UNb9cGR`9Y_{ zrKi{&H#8Tc?kN;*EgghmprAkiCNL~sxAV)ZpkCt8U%NKzkNrp%4m-7BRsXkOY#BAf z^A^kDpHr>;5-+>*|6(X#r-eQ;s&QM8b;VnmV~hz=zhx9q=hJFBW_+)?+=E<rK~d=bKEs%PMIpdp^i>Y#ehtx;6Z; zBI`2r{?Zh(UZEqU3PeDE52pXxH6C@qV-(z;4X1plPN;wSs-Btiw?2&ORR{uCofs44 zyFeav4cY&te)_3|;d#jGxt#fIIf&5r+18MR>GO}Qq7+9nMHgF+=CBB-?5;4y46;b2B=H+9(K zD@MKd+#b`rFZ7}GQ&ddku@EKiq*%B7r;hzVF_A{*wn2+O6WXGCDtDK-q_+o!`_<3> zdZCpqHMKge_cX9i-d7lH9P-?UbEEV%8ZJaQwJ)z;N}4H^n9KK!9?WgXDj!|aFQeFQRSTL?bfX-$=t6k z&#qKPyU#+`t_FD-EnTm+=cZda(~Dg(a3fL!7Tr=Xx!tnbuHBED`Gy~M13$Sm_o1Qe z|EXgg(hj}YxA`dO+B!0CyI|9}>HL^O;)`f6vrqK)`IuM44WGr&y2t2?dZW89RXl_T z7dBW0QPzo-ViX4hG-td^KK>XsyJR&MqN87f#a+vuku%%ok1;Plgy<%yY?Nn)-+Q-d>`WGkF0B3QEOn~~I4R_JO>c98N5<%iUcdYFL%6#3 z9b~EsZp1d%Vv?@VpSm(+z*2qXLmd?(*KF$WsCeE?%!t_En;I9J^hoV(_pPn8eN~I% z@iCbLS7ScVAaV^fe4hhSn_5t3s#{#LH~d=UX-=`6(ZFDXw%e(7KuF2>?w!&PV9BAP zsX3p0{wB@RSxn;hB}PV=WnkMNY2!zW3-u8r+x!R4{Egd%n1Mf8#{Fy`;udYVK4{W2 z{W_6*o2FCr;p~y_Wc+S3e>1k$^n83rX~11dLnGfUdEBm67`;8!Ts`lCG{0hwC^puF z`nJS$ESm8EqT$r0QdzEq7zr_cP$zxf8w)T^TqCBQf=+g+pu6&B+^X+@ zKnny0DEa`R0Is=+UdN%jdO)yBT^$^=YB#syP}7Nn>nk6%l8RSxD5@~=?yjT^EfmXb z0k)FeQ^0Ba9-r|0uP=}LGe0yj3FsHMQ_Lnw=Fe_`c1qCF!RMx7&&=9NIJV8BVR=vG zU-kKU7AC=t-#8BPrFBX{IppKSPo$uO&-d(}?HBN`F^x5R*R|+%)VwO&O3?mXViS20 zdIvIn&u+C2zbX;s<_iE2B(fov0X&l_!@SXW0vb{9)wc$w1fJBJvsth3#bzxRP!|L! zsES!j7hoD;3yL_?dvTvujXdCw)>P6kxsw+OaQmGy zwZR-dZiS2A?8@oWYkvQQT`t-B>qQ4cqw-9f$4;cpY;lw)es`c(!#KR^Y>rTeb~^Q@azIwl}xyDV3Y{$sPb!QNNMratL0e4}4eEP( zwj#Iu2I~BWGBPL%a~`d@<2OUpXco&#uV8L&K7p8f7b4*O;GyNZ5!YHzo`5aesDA=M z<;ogg@l%Yb7vclHqy85^RL7AxI61R&azt{Yyg~QCmjndCpx9v*6iD=dbn|}!8lT+w zU{23LEtvtR)7tS81?^w}913UMyw3?##h(`csxxs12l#p4t&!~9l9pVadzO zCxV*n8{btRNA3Y-4!6z8(ByTZ@8%uMDdjA7?vK^@YSqz8chh$Qpfh*Y;87z8Txg41208QNPaGuTAt#+RO; zNKa{+o)$=KS;5~cy>tSIX)%-9w3a@!NJs}&F+$vj`LZ_V_KQSR-*fag9n|R_S^VBmh#W^%E7Q-rf0I^}-(EW936`fe z{D`2ZeGQuUD3el^V%t?(YJD8UXFqN|^uz$|Fn&@dXk~>gFt`D?T{=v^g@2syVj<&! z(Rq1PlZ(nB4sW3ycv}@AjyS*-x(G)K&ZW`cZ*+hzo&4D;^r;=1o;kow;WQ@3f7}B# z?w|3d#iEq1&;x}T$)V(g-ME=V#Gz)+#-1Mv(`TetW_ln_#wR2sJc1(G?xWZ7O-8MCA7Y;1Xo$|mrh8G{e_ptN0QR^ulg#bna!e*;q8W01(X zB_vpzg09wd_%YkATd9HII9j%$lfVOb`YcWfn7SbBsz6fp9oH{TZM)^0o zLn@y27wAgkE)i*rFpH%|V7xa|X?}+bU48NuXoWB()aybIpn&mQXXdpcZEsII0z6QB zUuw!(7twbn#)6oj*cLK6I=WQ&3L+oFX16YWXxKk#**WZg6R8xG(cdVsCceyU`Y zt!im$sTl+!-{ZpI4G-yw-NO1tkb{!Z(vEc{8MRK|1_1Qja|L4dQ&Q;1rv~Huq>>?_ zQ;^1d?0kW5L?^0YweCos!9pyReDX18@JCIZ#7k2IBR1T^d{GU1qt{pt;z(yR&UD@< zV8fF|P{TkX&Gt-BkfJjTfl?ud@|VkkZ5jeI)-MN~D~A+jLD>w_qGA{+zlx8(>KPd_ zaKzg>1T;q|@0MRsgp-wewvB|lRxv;yfAn+r|0Ylq51#PEp#K*t_5X&}yYr@+$!wTr S?7n~jKN6y{B4t8)e*XsqO4G^! literal 0 HcmV?d00001 diff --git a/doc/html/tutorial/img/mviz.png b/doc/html/tutorial/img/mviz.png new file mode 100644 index 0000000000000000000000000000000000000000..ac9ad11f2dec954d4b82bc9f69e454875610c0aa GIT binary patch literal 1161178 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

    pEFQi^lihF;zhaTNZro8-{e>uEMdmerPXi45H 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
    iWwnuj>KE+I>GyKXaD7+4WScx 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

    +
    Last updated October 23 2006
    + +

    Introduction

    + +

    Many different hardware platforms (e.g micaZ, telos, eyesIFX) can be + used with TinyOS. This lesson shows you what a platform port consists + of, and how TinyOS reuses as much code as possible between different + platforms. + The lesson will proceed by showing how to do the port for an imaginary + mote called "yamp", which has a MSP430 microcontroller and a CC2420 + radio transceiver. + +

    + The target audience of this lesson consists of those people that want + to better understand what the difference between e.g "make micaz" and "make + telosb" is, and how these differences concretely map into the underlying + files, definitions, etc. + +

    Note that the material covered in this tutorial is not + strictly necessary for regular tinyos developpers, and you can safely skip + it if you have no intention of working down to the lowest level or + developping new platforms. + +

    + +

    Chips vs Platforms

    + +

    + Two key building blocks for any mote are the microcontroller and + radio transceiver. + Of course, both a microcontroller and a radio can be used on + more than one platform. This is indeed the case for the MSP430 and CC2420 + that our yamp mote uses (telos, eyes, and tinynode use the MSP430; telos + and micaz use the CC2420). +

    + +

    + Given this multiplicity of platforms, it would be vasly redundant if each + platform developper had to rewrite the software support for each chip + from scratch. While a chip may be physically wired in a different way on + different platforms (e.g., a radio is connected to a different digital + pins on the microcontroller), by far the largest part of the logic to + deal with a chip is platform-independent. +

    + +

    + Thus, platform-independent code to support a chip is placed in a + chip-specific directory. Writing a platform port for a platform is then + (essentially) a matter of pulling in the code for each of the + platform's chips, and "gluing" things together. + For example, the modules and components that support the CC2420 are in + tos/chips/cc2420. This radio is used on both the telos and micaZ motes; the + "gluing" is done by the modules in the tos/platforms/telosa/chips/cc2420 and + tos/platforms/micaz/chips/cc2420/ directories. +

    + +

    + Note that in general there may + be more to a platform port than pulling in existing code for different + chips, in particular when a new platform uses a chip that is not yet + supported. Developping drivers for a new chip can be a non-trivial + undertaking (especially for radios and microcontrollers); these aspects + are not covered here. +

    + +

    Initial platform bring-up

    + +

    + As a first step to bring up the platform, we will stick to the bare minimum in + order to compile and install the Null application on our yamp mote. +

    + +

    + All platform-specific code goes in tos/platforms/. + For example, we have tos/platforms/micaz or tos/platforms/tinynode. + Our first step is to create a directory for the yamp platform: +

    +      $ cd tinyos-2.x/tos/platforms
    +      $ mkdir yamp
    +    
    +

    + +

    The .platform file

    + +Each platform directory (such as tos/platforms/yamp) should contain a +file named ".platform", that contains basic compiler parameters +information for each platform. So, create the file +"tos/platforms/yamp/.platform" (note the . in ".platform" !!!), that contains the following: + +
    +  push( @includes, qw(
    +
    +  %T/chips/cc2420
    +  %T/chips/msp430
    +  %T/chips/msp430/adc12
    +  %T/chips/msp430/dma
    +  %T/chips/msp430/pins
    +  %T/chips/msp430/timer
    +  %T/chips/msp430/usart
    +  %T/chips/msp430/sensors
    +  %T/lib/timer
    +  %T/lib/serial
    +  %T/lib/power
    +  ) );
    +
    +  @opts = qw(
    +
    +  -gcc=msp430-gcc
    +  -mmcu=msp430x1611
    +  -fnesc-target=msp430
    +  -fnesc-no-debug
    +  -fnesc-scheduler=TinySchedulerC,TinySchedulerC.TaskBasic,TaskBasic,TaskBasic,runTask,postTask
    +
    +  );
    +
    +
    + +

    + This file contains perl snippets that are intepreted by the ncc compiler. + The first statement simply adds some directories to the include path that + is used when compiling an application for the yamp platform (the %T gets + expanded to the full location of tinyos-2.x/tos, using the TOS2DIR + environment variable). Note that we have included the CC2420 and MSP430 + directories, as well as some libraries. +

    + +

    + The second statement defines the @opts list, that contains various parameters + passed to nesc. Please consult the nesc documentation for information on the + meaning of these parameters. +

    + +

    The hardware.h file

    + +

    + Each platform directory also has a file named "hardware.h" that is included by + default when compiling an application for that platform. This can define + platform-specific constants, pin names, or also include other "external" + header files (e.g. msp430hardware.h in our case, or atm128hardware.h for + platforms using the atm128 MCU).
    + + So, create the file "tos/platforms/yamp/hardware.h" with the following contents: +

    + +
    +  #ifndef _H_hardware_h
    +  #define _H_hardware_h
    +
    +  #include "msp430hardware.h"
    +
    +  // LEDs
    +  TOSH_ASSIGN_PIN(RED_LED, 5, 4);
    +  TOSH_ASSIGN_PIN(GREEN_LED, 5, 5);
    +  TOSH_ASSIGN_PIN(YELLOW_LED, 5, 6);
    +
    +  // UART pins
    +  TOSH_ASSIGN_PIN(SOMI0, 3, 2);
    +  TOSH_ASSIGN_PIN(SIMO0, 3, 1);
    +  TOSH_ASSIGN_PIN(UCLK0, 3, 3);
    +  TOSH_ASSIGN_PIN(UTXD0, 3, 4);
    +  TOSH_ASSIGN_PIN(URXD0, 3, 5);
    +  TOSH_ASSIGN_PIN(UTXD1, 3, 6);
    +  TOSH_ASSIGN_PIN(URXD1, 3, 7);
    +  TOSH_ASSIGN_PIN(UCLK1, 5, 3);
    +  TOSH_ASSIGN_PIN(SOMI1, 5, 2);
    +  TOSH_ASSIGN_PIN(SIMO1, 5, 1);
    +
    +
    +  #endif // _H_hardware_h
    +
    + +

    + This file simply pulls in msp430hardware.h from tos/chips/msp430 (the compiler + will find it because we have added this directory to our search path in the + .platform created previously) and defines some physical pins using macros from + msp430hardware.h. For example, on our yamp mote, the red led is physically + connected to the general purpose I/O (GPIO) pin 5.4. +

    + +

    + Some other very important functions (that are defined in msp430hardware.h + and so pulled in indirectly via this hardware.h) + concern the disabling of interrupts for atomic sections (atomic blocks in nesc + code essentially get converted into __nesc_atomic_start() and + __nesc_atomic_end()). How interrupts are disabled is of course microcontroller + specific; the same applies to putting the microcontroller to sleep (as is done + by the scheduler when there are no more tasks to run, using the McuSleep + interface). These functions must be somehow defined for each platform, + typically by means of an #include'd MCU-specific file.
    + As an exercise, try finding the definitions of __nesc_atomic_start() and + __nesc_atomic_end() for the micaZ and intelmote2 platforms. + +

    + +

    Setting up the build environment and building the "null" app

    +Before pulling in existing chip drivers or writing any code, we must set up +the build environment so that it is aware of and supports our platform. + +Once this is done, we will define the basic TinyOS module for our platform, +and use the Null app (in tinyos-2.x/apps/null) in order to test that our +platform is properly configured. As per it's description in its README file, +Null is an empty skeleton application. It is useful to test that the +build environment is functional in its most minimal sense, i.e., you +can correctly compile an application. So, let's go ahead and try to compile +Null for the yamp platform: + + + + + + + + + + + + +
    +  $ cd tinyos-2.x/apps/Null
    +  $ make yamp
    +/home/henridf/work/tinyos-2.x/support/make/Makerules:166: *** 
    +
    +Usage:  make  
    +        make  help
    +
    +        Valid targets: all btnode3 clean eyesIFX eyesIFXv1 eyesIFXv2 intelmote2 mica2 mica2dot micaz null telos telosa telosb tinynode tmote
    +        Valid extras: docs ident_flags nescDecls nowiring rpc sim sim-cygwin sim-fast tos_image verbose wiring
    +
    + Welcome to the TinyOS make system!
    +
    + You must specify one of the valid targets and possibly some combination of
    + the extra options.  Many targets have custom extras and extended help, so be
    + sure to try "make  help" to learn of all the available features.
    +
    + Global extras:
    +
    +   docs    : compile additional nescdoc documentation
    +   tinysec : compile with TinySec secure communication
    +
    +ERROR, "yamp tos-ident-flags tos_image" does not specify a valid target.  Stop. 
    +  
    +
    + +

    +The problem is that we need to define the platform in the TinyOS build + system, so that the make invocation above recognizes the yamp platform. +The TinyOS build system is a Makefile-based set of rules and definitions +that has a very rich functionality. This includes invoking +necessary compilation commands as with any build system, but goes much + further and includes support for other important aspects such as +device reprogramming or supporting multiple platforms and targets. +

    + +

    +A full description of the inner workings of the TinyOS build system is beyond + the scope of this tutorial. For now, we will simply see how to define the + yamp platform so that the "make yamp" command does what it should. (For those + that want to delve deeper, start with "tinyos-2.x/support/make/Makerules".) +

    + +

    Defining a make target

    + +The TinyOS build system resides in "tinyos-2.x/support/make". The strict +minimum for a platform to be recognized by the build system (i.e., for the +build system to understand that "yamp" is a legal platform when we enter "make +yamp") is the existence of a platformname.target file in the +aforementioned make directory.
    +So, create the file "tinyos-2.x/support/make/yamp.target" with the following +contents: + +
    +
    +PLATFORM = yamp
    +
    +$(call TOSMake_include_platform,msp)
    +
    +yamp: $(BUILD_DEPS)
    +	@:
    +
    + +This sets the PLATFORM variable to yamp, includes the msp platform +("make/msp/msp.rules") file, and provides in the last two lines a make rule +for building a yamp application using standard Makefile syntax. + +Now, let's go back and try to compile the Null app as before. This time we get: + +
    +[18:23 henridf@tinyblue: ~/work/tinyos-2.x/apps/Null] make yamp
    +mkdir -p build/yamp
    +    compiling NullAppC to a yamp binary
    +ncc -o build/yamp/main.exe -Os -Wall -Wshadow -DDEF_TOS_AM_GROUP=0x7d -Wnesc-all -target=yamp -fnesc-cfile=build/yamp/app.c -board=   NullAppC.nc -lm 
    +In file included from NullAppC.nc:42:
    +In component `MainC':
    +/home/henridf/work/tinyos-2.x/tos/system/MainC.nc:50: component PlatformC not found
    +/home/henridf/work/tinyos-2.x/tos/system/MainC.nc:53: no match
    +make: *** [exe0] Error 1
    +
    + +So there's progress of sorts, since now we're getting a "real" compilation +error as opposed to not even making it past the build system. Let's take a +closer look at the output. The ncc compiler is unhappy about not finding a +"PlatformC" component. + +The "PlatformC" component must be defined for each platform. Its role and +placement in the system is described in more detail in TEP107. For now, +suffice to cite from that TEP that: +A port of TinyOS to a new plaform MUST include a component PlatformC which + provides one and only one instance of the Init interface.. + + +Create the file "tos/platforms/yamp/PlatformP.nc" with the following contents: + +
    +#include "hardware.h"
    +
    +module PlatformP{
    +  provides interface Init;
    +  uses interface Init as Msp430ClockInit;
    +  uses interface Init as LedsInit;
    +}
    +implementation {
    +  command error_t Init.init() {
    +    call Msp430ClockInit.init();
    +    call LedsInit.init();
    +    return SUCCESS;
    +  }
    +
    +  default command error_t LedsInit.init() { return SUCCESS; }
    +
    +}
    +
    + +, and create the file "tos/platforms/yamp/PlatformC.nc" as: + +
    +#include "hardware.h"
    +
    +configuration PlatformC
    +{
    +  provides interface Init;
    +}
    +implementation
    +{
    +  components PlatformP
    +    , Msp430ClockC
    +    ;
    +
    +  Init = PlatformP;
    +  PlatformP.Msp430ClockInit -> Msp430ClockC.Init;
    +}
    +
    + +Now, compilation of the Null application finally works for the yamp platform: + +
    +[19:47 henridf@tinyblue: ~/work/tinyos-2.x/apps/Null] make yamp
    +mkdir -p build/yamp
    +    compiling NullAppC to a yamp binary
    +ncc -o build/yamp/main.exe -Os -Wall -Wshadow -DDEF_TOS_AM_GROUP=0x7d -Wnesc-all -target=yamp -fnesc-cfile=build/yamp/app.c -board=   NullAppC.nc -lm 
    +    compiled NullAppC to build/yamp/main.exe
    +            1216 bytes in ROM
    +               6 bytes in RAM
    +msp430-objcopy --output-target=ihex build/yamp/main.exe build/yamp/main.ihex
    +    writing TOS image
    +
    + + +

    Getting Blink to work

    + +With the previous steps, we now have the basic foundation to start working on +our yamp platform: the basic platform definitions are in place, and the build +system recognizes and correctly acts upon the "make yamp" target. We haven't +yet actually programmed our mote yet. +

    +The next step in the bring-up of a platform, that we will cover in this part, +is to program a node with an application and verify that it actually +works. We'll do this with Blink, because it is simple, and easy to verify that +it works. As a bonus, we'll also have validated basic timer functionality once +we see those Leds turning on and off. +

    +As a first step, let's go to the Blink application directory and try to +compile the application: +

     
    +[19:06 henridf@tinyblue: ~/work/tinyos-2.x/apps/Blink] make yamp
    +mkdir -p build/yamp
    +    compiling BlinkAppC to a yamp binary
    +ncc -o build/yamp/main.exe -Os -Wall -Wshadow -DDEF_TOS_AM_GROUP=0x7d -Wnesc-all -target=yamp -fnesc-cfile=build/yamp/app.c -board=   BlinkAppC.nc -lm 
    +In file included from BlinkAppC.nc:45:
    +In component `LedsC':
    +/home/henridf/work/tinyos-2.x/tos/system/LedsC.nc:38: component PlatformLedsC not found
    +/home/henridf/work/tinyos-2.x/tos/system/LedsC.nc:42: cannot find `Init'
    +/home/henridf/work/tinyos-2.x/tos/system/LedsC.nc:43: cannot find `Led0'
    +/home/henridf/work/tinyos-2.x/tos/system/LedsC.nc:44: cannot find `Led1'
    +/home/henridf/work/tinyos-2.x/tos/system/LedsC.nc:45: cannot find `Led2'
    +make: *** [exe0] Error 1
    +
    + +The compiler cannot find the component "PlatformLedsC" that is referred to in +the file tos/system/LedsC.nc. As the name indicates, "PlatformLedsC" is a +platform-specific component, and thus we will need to define this component +for the yamp platform. +

    +Why should there be such a platform-specific component for accessing Leds? This is because at +the lowest level, i.e in hardware, Leds are implemented differently on +different platforms. Typically, a Led is connected to a microcontroller I/O pin, +and the Led is turned on/off by setting the appropriate output 0/1 on that +pin. This is in fact the model used on all current TinyOS platforms. +But even in this simple and uniform model, (and disregarding +the fact that future platforms may use different hardware implementations +and not connect each Led directly to an I/O pin), we have that the +lowest-level to turn on/off a Led must be defined on a per-platform basis. +

    +Now, consider Leds from another perspective, namely that of the Leds.nc +interface (defined in tos/interfaces/Leds.nc). In this interface, we have +commands such as get(); in principle such a command does not need to be +platform-dependent: the code that maintains the current state of a Led and +returns it via the get() call does not need to be re-written each time a Led +is connected to a different pin (of course re-writing get() for each +platform would not be much overhead given its simplicity; this argument +clearly becomes far stronger in more complex situations involving entire chips +rather than individual GPIOs). +

    The key notion that the above example is simply that there is a boundary + above which software components are platform-independent, and below which + components are specifically written with one hardware platform in mind. + This is at heart a very simple concept; its complete instantiation in TinyOS is of + course richer than the above example, and is the topic of TEP2 (Hardware + Abstraction Architecture). +

    Let's now return to the task at hand, which is to make Blink work on our + platform. If we take a closer look at the file "tos/system/LedsC.nc", we see + that it contains a configuration that wires the module LedsP with modules + Init, Leds0, Leds1, and Leds2, all of which are to be provided by the + (still missing) PlatformLedsC. Taking a closer look at + "tos/system/LedsP.nc", we see that the Leds0,1,2 modules used by LedsP are + GeneralIO interfaces. The GeneralIO interface (see + "tos/interfaces/GeneralIO.nc" and TEP 117) simply encapsulates a digital I/O pin and + provides functions to control its direction and get/set its input/output + values. +

    So, we need to create a PlatformLedsC configuration that shall provide + three GeneralIO interfaces and an Init. This is done by creating the file + "tos/platforms/yamp/PlatformLedsC.nc" with the following contents: + +

    +#include "hardware.h"
    +
    +configuration PlatformLedsC {
    +  provides interface GeneralIO as Led0;
    +  provides interface GeneralIO as Led1;
    +  provides interface GeneralIO as Led2;
    +  uses interface Init;
    +}
    +implementation
    +{
    +  components 
    +      HplMsp430GeneralIOC as GeneralIOC
    +    , new Msp430GpioC() as Led0Impl
    +    , new Msp430GpioC() as Led1Impl
    +    , new Msp430GpioC() as Led2Impl
    +    ;
    +  components PlatformP;
    +
    +  Init = PlatformP.LedsInit;
    +
    +  Led0 = Led0Impl;
    +  Led0Impl -> GeneralIOC.Port54;
    +
    +  Led1 = Led1Impl;
    +  Led1Impl -> GeneralIOC.Port55;
    +
    +  Led2 = Led2Impl;
    +  Led2Impl -> GeneralIOC.Port56;
    +
    +}
    +
    + +We refer the reader to the TinyOS Programming Guide cited below for more +explanations on how the above confiuration uses generics (ie with the "new" +keyword). For the purpose of this lesson, the key point is that we are wiring +to ports 5.4, 5.5, and 5.6 -- we shall suppose that these are the MSP430 +microcontroller pins to which the three Leds are connected on the yamp +platform.

    + +With the above file in place, we can now compile Blink for the yamp platform. +How do we test that the application actually works? We have thus far presented +yamp as an imaginary platform, but it turns out that the above application +should work on any platform with the MSP430x1611 microcontroller and where the +Leds are connected to microcontroller ports 5.4-5.6. +Not entirely coincidentally, these are exactly the Led wirings used by the +telos/tmote platforms. So those readers that have a telos/tmote at hand can +test this application on it. (Testing on a tinynode or eyes mote is also easy and only +requires changing the pin wirings in PlatformLedsC to follow those of that +platform; running this application on mica-family motes will require more +changes since they use a different microcontroller). + +

    +Now, enter the following command (where you have suitably replaced /dev/ttyXXX by the appropriate serial port), +

    +  make yamp install bsl,/dev/ttyXXX
    +
    +and you will see the Leds of your impersonated (by a telos) yamp node Blinking! + +

    Conclusion

    + +

    This lesson has introduced the notion of per-platform support in TinyOS + using as a guiding example the development of a platform port to an + imaginary "yamp" platform. We have seen how introducing support for a new + platform requires touching not only nesc code but also adding some rules to + the build system. This tutorial also touched upon the notions of Hardware + Abstraction Architecture (HAA) that is central to the clean and modular + support of different platforms and chips in TinyOS. +

    + The steps outlined here did not cover what is the hardest part of + a platform port: developping the components to drive a radio transceiver or + MCU (which are necessary if the platform uses chips that are not currently + supported in TinyOS). Developping such drivers is an advanced topic that is + beyond the scope of the tutorials; for those curious to gain some insight we + recommend perusing the code for a chip (e.g the CC2420 radio in + tos/chips/cc2420 or the xe1205 radio in tos/chips/xe1205) armed with that + chips datasheet and the platform schematics. +

    + +

    Related Documentation

    + + + +

    +


    + + + +
    +
    +
    +

    Top +

    + + + diff --git a/doc/html/tutorial/lesson12.html b/doc/html/tutorial/lesson12.html new file mode 100644 index 00000000..719e3dce --- /dev/null +++ b/doc/html/tutorial/lesson12.html @@ -0,0 +1,206 @@ + + + + TinyOS Tutorial Lesson 12: Network Protocols + + + +
    Lesson 12: Network Protocols
    +
    +
    Last updated Nov 3 2006
    +

    This lesson introduces the two basic network primitives of Tinyos-2: +Dissemination and Collection.
    +

    +

    Dissemination
    +

    +

    The goal of a dissemination protocol is to reliably deliver a piece of data to every +node in the network. It allows administrators +to reconfigure, query, and reprogram a network. Reliability is +important because it makes the operation robust to temporary +disconnections or high packet loss.  Dissemination is  fully +explained in TEP 118.
    +

    +

    In TinyOS 2.x, dissemination provides two interfaces: DisseminationValue and +DisseminationUpdate. Let's take a look at these two interfaces:
    +

    + +

    tos/lib/net/DisseminationUpdate.nc:
    +

    +
    interface DisseminationUpdate<t> {
    command void change(t* newVal);
    }
    + +

    tos/lib/net/DisseminationValue.nc:
    +

    +
    interface DisseminationValue<t> {
    command const t* get();
    event void changed();
    }
    + + +

    DisseminationUpdate is used by producers. The command DisseminationUpdate.change() should be +called each time the producer wants to disseminate a new value, passing this + new value as a parameter.
    +DisseminationValue is for consumers. The event DisseminationValue.changed() is +signalled each time the disseminated value is changed (the producer has +called change), +and the command get allows to obtain this new +value.
    +

    +We build now a simple application (EasyDissemination) where one node +(the producer) periodically disseminates the value of a counter to rest +of the nodes in the network (consumers). +As a first step, create a new directory in apps +named EasyDissemination: +
    $ cd tinyos-2.x/apps
    $ mkdir EasyDissemination
    +Inside this directory, create a file EasyDisseminationC.nc, +which +has this code: +
    #include <Timer.h>

    module EasyDisseminationC {
    uses interface Boot;
    uses interface DisseminationValue<uint16_t> as Value;
    uses interface DisseminationUpdate<uint16_t> as Update;
    uses interface Leds;
    uses interface Timer<TMilli>;
    }

    implementation {

    uint16_t counter;

    task void ShowCounter() {
    if (counter & 0x1)
    call Leds.led0On();
    else
    call Leds.led0Off();
    if (counter & 0x2)
    call Leds.led1On();
    else
    call Leds.led1Off();
    if (counter & 0x4)
    call Leds.led2On();
    else
    call Leds.led2Off();
    }

    event void Boot.booted() {
    counter = 0;
    if ( TOS_NODE_ID == 1 )
    call Timer.startPeriodic(2000);
    }

    event void Timer.fired() {
    counter = counter + 1;
    // show counter in leds
    post ShowCounter();
    // disseminate counter value
    call Update.change(&counter);
    }

    event void Value.changed() {
    const uint16_t* newVal = call Value.get();
    // show new counter in leds
    counter = *newVal;
    post ShowCounter();
    }
    }
    +We assume that the  base station is the node with ID = 1. First +note that the base station will periodically (every 2 seconds) +increment a 3-bit counter, display the counter using its three leds,  and disseminate it +through the network. This is done using the change command provided in +the DisseminationUpdate interface:
    +
        call Update.change(&counter);
    +Second, note that when a node receives a change notification, it +updates its counter value and shows it on the leds:
    +
      event void Value.changed() {
    const uint16_t* newVal = call Value.get();
    // show new counter in leds
    counter = *newVal;
    post ShowCounter();
    }
    +The EasyDisseminationAppC.nc +provides the needed wiring: +
    configuration EasyDisseminationAppC {}
    implementation {
    components EasyDisseminationC;

    components MainC;
    EasyDisseminationC.Boot -> MainC;

    components new DisseminatorC(uint16_t, 0x1234) as Diss16C;
    EasyDisseminationC.Value -> Diss16C;
    EasyDisseminationC.Update -> Diss16C;

    components LedsC;
    EasyDisseminationC.Leds -> LedsC;

    components new TimerMilliC();
    EasyDisseminationC.Timer -> TimerMilliC;
    }
    +

    Note that both Dissemination interfaces we use are provided by the +module DisseminatorC.
    +This module provides  the Dissemination service:
    +

    +

    tos/lib/net/Dissemination/DisseminationC.nc:

    + +
     generic configuration DisseminatorC(typedef t, uint16_t key) {
    provides interface DisseminationValue<t>;
    provides interface DisseminationUpdate<t>;
    }
    +Note that we need to specify to the Disseminartor module a type t and a +key.  In our case, the value we  want to  disseminate is +just an unsigned  two-byte counter. The key allows to have +different instances of DisseminatroC.
    +
    +To compile this program we use create the following Makefile:
    +
    COMPONENT=EasyDisseminationAppC
    CFLAGS += -I$(TOSDIR)/lib/net

    include $(MAKERULES)
    +Now install this program into several nodes (make sure you have one +base station, that is, one node whose ID is 1) and see how the counter +displayed in the base station is "disseminated" to all the nodes +belonging to the network. You will also notice that dissemination works across +resets, i.e., if you reset a node it will rapidly re-'synchronize' and display +the correct value after it reboots. +
    +
    +For more information, read TEP118 [Dissemination].
    +
    +

    Collection
    +

    +

    Collection is the complementary operation to disseminating and it +consists in "collecting" the data generated in the network into a base +stations. The general approach used is to build one +or more collection trees, each of which is rooted at a base +station. When a node has data which needs to be collected, it +sends the data up the tree, and it forwards collection data that +other nodes send to it.
    +

    +

    We build now a simple application (EasyCollection) where nodes +periodically send information to a base station which collects all the +data.
    +As a first step, create a new directory in apps +named EasyCollection: +

    +
    $ cd tinyos-2.x/apps
    $ mkdir EasyCollection
    +Inside this directory, create a file EasyCollectionC.nc, +which +has the following code: +
    #include <Timer.h>

    module EasyCollectionC {
    uses interface Boot;
    uses interface SplitControl as RadioControl;
    uses interface StdControl as RoutingControl;
    uses interface Send;
    uses interface Leds;
    uses interface Timer<TMilli>;
    uses interface RootControl;
    uses interface Receive;
    }
    implementation {
    message_t packet;
    bool sendBusy = FALSE;

    typedef nx_struct EasyCollectionMsg {
    nx_uint16_t data;
    } EasyCollectionMsg;

    event void Boot.booted() {
    call RadioControl.start();
    }

    event void RadioControl.startDone(error_t err) {
    if (err != SUCCESS)
    call RadioControl.start();
    else {
    call RoutingControl.start();
    if (TOS_NODE_ID == 1)
    call RootControl.setRoot();
    else
    call Timer.startPeriodic(2000);
    }
    }

    event void RadioControl.stopDone(error_t err) {}

    void sendMessage() {
    EasyCollectionMsg* msg = (EasyCollectionMsg*)call Send.getPayload(&packet);
    msg->data = 0xAAAA;

    if (call Send.send(&packet, sizeof(EasyCollectionMsg)) != SUCCESS)
    call Leds.led0On();
    else
    sendBusy = TRUE;
    }
    event void Timer.fired() {
    call Leds.led2Toggle();
    if (!sendBusy)
    sendMessage();
    }

    event void Send.sendDone(message_t* m, error_t err) {
    if (err != SUCCESS)
    call Leds.led0On();
    sendBusy = FALSE;
    }

    event message_t*
    Receive.receive(message_t* msg, void* payload, uint8_t len) {
    call Leds.led1Toggle();
    return msg;
    }
    }
    +

     Lets take a look at this program. First note that all nodes +turn on the radio into the Boot sequence:
    +

    +

    +
      event void Boot.booted() {
        call RadioControl.start();
      }
    +

    Once we are sure that the radio is on, we start the routing sub-system +(that +is, to generate the collection tree):
    +

    +
    call RoutingControl.start();
    +Next we need need to specify the root of the collection tree, that is, +the node that will receive all the data packets. For this, we use the +interface RootControl:
    +tos/lib/net/RootControl.nc
    +
    interface RootControl {
    command error_t setRoot();
    command error_t unsetRoot();
    command bool isRoot();
    }
    +

    This interface controls whether the current node is a root of the +tree. Using the setRoot() command and assuming that the base station ID +is 1, we select the root of the collection tree as follows:
    +

    +
    if (TOS_NODE_ID == 1) 
        call RootControl.setRoot();
    else
    call Timer.startPeriodic(2000);
    +

    The remaining nodes in the network periodically generate some data +and send it to the base station.  To send and receive data we use +two interfaces that will be wired to the collection tree. That is, when +we call the send command, the data packet will be sent through the +collection tree.  Similarly, the receive event will be only called +in the root of the tree, that is, in the base station. When the base +station receives a "collected" packet it just toggle a led.  Now +we will see how to wire these interfaces .
    +The EasyCollectionAppC.nc +provides the needed wiring:
    +

    +
    configuration EasyCollectionAppC {}
    implementation {
    components EasyCollectionC, MainC, LedsC, ActiveMessageC;
    components CollectionC as Collector;
    components new CollectionSenderC(0xee);
    components new TimerMilliC();

    EasyCollectionC.Boot -> MainC;
    EasyCollectionC.RadioControl -> ActiveMessageC;
    EasyCollectionC.RoutingControl -> Collector;
    EasyCollectionC.Leds -> LedsC;
    EasyCollectionC.Timer -> TimerMilliC;
    EasyCollectionC.Send -> CollectionSenderC;
    EasyCollectionC.RootControl -> Collector;
    EasyCollectionC.Receive -> Collector.Receive[0xee];
    }
    +

    Most of the collection interfaces (RoutingControl, RootControl and +Receive) are provided by the CollectionC module.  The send +interface is provided by CollectionSenderC which is +a  virtualized collection sender abstraction module.
    +This is an extract of the signature of the CollectionC module and +CollectionSenderC:
    +tos/lib/net/ctp/CollectionC.nc
    +

    +
    configuration CollectionC {
    provides {
    interface StdControl;
    interface Send[uint8_t client];
    interface Receive[collection_id_t id];
    interface Receive as Snoop[collection_id_t];
    interface Intercept[collection_id_t id];

    interface Packet;
    interface CollectionPacket;
    interface CtpPacket;

    interface CtpInfo;
    interface CtpCongestion;
    interface RootControl;
    }
    +

    tos/lib/net/ctp/CollectionSenderC:
    +

    +
      generic configuration CollectionSenderC(collection_id_t collectid) {
      provides {
        interface Send;
        interface Packet;
      }
    +

    Note that the sender and receive interfaces requires a +collection_id_t to differentiate different possible collections trees.
    +Note also that the CollectionC module provides some other +interfaces in addition to the ones used in this example. As we explained +previously, the CollectionC module generates a collection tree that +will be using for +the routing. These interfaces can be used get information or modify +this routing tree. For instance, if we want to obtain information about +this tree we use +the CtpInfo interface  (see tos/lib/net/ctp/CtpInfo.nc) and if we +want to indicate/query if any node/sink is congested we use the +CtpCongestion interface (see tos/lib/net/ctp/CtpCongestion.nc)
    +

    +

    Finally, to compile this program we create the following +Makefile:
    +

    +
    COMPONENT=EasyCollectionAppC
    CFLAGS += -I$(TOSDIR)/lib/net \
    -I$(TOSDIR)/lib/net/le \
    -I$(TOSDIR)/lib/net/ctp
    include $(MAKERULES)
    +Now install this program into several nodes (make sure you have one +base station, that is, one node whose ID is 1) and see how all the +packets generated in the nodes are collected in the base station.
    +
    +For more information, read TEP119  [Collection].
    +
    +

    To experiment further
    +

    +If you want to experiment with a more complex application take a look +at apps/test/TestNetwork/ which combines dissemination and collection +into a single application.
    +
    +

    Related Documentation

    + +

    +

    +

    +
    +

    Previous LessonTop  |  Next +Lesson  > +

    +
    + + diff --git a/doc/html/tutorial/lesson13.html b/doc/html/tutorial/lesson13.html new file mode 100644 index 00000000..5499a5df --- /dev/null +++ b/doc/html/tutorial/lesson13.html @@ -0,0 +1,379 @@ + + + + TinyOS Tutorial Lesson 13: TinyOS Toolchain + + + + + +
    Lesson 13: TinyOS Toolchain
    +
    Last updated October 29 2006
    + +

    This lesson describes the details of the TinyOS toolchain, including +the build system, how to create your own Makefile, and how to find out +more information on the various tools included with TinyOS. + +

    TinyOS Build System

    + +As you saw in Lesson 1, TinyOS applications +are built using a somewhat unconventional application of the +make tool. For instance, in the apps/Blink directory, + +
    $ make mica2
    +
    + +compiles Blink for the mica2 platform, + +
    $ make mica2 install
    +
    + +compiles and installs (using the default parallel port programmer) Blink +for the mica2, and + +
    $ make mica2 reinstall mib510,/dev/ttyS0
    +
    + +installs the previously compiled mica2 version of Blink using the MIB510 +serial port programmer connected to serial port /dev/ttyS0. + +

    +As these examples show, the TinyOS build system is controlled by passing +arguments to make that specify the target platform, the desired action, +and various options. These arguments can be categorised as follows: + +

      +
    • Target platform: one of the supported TinyOS platforms, e.g., mica2, +telosb, tinynode. A target platform is always required, +except when using the clean action.

      + +

    • Action: the action to perform. By default, the action is to compile +the application in the current directory, but you can also specify: + +
        +
      • help: display a help message for the target platform. +
      • install,N: compile and install. The N argument + is optional and specifies the mote id (default 1). +
      • reinstall,N: install only (fails if the application wasn't previously compiled). N is as for install. +
      • clean: remove compiled application for all platforms. +
      • sim: compile for the simulation environment for the specified platform (see Lesson 11 for details). +
      + + Example: to compile for simulation for the micaz: +
      $ make micaz sim
      + +
    • Compilation option: you can change the way compilation proceeds by +specifying: +
        +
      • debug: compile for debugging. This enables debugging, and + turns off optimisations (e.g., inlining) that make debugging + difficult. +
      • debugopt: compile for debugging, but leave optimisations + enabled. This can be necessary if compiling with debug + gives code that is too slow, or if the bug only shows up when + optimisation is enabled. +
      • verbose: enable a lot of extra output, showing all commands + executed by make and the details of the nesC compilation + including the full path of all files loaded. This can be helpful + in tracking down problems (e.g., when the wrong version of a + component is loaded). +
      • wiring, nowiring: enable or disable the use of + the nescc-wiring to check the wiring annotations in a nesC + program. See the nescc-wiring man page for more details. +
      + + Example: to do a verbose compilation with debugging on the telosb: +
      $ make debug verbose telosb
      + +

      Additionally, you can pass additional compilation options by + setting the CFLAGS environment variable when you invoke make. For instance, + to compile apps/RadioCountoToLeds for a mica2 with + a 900MHz radio set to ~916.5MHz, you would do: + +

      $ env CFLAGS="-DCC1K_DEF_FREQ=916534800" make mica2 
      + + Note that this will not work with applications whose Makefile + defines CFLAGS (but this practice is discouraged, see the section + on writing Makefiles below).

      + +

    • Installation option: some platforms have multiple programmers, and +some programmers require options (e.g., to specify which serial port +to use). The programmer is specified by including its name amongst the +make arguments. Known programmers include bsl for +msp430-based platforms and avrisp (STK500), dapa (MIB500 +and earlier), mib510 (MIB510) and eprb (MIB600) for mica +family motes. + +

      Arguments to the programmer are specified with a comma after the +programmer name, e.g., + +

      $ make mica2dot reinstall mib510,/dev/ttyUSB1 
      +
      $ make telosb reinstall bsl,/dev/ttyUSB1 
      + +to specify that the programmer is connected to serial port /dev/ttyUSB1. + +

      More details on the programmers and their options can be found in +your mote documentation. + +

    + +

    Customising the Build System

    + +You may find that you are often specifying the same options, e.g., that +your mib510 programmer is always connected to /dev/ttyS1 or that you +want to use channel 12 of the CC2420 radio rather than the default +TinyOS 2 channel (26). To do this, put the following lines + +
    +MIB510 ?= /dev/ttyS1
    +PFLAGS = -DCC2420_DEF_CHANNEL=12
    +
    +in a file called Makelocal in the support/make +directory. If you now compile in apps/RadioCountToLeds, you +will see: +
    +$ make micaz install mib510
    +    compiling RadioCountToLedsAppC to a micaz binary
    +ncc -o build/micaz/main.exe -Os -DCC2420_DEF_CHANNEL=12 ... RadioCountToLedsAppC.nc -lm
    +    compiled RadioCountToLedsAppC to build/micaz/main.exe
    +    ...
    +    installing micaz binary using mib510
    +uisp -dprog=mib510 -dserial=/dev/ttyS1 ...
    +
    + +The definition of PFLAGS passes an option to the nesC +compiler telling it to define the C preprocessor symbol +CC2420_DEF_CHANNEL to 12. The CC2420 radio stack checks +the value of this symbol when setting its default channel. + +

    The definition of MIB510 sets the value of the +argument to the mib510 installation option, i.e., +

    $ make micaz install mib510 
    +is now equivalent to +
    $ make micaz install mib510,/dev/ttyS1 
    + +Note that the assignment to MIB510 was written using the ?= +operator. If you just use regular assignment (=), then the +value in Makelocal will override any value you specify +on the command line (which is probably not what you want...). + +

    Makelocal can contain definitions for any make +variables used by the build system. Unless you understand the details of +how this works, we recommend you restrict yourselves to defining: + +

      +
    • PFLAGS: extra options to pass to the nesC compiler. Most + often used to define preprocessor symbols as seen above. +
    • X: set the argument for make argument + x, e.g., MIB510 as seen above. You can, e.g., set the + default mote id to 12 by adding INSTALL ?= 12 and + REINSTALL ?= 12 to Makelocal. +
    + +

    Some useful preprocessor symbols that you can define with +PFLAGS include: +

      +
    • DEFINED_TOS_AM_ADDRESS: the motes group id (default is 0x22). +
    • CC2420_DEF_CHANNEL: CC2420 channel (default is 26). +
    • CC1K_DEF_FREQ: CC1000 frequency (default is 434.845MHz). +
    • TOSH_DATA_LENGTH: radio packet payload length (default 28). +
    +

    + + +

    Application Makefiles

    + + +To use the build system with your application, you must create a makefile +(a file called Makefile) which contains at the minimum: + +
    +COMPONENT=TopLevelComponent
    +include $(MAKERULES)
    +
    +where TopLevelComponent is the name of the top-level component +of your application. + +

    TinyOS applications commonly also need to specify some options to the +nesC compiler, and build some extra files alongside the TinyOS +application. We will see examples of both, by looking at, and making a +small change to, the apps/RadioCountToLeds application. + +

    The RadioCountToLeds Makefile uses mig (see Lesson 4) to build files describing the layout +of its messages, for use with python and Java tools: + +

    +COMPONENT=RadioCountToLedsAppC
    +BUILD_EXTRA_DEPS = RadioCountMsg.py RadioCountMsg.class
    +
    +RadioCountMsg.py: RadioCountToLeds.h
    +	mig python -target=$(PLATFORM) $(CFLAGS) -python-classname=RadioCountMsg RadioCountToLeds.h RadioCountMsg -o $@
    +
    +RadioCountMsg.class: RadioCountMsg.java
    +	javac RadioCountMsg.java
    +
    +RadioCountMsg.java: RadioCountToLeds.h
    +	mig java -target=$(PLATFORM) $(CFLAGS) -java-classname=RadioCountMsg RadioCountToLeds.h RadioCountMsg -o $@
    +
    +include $(MAKERULES)
    +
    + +The first and last line of this Makefile are the basic lines present in +all TinyOS Makefiles; the line in bold defining BUILD_EXTRA_DEPS +specifies some additional make targets to build alongside the +main TinyOS application (if you are not familiar with make, this may be a +good time to read a make tutorial, e.g., this +one). + +

    When you compile RadioCountToLeds for the first time, you will see that +the two extra targets, RadioCountMsg.py and +RadioCountMsg.class, are automatically created: +

    +$ make mica2
    +mkdir -p build/mica2
    +mig python -target=mica2  -python-classname=RadioCountMsg RadioCountToLeds.h RadioCountMsg -o RadioCountMsg.py
    +mig java -target=mica2  -java-classname=RadioCountMsg RadioCountToLeds.h RadioCountMsg -o RadioCountMsg.java
    +javac RadioCountMsg.java
    +    compiling RadioCountToLedsAppC to a mica2 binary
    +    ...
    +
    + +As this Makefile is written, these generated files are not deleted when +you execute make clean. Fix this by adding the following line: +
    +CLEAN_EXTRA = $(BUILD_EXTRA_DEPS) RadioCountMsg.java
    +
    +to apps/RadioCountToLeds/Makefile. This defines the CLEAN_EXTRA +make variable to be the same as BUILD_EXTRA_DEPS, with RadioCountMsg.java +added to the end. The build system's clean target deletes all files +in CLEAN_EXTRA: +
    +$ make clean
    +rm -rf build RadioCountMsg.py RadioCountMsg.class RadioCountMsg.java
    +rm -rf _TOSSIMmodule.so TOSSIM.pyc TOSSIM.py
    +
    + +Finally, to see how to pass options to the nesC compiler, we will change +RadioCountToLeds's source code to set the message sending period based +on the preprocessor symbol SEND_PERIOD. Change the line in +RadioCountToLedsC.nc that reads +
     call MilliTimer.startPeriodic(1000);
    +to +
     call MilliTimer.startPeriodic(SEND_PERIOD);
    +and add the following line to RadioCountToLeds's Makefile: +
    +CFLAGS += -DSEND_PERIOD=2000
    +
    +Note the use of += when defining CFLAGS: this allows the user +to also pass options to nesC when invoking make as we saw above (env CFLAGS=x make ...). + +

    Now compiling RadioCountToLeds gives: +

    +$ make mica2
    +    ...
    +    compiling RadioCountToLedsAppC to a mica2 binary
    +ncc -o build/mica2/main.exe ... -DSEND_PERIOD=2000 ... RadioCountToLedsAppC.nc -lm
    +    compiled RadioCountToLedsAppC to build/mica2/main.exe
    +    ...
    +
    + +

    TinyOS Tools

    + +The TinyOS build system is designed to make it easier to write Makefiles +for applications that support multiple platforms, programmers, etc in +a uniform way. However, it's use is not compulsory, and all the tools it +is built on can be used in your own build system (e.g., your own Makefile +or simple build script). Below we show how to build and install the +RadioCountToLeds application for a micaz with the mib510 programmer +using just a few commands. + +

    First, we compile RadioCountToLedsAppC.nc (the main component of +the application) using the nesC compiler, ncc: +

    +$ ncc -target=micaz -o rcl.exe -Os -finline-limit=100000 -Wnesc-all -Wall RadioCountToLedsAppC.nc
    +
    + +This generates an executable file, rcl.exe. Next, we want +to install this program on a mote with mote id 15. First, we create a +new executable, rcl.exe-15, where the variables storing the +mote's identity are changed to 15, using the +tos-set-symbols command: +
    +$ tos-set-symbols rcl.exe rcl.exe-15 TOS_NODE_ID=15 ActiveMessageAddressC\$addr=15
    +
    + +Finally, we install this executable on the micaz using uisp, +to a mib510 programmer connected to port /dev/ttyUSB1: +
    $ uisp -dpart=ATmega128 -dprog=mib510 -dserial=/dev/ttyUSB1 --erase --upload if=rcl.exe-15
    +Firmware Version: 2.1
    +Atmel AVR ATmega128 is found.
    +Uploading: flash
    +
    + +If you wish to follow this route, note two things: first, you can find out +what commands the build system is executing by passing the -n +option to make, which tells it to print rather than execute commands: +
    +$ make -n micaz install.15 mib510
    +mkdir -p build/micaz
    +echo "    compiling RadioCountToLedsAppC to a micaz binary"
    +ncc -o build/micaz/main.exe -Os -finline-limit=100000 -Wall -Wshadow -Wnesc-all -target=micaz -fnesc-cfile=build/micaz/app.c -board=micasb  -fnesc-dump=wiring -fnesc-dump='interfaces(!abstract())' -fnesc-dump='referenced(interfacedefs, components)' -fnesc-dumpfile=build/micaz/wiring-check.xml RadioCountToLedsAppC.nc -lm
    +nescc-wiring build/micaz/wiring-check.xml
    +...
    +
    + +Second, all the commands invoked by the build system should have man pages +describing their behaviour and options. For instance, try the following +commands: +
    +$ man tos-set-symbols
    +$ man ncc
    +$ man nescc
    +
    + +

    Related Documentation

    + +
      +
    • mica mote Getting Started Guide at Crossbow +
    • telos mote Getting Started Guide for Moteiv +
    • Lesson 1 introduced the build system. +
    • Lesson 10 describes how to add a new platform +to the build system. +
    • GNU make man page. +
    • man pages for the nesC compiler (man ncc, man nescc) and the various +TinyOS tools. +
    + + +
    +
    +
    +

    +Previous Lesson + |  +Top > +

    + + + + + + + + + + + + + diff --git a/doc/html/tutorial/lesson7.html b/doc/html/tutorial/lesson7.html new file mode 100644 index 00000000..eb58f152 --- /dev/null +++ b/doc/html/tutorial/lesson7.html @@ -0,0 +1,380 @@ + + + + Lesson 7: Permanent Data Storage + + + + +
    Lesson 7: Permanent Data Storage
    +
    Last Modified: November 5, 2006
    + +

    This lesson introduces permanent (non-volatile) data storage in +TinyOS. Permanent storage allows a node to persist data even if power +is disconnected or the node is reprogrammed with a new image. You +will become familar with different kinds of data storage including +small objects, logs, and large objects. You will be exposed to the +TinyOS interfaces and components that support permanent data storage +on motes and you will learn how to: + +

    + +

      + +
    • Divide the flash chip into volumes, which allows multiple and/or +different type of data to be stored. + +
    • Store configuration data that survives a power cycle. + +
    • Provide a link to example code using the logging abstraction. + +
    • Provide a link to example code use large objects storage in +non-volatile flash. + +
    + + +

    Introduction

    + +TinyOS 2.x provides three basic storage abstractions: small objects, +circular logs, and large objects. TinyOS 2.x also provides +interfaces to abstract the underlying storage services and +components that provide (implement) these interfaces. + +

    Interfaces

    + +Let's take a look at some of the interfaces that are in the +tos/interfaces directory to familiarize ourselves with +the general functionality of the storage system: + + +

    +

    + +

    Components

    + +

    Components provide concrete implementations of the interfaces. You +should be familiar with these components because your code needs to +specify both the interfaces your application +uses as well as the components which provide +(implement) these interfaces: + +

    +

    + +

    + +

    Naming Wrappers

    + +

    The preceding components are actually naming wrappers. +Since TinyOS supports multiple platforms, each of which might have its +own implementation of the storage drivers, platform-specific naming +wrappers are used to bridge the general storage interfaces to their +underlying, platform-specific implementations. + +

    For example, the preceding links are all specific to the ST +Microelectronics M25Pxx family of flash memories used in the Telos and +Tmote Sky motes. You do not need to worry about the details +of where these files reside because TinyOS's make system includes the +correct drivers automatically. However, you do need to know +what these components are called because your code must list them in a +components declaration. + +

    If you are curious, the following links will let you browse the +naming wrappers for the Atmel AT45DB family of flash memories used in +the Mica2/MicaZ motes: + +

    +

    + +

    Finally, the following links will let you browse the naming +wrappers for the Intel imote2 flash memory: + +

    +

    + + +

    Volumes

    + +

    TinyOS 2.x divides a flash chip into one or more fixed-sized +volumes that are specified at compile-time using an XML file. +This file, called the volume table, allows the application developer +to specify the name, size, and (optionally) the base address of each +volume in the flash. Each volume provides a single type of storage +abstraction (e.g. configuration, log, or block storage). The +abstraction type defines the physical layout of data on the flash +memory. A volume table might look like: + +

    +<volume_table>
    +  <volume name="CONFIGLOG" size="65536"/>
    +  <volume name="PACKETLOG" size="65536"/>
    +  <volume name="SENSORLOG" size="131072"/>
    +  <volume name="CAMERALOG" size="524288"/>
    +</volume_table>
    +
    + +

    The volume table for a particular application must be placed in the +application's directory (where one types 'make') and must be named +volumes-CHIPNAME.xml where CHIPNAME is replaced with the +platform-specific flash chip's name. For example, the Telos mote uses +the ST Microelectronics M25P family of flash memories. The drivers +for these chips can be found in the tos/chips/stm25p +directory. Therefore, a Telos-based application that uses the storage +abstractions needs a file named volumes-stm25p.xml. + +

    Note that the size parameter is a multiple of the erase unit for a +particular flash chip. See Section 4.1 in TEP 103 +for more details. + +

    Storing Configuration Data

    + +

    In Lesson 3, we +implemented a simple application called BlinkToRadio that used a +single timer, set to fire at a fixed rate, to toggle the LEDs. + +

    See +tinyos-2.x/apps/tutorials/BlinkConfig/ for the +accompanying code. + +

    This lesson shows how parameters, like the timer period, can be +configured at runtime and persisted across node power cycles. The +ability to store configuration data is useful in many applications. +For example, it may be necessary to store a node's coordinates which +are only known after the node is deployed. Let's walk through the +steps to use the ConfigStorage abstraction: + +

      + +
    1. Create a volumes-CHIPNAME.xml file, enter the volume +table in this file, and place the file in the application directory. +Note that CHIPNAME is the flash chip used on your target +plaform. For example, CHIPNAME will be +stm25p for the Telos platform and at45db for +the MicaZ platform. Our file will have the following contents: + +
      +<volume_table>
      +  <volume name="LOGTEST" size="262144"/>
      +  <volume name="CONFIGTEST" size="131072"/>
      +</volume_table>
      +
      + +This volume information is used by the toolchain to create an include +file. The auto-generated file, however, has to be included manually. +Place the following line in the configuration file which declares the +ConfigStorageC component (e.g. BlinkConfigAppC.nc): + +
      +#include "StorageVolumes.h"
      +
      + +
    2. Config storage uses the Mount and +ConfigStorage interfaces (note that we rename +ConfigStorage to Config). + +
      +module BlinkConfigC {
      +  uses {
      +    ...
      +    interface Mount;
      +    interface ConfigStorage as Config;
      +    ...
      +  }
      +}
      +
      + +
    3. Each interface must be wired to an implementation that +will provide it: + +
      +configuration BlinkConfigAppC {
      +}
      +implementation {
      +  components BlinkConfigC as App;
      +  components new ConfigStorageC(VOLUME_CONFIGTEST); 
      +  ...
      +
      +  App.Mount      -> ConfigStorageC.Mount;
      +  App.Config     -> ConfigStorageC.ConfigStorage;
      +  ...
      +}
      +
      + +
    4. Before the flash chip can be used, it must be mounted using the +two-phase mount/mountDone command. Here we show chaining how this +might be chained into the boot sequence: + +
      +  event void Boot.booted() {
      +    call AMControl.start();
      +  }
      +
      +  event void AMControl.startDone(error_t error) {
      +    if (error != SUCCESS) {
      +      call AMControl.start();
      +    }
      +    if (call Mount.mount() != SUCCESS) {
      +      // Handle failure
      +    }
      +  }
      +
      + +
    5. If the Mount.mount succeeds, then the Mount.mountDone +event will be signaled. In this case, we call the +ConfigStore.mount command from with the event handler: + +
      +  event void Mount.mountDone(error_t error) {
      +    if (error != SUCCESS) {
      +      // Handle failure
      +    }
      +    else{
      +      call Config.write(CONFIG_ADDR, &period, sizeof(period));
      +    }
      +  }
      +
      + +
    6. Once mounted, the flash can be written: + +
      +  event void Mount.mountDone(error_t error) {
      +    if (error != SUCCESS) {
      +      // Handle failure
      +    }
      +    else{
      +      call Config.write(CONFIG_ADDR, &period, sizeof(period));
      +    }
      +  }
      +
      + +
    7. Data is not necessarily "written" to flash when +ConfigStore.write is called. To ensure data is persisted +to flash, a ConfigStore.commit call is required: + +
      +  event void Config.writeDone(storage_addr_t addr, void *buf, 
      +    storage_len_t len, error_t result) {
      +    // Verify addr and len
      +
      +    if (result == SUCCESS) {
      +      // Note success
      +    }
      +    else {
      +      // Handle failure
      +    }
      +    if (call Config.commit() != SUCCESS) {
      +      // Handle failure
      +    }
      +  }
      +
      + +
    8. Finally, when the commit is complete, data can be read back from +the flash: + +
      +  event void Config.commitDone(error_t error) {
      +    if (call Config.read(CONFIG_ADDR, &period2, sizeof(period2)) != SUCCESS) {
      +      // Handle failure
      +    }
      +  }
      +
      +  event void Config.readDone(storage_addr_t addr, void* buf, 
      +    storage_len_t len, error_t result) __attribute__((noinline)) {
      +    memcpy(&period2, buf, len);
      +
      +    if (period == period2) {
      +      call Leds.led2On();
      +    }
      +
      +    if (len == 2 && addr == CONFIG_ADDR) {
      +      call Leds.led1On();
      +    }
      +  }
      +
      + +
    + +

    Logging Data

    + +See +tinyos-2.x/apps/tests/storage/Log/ for an example of +code that uses the Log storage abstraction. Log is generally used for +append-based data streams consisting of relatively small data items. +It provides atomicity guarantees for data writes. + +

    Storing Large Objects

    + +See +tinyos-2.x/apps/tests/storage/Block/ for an example +of code that uses the Block storage abstraction. Block is generally +used for storing large objects that cannot easily fit in RAM. + +

    Conclusions

    + +This lesson introduced the basic storage abstractions in Tiny 2.x. + + +

    Related Documentation

    + +
    + + +
    +
    +
    +

    Previous LessonTop  |  Next Lesson  > +

    + + + diff --git a/doc/html/tutorial/lesson9.html b/doc/html/tutorial/lesson9.html new file mode 100644 index 00000000..ad668cab --- /dev/null +++ b/doc/html/tutorial/lesson9.html @@ -0,0 +1,93 @@ + + + TinyOS Tutorial Lesson 9: Concurrency in TinyOS + + + + +
    Lesson 9: Concurrency
    +
    Last updated 30 October 2006
    + +

    Introduction

    + +

    This tutorial introduces the concept of async code, + which represents interrupt handlers and other time-critical functionality. + It describes the relationship between async code and tasks

    + + +

    Sync vs. Async

    +

    Lesson 2 introduced tasks as a + mechanism to defer processing until later. Because tasks are + run-to-completion (a new task does not start until the previous one + finished), well-written components keep keep them short and spread + complex processing across several tasks. Not all TinyOS code is + run from a task, however: when a processor has an interrupt, + it immediately jumps to the interrupt handler code.

    + +

    Because interrupt handler code can theoretically run at almost any + time, it has to be much more careful than task code. The interrupt + might start executing in the middle of a task, and it needs to make sure + that it does not corrupt variables that the task is using. The complexities + this introduces motivate most service-level TinyOS code to be in tasks. + Interrupt handlers therefore usually post tasks to defer their processing + as soon as they can, simplifying the code.

    + +

    Some code, however, such as the interrupt handlers themselves cannot + be in a task. Only a small subset of TinyOS code has been written to safely + run in preemptive context: these functions have the async keyword. + If an async function needs to call a command or signal an event that is not + async, then it must post a task to do so. Code that does not have the + async keyword is synchronous, as synchronous functions do not preempt + one another. However, as most TinyOS functions are synchronous, there is no + keyword (it is the default). This restriction is in one direction only. + Synchronous (task) code can call + async functions, but async code cannot call synchronous functions.

    + +

    An Example Async Function

    + +

    Leds is a very common interface whose commands are all async. + It is often the case that low-level code needs to control the LEDs (e.g., + when testing), and so these functions can be safely called from interrupts. + If the Leds commands were not async, then an interrupt handler would have + to post a task to toggle them, possibly introducing enough delay to make + debugging difficult.

    + +
    +interface Leds {
    +  async command void led0On();
    +  async command void led0Off();
    +  async command void led0Toggle();
    +  async command void led1On();
    +  async command void led1Off();
    +  async command void led1Toggle();
    +  async command void led2On();
    +  async command void led2Off();
    +  async command void led2Toggle();
    +  async command uint8_t get();
    +  async command void set(uint8_t val);
    +}
    +      
    + + +

    Calling async functions is easy; a caller doesn't need to do anything special: + a component can just call Leds commands. The challenging part is implementing + async functions.

    + + + +

    Commands and events that are executed as part + of a hardware event handler must be declared with the async + keyword (more about the async keyword in Lesson 8).

    + +

    Because tasks and hardware event handlers may be preempted by other + asynchronous code, nesC programs are susceptible to certain race + conditions. Races are avoided either by accessing shared data + exclusively within tasks, or by having all accesses within atomic + statements. The nesC compiler reports potential data races to the + programmer at compile-time. It is possible the compiler may report a + false positive. In this case a variable can be declared with the norace + keyword. The norace keyword should be used with extreme caution.

    + +

    Please see the nesC Language + Reference Manual for more information on programming in nesC.
    +   diff --git a/doc/pdf/tinyos-programming.pdf b/doc/pdf/tinyos-programming.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9ef23edf42bec6abff7c05195dc1723c177020c6 GIT binary patch literal 778648 zcmb?k2{@E*_fCXlO|}%HP)f|cRLB}iNs6*$U$SN^6_tcgO7)8rY0)ksiO7;@A<`nU zlu(u^A#4Bhju}hy^^ei-y1r{Z#yp*Q&hwn*zRx+YjJ}4}GK>PAi-1C-+^n{9tz3yx z+=x|_p6*4 z1%n-3#?9Wt(#6Hm)gGno=<4Muk5YGYwXt>ew6z&o8-x4H;<#~(6X}bub#!$?7PfS? zL9MfNvGsHZi9JV`CH-MpPg`p*M>kgm-1zT~Mbj5nA6Wy7`Rf|vzBv{@vc}S-qpSQ$ z2cwdV`-<2RHRxLUSdK39Cnbz7gCDz7xDhp|yScc#x!S`1Q#VV;6%>!CcXYFGf6~F| z+Jtdyk7&Wj!B=HOMBJbDoPOHI35Xxr@llDW0_wThcsq}g4*xeb;K!>HKca?>?#_;0 zD18S@&(X7t|C>7S3geWDA5q5`F?Tw8IiOTM?7dx(Z5`PF{NHqhR~V;i!ibKBzcWh5 z#ogH!S<@0Zqa*7Q{-z(i!nmy^jOfSE($i^FKEj_AMAtK3VVs_cBPxP>YwhjfVe4w` zJ0cbF?|LDQJvGD;y{I}nyIGI_io`#ug?@I%3pSz@5X{ce-rIw^+VBB4a`XVhFe>IB zmEvth|K0=z^!PJG8qtiQgDuL^6Xj&vm|q`zs4 z@Y}yNqAh((PfwJggNK{9y#wmEuR;2w?#6x%%=o3rBMQ{>cJ^|F!$n&bOtF@w>oP}I zdFnSp{=b{I*T|lc|E5~P_)9__Q7sr7D@Rvbl$N(E)y|F{KJwo*JnpcNM>MQ&2|mOY zY?kA0Tbti^h5Se5(#$+@{Dx3Q^r`_a4)$bJKFZ(JMjZd0DI;q0c6Hq0ZEL#NRF1lt z!#}FKdAoWczZ=<9%AYhyKjNgZw*`Y9(cNlWSNQhU;5_Mud}K`w`fr*djo$zadPG(9 zWq-G~81$bsMZYej@jHP*k0?vq(b>?^#nwa5(b?HieK|_i6{We$60vHiO`f(WH#-#l zU;Uq7=5N|0jklke(O6@2*|GLubf5khW{iHPaV8Xl8Bs6o3yhu=4CYUo^c=m5B!%DH z5@s~S7_&vA68<^b7{BN^?}QnRIaKvFLL6u7F&e*MuzytK_$9|VCCq35qOOj`W6>Mk z9mlTuM;(n{bNp_OMk8uq`kgj>qcO@xFAr~Pui>RP+IsjnTHB&@Ts^%kUB`s;n7_s;)gdr=8^GcY}7-sC+T9($9HlraX=8wS)-Pn*7#@l-0hyfjcIBc!qp1@rh zBk>=vAI;&B6~>?C(MV?8(yBJp1aNfWKSnL|D?%A}MMxvpPu0c;IbAj=LpOIv>oHg4 z&k+kvRLXBxWHee)^@5nn%G+y97J&I{OhWnXR*VKEpnESnHxC!M3O2Uxh?R8pLK*tH zk6Zo^w$cPcM!u>63ZKOzQcx>baw)F0b+w1A0E*I_fDgjI zZ>s^yw6W!ablcO*!`9M;YggrwW4XF)81A6<&N-BIxsPS_&XjD@R}C~vB7HmGvYeNk zi4Co*s@n0NX6eBnr7!o^*5cXX6{cG!T@}^9IzN_Owe7Z|`0|r74H>^SbR3^keCI&Z zBT=<*mE>*Y6ckRg!zx*M_40cA%ap9EvSQe4t9++7@}6+ySe>}CCaplzCHUMz7ZoE? zNlK89Qd|EQ|9Qb??O&h1o~==F?fX3GAhmeb+X5#(4V+8ymoN`{Tkx=E`I~O*T`?{l zj~vcyKbTBB(G>plHnF`wxGj~_c~P)Br{jNTIz0v~=U?Jakng)q@n`YLGsuG7rhQ); z$}qg2fHzQg4bcKhQ6HQEmm(N)FKU`Pys-vciUzixU?(9}MPbN@35Q?l+1fZ-s=4h# znIQ2I5h4H*1#89yOF(wwg~Cvf_{IRX88!0n(XI^j-_t;iC{)pS%T^Rz4-yW-e>~Vw zS8r!$v$3C~&_b|3eiB3a!zZcI(!Zk?d@oo6&H;Ei3^mR)K#q~3zK5IjMq4kG3G9G| z7E003b{CwmaT3rR7gYk<3BzM1e!>nJ6gyR+=R9n>UAiGiXHTU3J7w1-9xcnuKe3hb zu_iifX|^_3%!c}vHFb5KR&=PgKYPgcW#;ssGYxbMK6&qAaa;Vg9QUilvAF>ixQj!Tm638!+WOf2FQFnDA6hBhb)bcAf4U9e0rxMfQokQ6JCSXjZ(g z6XZN+@0NNva?NW)2ibMilJDyprRz$B4a)8B?aeX88%}=;suSyT6pgG%NtY*A6a+On z6mOacG>H`?(}|&RTz~bCRpYm*1Oj;G!J#PSHo_9Wm};T=%_G8|R20tl5_HW=?qa z&djw99>sdS?Q)eR#ixHdJG^#yTAmsGV?f^Zu(16HzSGaVm904w4LaE7`g=vIZti{b ztT1TT!?^UE%XJ9~UA1W`ctWhv5u?ikkN(H4pr;d5P5% z{qlK!biB|R{+|~Q+Z}GagHnsKx%*J+3H!Qz`_u=M^x2hHvwO&CM;4y;Pf71>-rNy* zSWR5-L_yX$(+vjv2C`vYx4+zT@w|Sf9MkXjttL9pSVz~sS$3%|%W30{XBtlON7i_Y z5gffAnr`a8uAyzlpU&QTPHd-r=LfHn8S@r5XuT_tZc8xv+T)$_#6wo6Pn~Dy_cWCt zaTBBB)fdSFub|^%e=V0!}9Xtre%pYW@4;&2eQ>Cy$SrmnY_O=hO{N|(%I-;GZi;h zu+^@&5R8tmcoc7AGe_L8%<^CuPX+&0hupxzpgqntia4#8DmdA4+y9)jqj3vwNBOAn z%lid$r|rYc7mLq&yxuU> zUfS2=XwxBcRMk1i(p})p4sLhNu-w3k{VaGh-81_S{1Dyy-VQt1(jreXeDUSOrl^@m z<1A#c>d}Ymiyke;UAiBDsFqbXx8&9eW`5`HTSFQ8y~bUjfuC?$}M#5Saej)IVj#;Kw|UJ`29<_ z&XIk@J_ogJruJ5eL#3=ej)nJ@_2(zv*|06PIW4*A)!EsPDV!x|>rhyAN{Ds->K?W9 z3-!}P#L0Dc>ST;!50*Ytz_Pxp`#Eh^_8iaRUGujGv@E&`d%69iwuiDV&-Kq&a|_tF zFLsWR;dxbL$?@uDiJ1}MMz|WEbIfV66Q^BIa%@{~F*`aw>QQ{X-5fzsRzTQ{wGKM7 z);-;S_Eosd1kYoD|mBn`5MJ< z7BO{CWp1zUPHKB&RN3Ze;yq|7Xuj*mw)JLNce-ZB_RnIq3l%TwHO$XtBOMoes+W{f zv-x86ti;dhxdlONtiB=GjeSKyN7~OFsr&x#AKVSL`lXENH{lv+kHc zbiB=@GJ}irxe`AYX3@<+Xd`wv}Cs$|J-i1r$A0!tRUJQHsuI{6*c+r>UB_Xc^^aiPa*^A=owY@G9{b)VU%wd$!eB?<4%M` z;!;!vCH#N%*k~*{ynRy?4Nrme4^nU}j-o&!frtbQS^-ZYktQSAFbXtQG8(cu=0Ht) z)9^&R0+9f!!=i}_I6UNd@IM6{8H1UOXv1jISkV~I`h-Oz1LQ{};Zb z;TV-VHq@HrO&AdljaDE~ARxowaG+EI>>Qjo42e8R;TY9Qg8-(ob2#LD;gJ&u!jaGb z8Q{o(oZ*O*6mA%89IMu`i4&7Mhl3M_LqlYW!NUc`!geD3k^2EIA=$T`nw62^U- zf_DI3PXSLrwh4z(AR|#64vridhwLC6IoQbw1teqGxKVzGY7csJZaC1pmpvZBcSuzo#VmNgK?1UV|xV@uS6^xbd zANUC(Nr6luAX^8<4g>C$1f(f>VydN42=qFHF_O{QYwCpsxOX_!ngFnc1uasm<^J?Z z0ugl0fD#WUWpwj3iihFB1W}1`_@^fg{9@^ZDODC4@Qc9{ag)Krs=UAUNq2*4`LW#?}fRi0LKnBe!J(lTC6s!WSKqOotf>tn#oY z@{2_48#2S|Y|DiE?<}oqZuf|3Fsy4(6f1jn{Z@0ZyuGpK-II3dhdTSEXJejxT5v@a z^E4>tR7m>kHmu^ae*eMp#1(e;^}P@c4GrlsL*nC_)jfkN{`1g*C6J<^urw?E@+b#+mrq0zqBr#;=52W42pHQTPuTbFod zW3{Hh*1bxowcq$7m*=X_VgJs*=aOM0hkkO?2ZPq@Xr0Fb1p$26Y_y-rn>3UQd%aQd zQ0Xh%w(Fb=*Ct<o4w`E>oZ>}TpijuZ7?%jAShMVBQ$w2w~hQG$_@M) zEc=q~@La3-M$Y_W{7WnZwwLUD?RpNAe6!oOKcTYi`s+@X<5j!K*?l)EBz+n>3SX@L zb>Y6`(e;r_2)%rJW0KsSvp8>?$Np~Te+I=HyK_TJvS%ijDHrhDzE_FmUz2siNN-TW zy3c)kSmO5WZ@r^>&ke9~NyP~+*04lzB`YoOP2DfFXO2a(zzo&nQWYxE{5^|*lCCdp zRx5F75XqDNw0ruA#oUji)7HgE%bvH2m?^K-+PQz0E5&lo%w?K&m)vGt&8iLyh-(PC zbNl@-Ic~Kji_jr?tGKP~V{@h%wqo`dNMKNNHt4(#Vd)ZmpM8I6i_5#^)6%0@rm=A9 zoSlZ^Vr2B*0$i+Y7dKMsJ=Q@s>oHVX#Q0=TZ|~+61^dLz-2V`6S5}F0>Zna@Qx~uySGT(;CNUr`S^pG zQJR>*noPe`k(Wz*P9GlZI{d0tu4ygm`c>sPeq0#Px0z#-IQLoA*ZbnOTe_Ne zEzT(BxDh3;W?x#OYW)~hkbZXBGTwu$#Ov7?+H&EIUmhUF3y1P+Rhu zdLmNpMro2aj>IkT+a{TL!Dk;P!Hzq?P3n}OC@7OX85bxWr<7z9!E%#mg>rs)@zfR6 z+FLck{V%gSNtc7`R`(RinZ54ylCS=uzmyQMXqD_<^F_yYg-<^mvUY(qrI4*_x5TPz z0vrj)Bg1z~{KWJ1f3)Z~kg}V%YMz?;qFta>lvNC;&QYA@6N#C|E;a$i{88Who>at| zE6LTg$)hCCRKM|__42B(RkW7WCC}-H7ISMz`4oN?JFyrxk1J{GssnSYFtb0X@Tq^7 zn`55&Qr|iBR?8f=XpYLbh{7l<(FihkUj1{7+KCsu#xFl$;)x&Q=NJS9#v0`A3G*ng zIOkHH;rt{z2+t#RQ4kN`m?v2^uvwbtyv=&no5Yu>IUlh(=T${r?-k^>IaMnacdvIDQMpKXFIqV8wb|tKG|e`?jAG%W&p> z{n+nFknYhop~EkRB#wwJ61!*icJsp(kJg#}vRryj#dgr3)$%}i_5QWFB8LwAIF!!v z@KgBw|5|$wzE&eF*oulj^&>UVH`rxsW`9C;aPQ-^mFX|uH!G~V_U(Il?v6`5F*8L| zI0gBGRoTu)s~LMpvg&5!oe(T(eJM`~*~vmy{>Dcr`+;SI330UYt})T)Z(QlHrx*_t z0tF2q-GsT)F)$&ugco2t91Whs4a0L-YDEnEo?7;Tywc!4aB@^QkXqe>{GJB);c0Lm zo(A_(D^!s8Y3mVaa3r7+)X!53OyGTL2?_E_gChyF^{AC1$nRg8~VMU^`?;dmwU05drPN0cJOuU87fijumbSATeDy0+P&9D3DbkmjeR; z3K5Ng401xiIz8i|SCEdC?H{1TNQ6!%fe`@yLV-Yl`Wylo1Gq67sSx=q>OU$R1AaoU z-ecytjcgnqvM)%#;G#mFLjqGqAi|9Wd~9;UG2kckdO>D{8_5+3kZR)yKrjLC1keN+ zb^;#si^Wb1i5*}3Iowt>R=NKI4Ip3;fdEcKL?ocWrw{-pBT~o{yB6a`WWevJu8K)> zH?oU(K(7g88XN$CCmuzB$$Z7nlH^2-TwmNVbtHf<_!Ro{UyN6EG9I zBI8A5Jc?seXeJ#RAnghi9F$67!RVn0L=sRvka%NBle{MkkQ6oOU{b^MKmZTBM#cl2 ziUH3?f(jKB9t$d;7$8M=8p9QuW3C4^3}R9;x_QA-fJz||q3{L(C@jF-C_EZ)cpz0K zV_xWG%VUN62TlV=f>TEX@)!%nc0@9;$~cgljGv@z440N(a?FhB8`(Gl0(T-X6oP+3 zLaT89${_#zJ2b`%Z^w}V8On9CU1ImU}R1#dwY4hz?TLIhYFDnb>AK*a(Hg~SAt zqf+Sg-(z>~AE3qv2}MKzLfAn9m=oZjAjZW`%#V%i8$;|#&5EXIMj-V9ehg~&01j2a zpy9+J6ch!GpX7C5v~g2#4Rq^^#o{33grW{`V&GlDnjo>t#5f+h@g1&XAEQuuzra*% z2ojMHNnpm2*p5sD>H;cikP?cCIewZ-=>_p)h5HBT1crw<_WssLfyMOf(lV)SA zdvB=!I9{jx=-yWsa*|}V4pe#{9ZYNT)iAiU2J7s9d~MlU%mH-Ma+8~i?%fvVLtg@Z zN_t)^uFv612&i{HligL=TTr#81pD;(%TSxnJ^dddEezd{7oXm@)~@Z&(<_E`Px|*g z?XuhC-5b}*=cXw3%vng`eN2ePT5PnQjFztO^Q==+k?Us?-Oj1>y+|MGYHaSQE_d0a z;8x6ct@lW)dB(o&!hY4nUPDKUYOkTiK($K81yMQ7;DcQ%5hvM}@e_{}2j+wWH}eg;Vy@Yg^875Ks0k4!Zi*VsqkV?@n~lwl#wWA-_(C z{#1?-y>ol|44v}=N}oCAH2s)%;==rjm6prHXFqTGRwgRYwRk7r&bU1)UIS)55%~)X zpNTEat`07JCmmW>*-#vFZie3d#0G{2n}vbc~koi}W=`+>lOM?SZ-kT>{%c)>)Ff(LVC>`iqMJm-S@CJ z7r0^)UT^nZdDvKp>w3w;8CSJGcZMv`5xc4#dL&X+Ge_eJ=R9Gd+{d#@E*oj=(M&v( zs2G#2&|mM}&|p4X6vQ{<+8&_3Px5nL`#A>iL3a46WUG>DuCz zzw$cw?ZgX8ziRiivN8VA)}10YH=WGKb8K$%!=$;6VwWDXBw7;cG;TcBHa1kB-Fb#9 zj5EM9^9kmD_?``4iK(vL_Yy4mf9f~R>F+I&UvW*@WQUEWLtBWDj+ld{Zs<$Zr8ye* zGv*23s%s?N@=Xe8y_vq{p35(XwdpsF{O+C`bVoaS-K|D-IlZ_Z(-wQHs^Ns+rZwLN zsBM1tF;U8+&)x3$oqyT;V6Md*Wvd2#cEF@guuBV(~D5-g1r!4td9T-JYI zR)49q|CHJ<-}-rFKfT)o4{biGopgKpeC_nJ`qM%^+4t+HPBUZJNAe2NGRkSeiM2;>FOaXZS1lK!dMA~REoff^sUm9UgfGl{W%*0#KkuxHG_$)7`OlNzZ4S%uj5#XX zJj0oBTkN0zs;V{=@)vccWL%gm+4XNzL1?u%u$ysm?t*YbX> z{LHa6`{2UXo=vDew!)d;_0O{M$!dOu(<9eem#?XA<`5apc}=zV~z|MSkh1HS85?cPW*>q^{GsTbR1aUXTN{v(fGz&F`V z{MD)T`R=*oXTs~a9Bh;O?J`%l@VN}gxjl4=`?`6Py=&HB-gEPpPWgA=Oa7Sex7y*{ z`vHpr61VJMPf<1K+&D`y zNbExBb@`L;9v&7Q$jBM;R4aMt@$ty;GgccMaG%I-XYN) z#p$KY$%R6`P0Xc-qKrg zr*iu6KviH7It~lB1gfC1)Ou)u<0q7+joUv4R*K#VJSF)cQzKxI5FUY(p(Gzlq9J#q zP$rZRjgyZd&7~T=sp=PjWyuIyh7?!=p9i(H3UHMtloE{-k0H^e+TkgRha*uG@Ce*P zgSr7)p#Z8!oV<1!(p{>1n5uYSi3xbHc?d*{LC69elwIOL#S_UW$88@5{d-X(y>EOf z#}9|tVjPriW5KEb{0?{{urE+(KKbK^VIVW84t1(KhykC5WVFZ*0%1S^>vg#61X+4B-JD0fV68 z00Gee@tf=!{2ztp^jQN_l8*rV3iS5?*aAH)K$cQX4K)5t2pt`xVfsL_G4TsEWSgpj z5qk_!H{ha(e8@h+hT_nZJ%IF?W@E);jGQOUfkTHH;E-@Xz!Bq+dJqKr1B`jH$B#Z5 zZLD}>p&=%NQw*46fZ-963TPJsaFIwH1HYJTctsz%HdelWfXxH%qktttEi6)_4+Y(T z`2h+D?IDvteGKsdH6fVd>4O zWAJNmX@M7q_yw*pGywr*I#~}4cj|WsH*RbQv+^Ov7<3Cp4;&m0sZ7GajzY)$B+WAf zwG8r20ja0cFNi4y?iR985D!9U6!Zk)D3r;DS74hN;)8KhIhfo&2>OTs(*xB9;z5hY z#4FFo9X-a_fIj+%>NyZdoQfh$1QLf>bQEs*AD<*3y=M?0FczRwAqV<>90k+IK<1M# zK!h(^HoLd+^@{#AFU-yMz}%(*#T1tNDtdBxYs}3JHFdaT?v@J& z-g$irU)f$+l~_}QPL8#PfJhRU}R}LJwN~17G6{7=!>C8DGKb**T@|H zB*WUc*KX*}7Ppr8Hdm35S>?M2%0B7bNwM_t-%M!`h;w+q&{DMVc!){m!t@JW+FH-| zT$-bC!ysVwqt@f3LGtDK23+4h9aC8z_0!ote0E^G*31v*&|KF)hX;iDUgT6|Qxp=_ zEYb4i-Iz1z`q{|Pe8^@WUVNWd)q7I4;d+;c8r`JMrWiYie!Wb8r-V~>yDVQ`ukd~O zT=md%oAd0Ji(jG3Ol9LQgz_#?XpG0MJ9&Nas%7?9Z)Y}gJbrrZo=U%K^y}Jt)sG`) zuG%3c{8(b-}lFE-`J(e^+!+;u5R}V zZ{;~~Wfu@tZbd!7x7iK)I~`p-XcJ~_vdR^g#+j#Y5_mOzUFGymUTHZ650;6_oLuT4 zA!fEa;ObC{kHgSIw+!!23&(40<>TN)W;A1#RX-ESE(27oK~ZN(|*hP<(vAwv{UuQwZ@M>Ccpo2>=E}b z6nBFpMlNz-gJz+m2#NzeP2ahv`1YeZO~3D`@n|z zXC9NbDXw8#y4mzAPhn)(>P>mQrgqN!f$_wU(xgi~`kMBvrq8SPpHb9Re_Qyp78Apl zaMLN+E<7~NMd{{qm%UXe_3XsYi`Yf)oMf377{CAGr7J8KLwV5(?E8<*2$_Azt@`>^ zt+>pe0$R4lgNLtPzJ+q^63ryUt$RNc?nPh}?|KT0QR=#)5Z^_HLY5gF)n`KE>RK}s zw~*?M`6SQFv=DjIs!=&J{F*CR=1ODh55NIf^+=|T#jwnGnn!te;s#NvSetx|FJ;shoEVZ27EE!Ca(c^OkH6r{=%Fy zirF{g2bUgn$#4oTj+2ZjpLVzJhTE#R8S^YegIK~(oM8)Dx^=%8hA(Nh2G`>2lovjF z*87Tf))K1m5^ag|1}_?IJH(eD;p9@N)P60R?`v~cM4E$Jt59mGJzho4088fEu(%kV z|HKS^^{n;bCB7#k1#d;$%YD3)UbC*a^mREaf4yTxVO6Z|HRVGYi-JXFpZXw<=<30h znV>6-LZg`Hx-y1yQnJQ9zo;TwD(;Qg?GYlq^)FEPpe!G3Cue)z9z z4+$u%o{PJa*M9V?>h7$n`-fLw`z~Lq(EH?=l198mzRe<%V!Q|M((9kDov}9L}G z*Fp42wJ@O#Rf7eVcYsD)n=~13q z9<_q9i*#*8`nmfTQ1(}JYVP`Iq%a`(l7U0P(Wj`6Nu+<{P=*7IaU2S?D49 zpK0>Z`YCXGQ1b`u#m|(8R>g~%1bCagAy+y()>;Bd%#XU3&Q-4 zQVr{9it-U5sfDt5$j+!~5P&Sez$j2i6KirEAItxaQVk!TsR{^LEwCHVR1Jv`nh2G_ zNCN~EkWM}i$NWxo44>+$3W!vBlOQEU#zz1r2<;;TKqR3ca?*(;=69xJ__|G1K&bI1 zU=getX}v)P6G3}FByE!>+8~$w9m*KC15*@`0A1A-5|nzwtPlX5;pzfO2}~PqvRE?+ z_&b&X$QNAjsS1enK)_rTKq3Lk1qcI0K*$83RVT0F-@%Mw%Q;m6;gX=ykZ~dcVu0m9 z5s)bkB>d#TKFsfE297#$YN`SP0}Va^FjAPu|R6 z89d3jYC{uVQM5^4lE#T`UiIAGrZ)CGPOkVDu(s9A>_!-Sb( z@FdXRIOSW6gS!D0E=XZ6go8*?2@c{e5|%i5To=pWNvJXNRCf@D+2F_!y(2TID0GAu zLz;Bi1~N48H(Y!;n4hYE5WA3(Gy))dpgRB^hJb-uz%l7Fh-2_1|Dv532fQ10xF7is4Cpu(D`71 zJV&#!VqjrsV2PkCf1_#f+bXeGl{5Dqo)PH(_H=JH7i;!|IKOW}VU%2LYrV!EzJnXz zyZM{HAL@_W`AkS?*N&d@;;Q!StUdPz8iryNYtX{}VQWI!MDmKfw&`X>y{pbL5}ucD z^k&A{ZI${Oa*w1>bh51pJXM-CXSJ!kQJ!h7-Uh>#)Z%A_`CSRYDta+#?>=?Vc%-`W4%iri*yG&&7VoRtWL<2eOCDV=mL)oH_*<3<-K2)>j#9NnQqvs#}Y=_ zs4a8MB2prie@h}Kv8X*xzTYiH&vOsi)Tm)k_?P-@qU*J%mye@vuM=IKdqvPkO_ZHt zsT~|aVcFbzmS3QA-LZL&GKajU-(B}}$CGahZu|8lJ!x^S{B15}D< zE8G@X!)AG2hCS->GL|LX|Lre$Ad@a88)f)rc5AAq!}mh0OV3@uElTr-(!O>ohCLW~ z-7QhIJ*7P;LgU-g4__liK1c)}c+VmK`2N9ArJcslJ+E-fo#KCXZr_rf4yC2d(>G-9 z)zs&(L^Z4S6)fJapS+qU%=cB4)Z^K%8^Sie@)OK{*OuTek$$D^!{>M0yv4p%ZZ`zC zh5VAt7u7u-!TA)$twGUlC+oroXNFNus%gtfZ7!GE!~ zn^_%O+~(ymzdH5BT<(?J2lw+y6=CX@Owx#g;W$7Q`ycH-7O9xMYy%vGKp`Lqidlzu1V^F75x4DSqSErpB}v z{#Un~{A{mkR=SKONjAW6vOT2*F()K=o1NtYH+GBkln=dKoioD{m9B~{%smjQL^ghY z@FJT)f@%EaTs!f#cYj=w?d3XidyVa*8LFb616ahAny2e0?_`m0G~17vt$V*Rv@U=9 z`@^$pgj)(d7opX*z3XSws({VwXNlO+ectMYgs^Ap{X9-wTk}%2R^6NDmc8xwIG6TL zR@r5R_$$43PfDQQ8H+qiQH@>4ybl+0=7-Mz5E8XW9{*7{^G;|f>j%lXD*O+fNOmu) z-)u@YeG+JzKesZjan|YgA&LR$QW2>eGq>#z%~G_$w9iU7X19Dtw#A|>|Lkg^-b%e< zgB1t*y>&Vkv{e3j=DE}Ob(&jI+Yjg3^gC7SU-@{y_WNL+{YBXz(ro&!(^;H9QQT~j zc~R5&mUP!yV)$aCSTCF1()zh2xX$Rsg;#N%-A}rHRhezFvvtb8Aa=iky`6TB)P+5M z49&e+;Tc>oZ)ZLCC31Jq+g81|RVGj6hLlb0b1Re=SFSw~Yiu@SQ0nr4vl;qOZ4>`v z$spCA9NLe+!S@{si7Jef4%yziU1>qv+7~A)vxB;oax9+SzMoyBs`R*0Mm}#jC+n8r z-Z%@MCEYhIF)y}ipLB0sn(-;8@9VvDADX53R{wn9oYEKXl=Wq~c;Xue`PvM6 z;g}bxa|;%!7D!O!8;|1-hsb6h+bHZC?Z0^Cw{J2jNludZz28V5hYDj-*60Vi@U!3H z=~T)UHf(*DXBE3lK-=Tv8nR2K>oWz#Q2$mxQ?Ll!F^L9GoRoTI%I=6h8YRuisy92} zgx4$S^Hy%Njh{ycZnxApe4}ac5NrAFou|D{kg8oD_|>e`#9lV7bU3F!j}@}{!d2x9^X(3o zD!Eo$UsO_&DMScXHcb#(={vtj)js`))>(nT10|e}Ps*0LC0Vs|8$VxhQ2!F%yFk35 zJS$+El@j-p`ZSEDdCL*?8CeRF={8z>`2!CqbG}>q6Xp>5O$(z)^6LrIKi}l_D)H^$ zPn(2Z#YMObmp2KSi|+a533)!|y;;j)&zpYk7NKN*!840D?kf)p_oc{p?9H}#WholC z`@Co&Dypp{jZvL%*m^DBDmDX^u+u)ZkTls?rZA5HY%Z>NHW*4TX zuAV0tc;M(vxu<0=|G~Eug>M;TDLr^=@AkJpUCTeFKk7-`?a*(fd@Ch!?yBnTwR_}~ zdfjxjmNeXuTsL5GVs3IihRaKRl|vr)G1K-L`cF)9AFL+Zm(1$>)IFF{>0h*_|D)x$ z#0aM>{}|iNZyP&4&6RtrU8XT#==q_6o!y;^yRtDx1I6466HY~`#E8h|oLt`779L#_ zCi~SJvxn6G;+s(~E-`Q8(Sfu?uLYuEA0lv`W;%+yjhN z`eUm1k790qihEmDX#bqYYWB7V%jd^rm^^FtCNKAGUCsKULNczetkkpHeo+jORl4wU z^M6<#*OiqEz2fRS4*p_!SR*0MNIlaZ|28I7{+)Ur?rD1%iw1k)k}L06H?MiU61;p zCgksj*TYkv3u^%A$MAai;b(%t&%@L)p86yu$6&q!f9uq`m!jydX?ar*P{*_o<*bmkeEYePm_#h7HC8D}ix{z(Zg zop?s@GEgndkz)_ky`3qo9h0J^3FiaA`il0l6Qs)J`D09cWjFCjnd9Q13@<> z)3h@r=nV4xg9Z))(!xfaIs*Cyum?C(=2&N78W`mJ2OS(pH!&F+cc~Z;)D{3E$sFkn z1PFtCW7AqD?H_^8IfDfTv=PiPlbkc$eg^pv8$Q+ZN2i<-PMkU@h)K#BrVBC1hxnE$ z$~Ve51Hl4Ml!5cd9ODf3nE}J2I_0SfNN1c8{sO8pphcEB#u)@;0P(2N!c+yMGtSgz zCoC+G~T2?H0P51Ki~83g>@iwsAkQx$N8aRz1=3?S60F~>NA zfWNzu;ZS+10*)}w;5{IH0NxKNf0#VujC_dUlKcZdg4Fd5GtSU5h9?1Q#U$el0{-qu zhLek_?jW6UMtCbIn*&yZImQ_T{N0lbXFXFCaD;J29tZ|371A=x6ypq$^zWWzI31g+ zfON(gnkr$Y0n!x66ypr?{q9Kc;~t8_WGI700((4M4WwrqsXJtraRvby90@glo$3Z6 zwXew2qo5-nB!!{}CK+cCkin5q6YHr82%!r+(h}J?=<-B@86@hOJmn1XG58T`!aqg% zMk!|?CZSja*-54-XAqFVk5G|_sR{@aBk^#5;Rpiv48%BfZVwZbGYH7wN2n0VR0V{p z40yC46zM{^N^P=MLC0f3~uCqw24f*tObKq zz9I#tFo6>u83qsHVvcbJ`53&&xMo-;jUb(IhN&bVA2e<-$2bGp!Qey2k-AKZH}Wtp zfIZ+@2sq{_XOQl94}w$)jwW*m!C3mS9i^O+${=d7AgnRzCu_lDW5NEk87X4)GYfjTRP;> zsxZ@Zo$|+_i#V3N+`PR0~Pd8I# zhiZo6uWgEXQNfxu>nS+tF9!G4ytS#3Y9@2XXb%m&?RvNVwX~yQS>)q_{a)8)j<2*m zC>*bJg75Iv{M5hIlpZ1m3EF+=KM$s%pV2;V#vx6)sS zWl&T?`l^gpRKl_YOSZ15v#Ob`#-F>fO+NRWOi9(v8lm0x2h)0r!Zn+3-Rku#%34t7 z`{-)EI!dNwJ?=yI{4@G7so;wLj}{>#DlKyzgT4R@{rX+g|J%ZMu0=6}ZI!`7f9M8Q2@JOz*uP|}3jC{lGZ&p*`e6WdPI6sJS7nT4 z4cnem7MomL!@QMEcmi!AoV=Sl1y!MM(jnjL#d%GkWm`?TOLdDwUM}%=IHkVl&h{{w z6JaW+4HdqpJaD|zGBBsHuLbLL&zoc2OrOP`{i`F~;&k4#S&G^P2#9K4S-XE}w`@p= zui&L{bfW1BRs7m-D@xOJGUq0WtT`qBJwb`m!X1B^jOG|{^51_+YXCZO{W-*yB{mG}{7tE)J1~6bHmKbX zdJ`d=f3)QN1;v`5U2Z(QS7UBD%}bfB7DHTW)U#wwcT)91SDEPM^+o)%1%NS&=gxmn zg4PgPrf&Kiw|4e|yFunhULN>x_?gpde1XaNyVn%%b?i1VZ}g6~PtuPO&slIPVz-yt z?gci`x#%3_Qn2XBh0y=x71(VKt<%oqNws;^c5kSHHI!Fmg?{ZRm+rTBoLI^gcNug$ zKAO)TWXUVKA=+nJV#Ny7g2wqM9)ZeLf?B{a>ZeFwwjHvX{KphlN9 z=1NI;BrRoFHao9irBr2BDSJkOe`Y>!(ZD@v%Z9;QWfuF?b^J<|$_x2Siku(KQ5D@D z%Ks`{PG8fB%anU<*}EWz<3BTPzx-Izw>{HbC0)5k9pjc+cBA}<{_*|?ABytP+`XLn zcn{O$)e-`oMW+@#m(Jc{!0M5?=T4PmmJwOU@8L0z#D}ju&`w+<>z|A~k+4eWmYh4r zjVpS#%fYfsd1 z=@-0bC^VX>%IM5EWOqc#8RufP3~k(y;#Q`7iw_koAPJ4Od}>6TGDyYej_F{*-4VQ8 zT7X$zndUgl;db`2H$&mYTawL1`g{z`j;X{3>(m+U5@NKr^ z)3>rb?wDJr)mPIY6<(91INjeh&C#xcWX%Rq9qiiC9! zpT)CVSx=hmj@|yxKw)nBrWWNh?=6q59Q@%uZ|Dc-T@?3aVLOkYxz`=8eXxq1YpWs7 zo;A-?+)w0KAIW#4i<9Wp+lBY_D1KXO)~}fUa_$Zd{-EUxE?ts+@#tgd8-a9Da==`z z^t#d?$v-c8m!zYnHh1QTn7dT;uhRBUjO_*G*bcyImO5-^dwB1G4A zJ{HlzQo;!uL%kuU&VU_dH9o zA}C8(OLRu|=P$A^+7>vVz%@fMr}V_?EgL9d^EZ8emDzKZ|Gi~!;c4@#b=Q}5pRN#8 z){cAQ*mHB5&Jm=gx|kpP@g7OP;U$ap^X0@ z&zks+P#%sg#`QAeho5Z51fdN5J`kt?VGCub!>=^r7E%N1&$MTr;c3r2!w*lM1&o$P z1P>3Vg`a6eFm=ETtOv>C@aJjk(dNwJX>(?g=bTgDhqA-rSK4~iv5W9|+MHSF4WPYG zTaPwp7Ehf%2Y*MKGYe029sWDooLM|=&MZ(?wBOU@qsEEI=Z4oC+siz>7xYMw$q09Z zP{v`P*q8`kn>j)mnHcmtP)F6#6y+Nwl;H_m1V{myC6pPT8NLtPllF62KmP3tW27}5k46@rI2}V5y~Lo?;y#rQ=Z}t9&KTUiKx&$4`d#5 zgfa-oV4?rT$n=pGW@MBDI1i=?We||jME?U90toSN3p1VqL&=fx-%Jw9ARvR0{wGt@ zM+jx)VOGfCWhMz_5Rk!2|BJclql7ZFvcSkuP%(3aG6=|kvr{9|DPEG%7G}V+@nmH1 zGINA72*}_^{>9{Uz+Q)2n2|nzh*_bBiaA0V1Y~d|)EIuMJ4h##5wZ*^cV&`K2Kg8q z$v>H$PUn*m+L1(rG>S<+8RAq1NAfSGr;qT-2vvbNVkYTikdMKS{EOk~^af_+xf@vO zTy3VqOirh_FGKYsGDrzViZIu{3<5GZk$*Bd z9pZYp7QoR$`!WUtp_{vOj$q-`vo{Eg?C}np4=-tcI)&nwdjZAXMF!P8(zOig5lk(B2Wa<fPoN9H7`SO_PcO^h>Z#dMDj2qI{_kj7=)#Ntx+O* zO1;a-vm{5wp+8{~c?#}?iDVPcxuiLTwViUi0y*YX8}0Toy`r@?6<$I zv$XtA#`EzdSCC&1;MZpS@f+YE_gc;mqyWy0W~L zgY|+hvsMyruOHlRPg)``|H{?KJGBzoaq()>saBEg?Es zV!}2rIly)zRekA-R8r5DHD6rsnQk?|SMAx7+1;&~?WKRavjI!8xtzBx?$ha=``0XN zou zO){25p4!=!A$2b19{TzE|L*IV2HqE8$M#UT(HuhJjY(0~N5!n*1{yQtQ=k%(mEJ^m{_HUdi!9q^m0+_-Yuh^3^X=2i; zw(ZMh zA3C5vsBuG@Q^?Tye4Z8Wl117}Y^zq~pC#A>z)$#2dbR(GwFXOU-hE1st@;0&OPl(sC#$bsuKUN9OQ$c zJod)VcRUuIdD+=|wZ^mF3nmBk7E81XhaGJ%%(_6cX z`;4D|Z{k|`Jk_NtWMx#k-=~;VY)i_5l5H{rj}B+1<~|xkhwO?7;QCsXA4>QZ617kP z>2gk3MnOs3d>?kR=;>b9x2~F5u_mogQ_WvSFCr*;*AN{AYRpB8s_fA@;)c$<@~w`N zHfrO}8P{B|ug)JxaLU{Hx^MpFm*IW8eb}46yAEu-;(NdjPUo>j%Ti8jx(avc-cg(` z|G0RlQ@|D0DSpu~jijIafjx}k`sn?J%DaXc4Z`GYYdF{yuJrA&e;t|fE?hKs7VD9^ z{4%lwn|?B8y1d;Hi<<#+3e$KlRJD$B3FJLo&G-7nL`u4_)sx=(HO^_K?*YSvcyly?;wwxfe!%MG+E)CTLuhgE!1`1sM(hG&ii1E{^^-3E-sZAlH8Xroj=r( zkJ|Sm%2D7u$4%q@g$o)7j=M{zo7{PJvAM(J?iL@t9=n(}*SBq_yh4*Y)!sMAsqK=S zF}*udIY%VYsUtx5XrhI-Q*(!piNopBCpWIF!ke5oSjju^!sk%2+aqCf(a*CaPxDFy z=7%1^SzzpW9`iT7y6e`QGq)=Mbv)wDPiLo!0j--K4jp*YvExhKj^#Hij9G;}-=OBm z>6wXKiMXLvo)?`~^TV;qzokKZaj)I&guNY)k38GJc3Xt~W7o#SgNq!KtPY9@r|deM z5VFH=kIEaD^5W|rgG2786Q9d!gp2gPG2`gL-2U1xm1(ta*?ZY#<(uBHc`jRTkIy`t zn?8u<+{vdZO1f!W52xV$Ox447X)HFMwtYza`mD=!M{RA?2DP)BmhF@aFYU=&)u()% zrSH6zx}>n@j~N&xm6Sor7N1Y%&i~mzJOCZkD(LV_ zD>m8(_xs=f(tT&sX2b5B_x-si-9$^eqR)T*E+mx|Fn9KU(!ju51TsI zOT{m0aG+1`s)GCAXV$Qi|6}bc1Al;Eniuc`f(euXx`pxXAZ^zneZF2NIcPz-m`Yh%taFG!4hZcyqc^pa< zpGS(mHuCOvE@NH6bpc7)fB5l>i0l_!_rlfxgzK_iC`?}i*9E4w0Oykfs@oU1C+ns5 zG@xL1`TGl87N~w-{CufB&3dUl&3dUl%?d;>=f^o$9t4heF7S8u=LIecjHA5#`^)12 z<<|3mf2lpqdZ|5q7NK4I{_=R|5>&u(&Xu0d{=7WirS|mMtfPy6e|fx1?P*p(aO(W` z7l=2&R=YgjdBYuWob&MQXQJ@Mz4#WGT{9Z~f$IXJ)YyO#e%Hixfm+Nj5$DAt`a|>B zfI*i4A^J?z5kT%ZfV*-{o-i=c?uvbXA(>$N0qX*StboGkbzxmVf%b}he_-j=FV8sA#=MN41 z4(*$lnm&{Q>O);5{d>$y^iJ1?;=xM9$-dKfQt9sKRIC=z!)7 z0GGU;I5lA46)$og$o#2+z(81bhBJ01U?8Bia&2T6Fz|{S`5U^sfWFFwI5p5&1z_U< z5OGap7clUOBRLQK{_qa|1KB+@@Y+mapeB07kNgeU-5fs% zH*|Nu1G@mf5SU{RK%LhFb^!yg_>sS%yZfCfeD)Co!1LMAG5(oerQfUymsa7C|DZ6g5G0+0*O{K%Pr`!%6mz`!ehM)Ie3@Ef|z$Z?*q1C-(Gp}T;ASNzC% z@#aqr{D$tH&Hg=`19EM2m-&ht`3(uRG@Di5X0gVykAO3W6#MaPc(LX zK{hro7^U`1?D>}?4o+InLq5*b|BKQj)IJX%$gG4|B%-Qvc6TL`^I8-%dG1d5ok zNo^S{ZXGudPOyUjlC&%L9hd$2Pt}LL4Q-?%6yYa*3yI-@<^8L>k8&P>>LBdR6?v+*R5Wn zhWkZ0g*;r|>^QVOTB_DiIDDw>{7~R4VHDT1rt-%q)&Y+}n;7WI@^m8Xt=z@g)C32? zuyROMGW-_=%GI2)#T=CsrVYvxoU_}8w86f$5VqhMnSK`1#>URS7Qe!L`-GY>a|w2>_ckZj}Chvv-WES4sH8~ zDbZg=a^5M9thOl^sTAZId-|e=ECuhi`D4R3%IInr;9w-Sq=pYGsnKGKL!uBrSCBxN zy`4rrbU$n1wQ@uF2Hooj35=GT6jFhEc4FYVzq;}!?i14VR4=$LeAL)`Gp7t@q1hvc)hD?yi0;N8A4IPBLVZmL3e`+N#P%sF(pN;n ztI%r_7NmU@W<(shmyu;{nlSHrXQPIY#5q4;{te&2U9Q_)H|xE7%)H={eXK$Ab!e78 zfkl?8O_{jEr}$ysd91dmLAUZanZ9f=reL`riD03_U?oQEwXY5|T=FOkIuU|5*wG*~ zB(-r${SX*>XSK}ONJ3{9m&FUCcJTdrOP8Xf%9jE0)0E=cQXAGs8%G}f{l~!mrLiWK$d^~B$LTwz>GUU-GD#j%0 zlHVryXh(K=*y>^BQd;ie7IAWUp(Y{HeV-H;7b_$|=Qt8SHwJW+MO@uVG!)<#d*nh2 z3W~)T)b8mOLx*KP0`W>`n&^?8Bt%bMfuSTqfP{1$frg_t=5H7Rqolc&qc@FX)c@w0 zvC}i_k{kKiJkbyAw;YRJZhP}OjYN<2>*D(kOnaD?ND`* z8bx#U+-=bTve&e3c!+BfA{uU}U-LkiO!X0X99E4otFW?Sxlkp?x2fxqC_%bfOwp0ct>eIy9qI`a0WUFRZ#)lzjA#dF0VW@^he+E!_t6rjT{;lt zknt{-DE9L0nM|cYa})Qh&#+t`2vpBTflt~=y9H-mt=mUj#R=FB=w}6u*E$5&GGQs2 z0&ik&XW&&6;25%Z$V&wby(F07-d$>h9^c|AL?P$HZigt%2?5??Cg43LkC_(~nO^4W zwqr|8nBUzw(mBlFuEJ+}>?yr%fcI?Bloz-D6->_CA~$VpOjRl1ay-4n*_42t5EF+a z7PI#AtTS}LW{kL0Yi|6B)aC-5k78NvBUw>z2aWFI6`=%Z?db6QPzB1HlMBE3^fF*;p8$K=sK4wnIfJpc`wX^6v@ z0R}eDO`frVP?1xYrtGRZIq}%hhHLMEKqk2*iMNj7p_96z;fK3&$q_v~+9+wjxM!A5 zUbIATezktbpxh@Vk>vhSX17w=Rn^BmQ2Q@)*NG*6+urY;)fdYPj+oN`bGC*_TCtO;srO|V=!K+10O$RYL=9c&U_hr%y-hBWJ?hBWJ? zhBWJ?hBWJ?hBWJ?hBQzOyMSgdHKf@tHKf@tHKf@tHKf@tHKf@tHKf@tHKf@tHKf@t zHKf@tHKfnR*`7hZY?m6+0AcX*=L<-g?NURU?NUSfOri1O-(Nt=KoRWn=L`GTF2^?m zrJal4Uyg5PyBy!lb{-%80wJH@i=XfP|C|y0fRKSQF$X7b$m>yqfrQ{n)#3aZ{h@u| zslklEC|96i``XlCz`!e2hx3=`PYwJAA~OTYDFXx0WPMF;Fks-7vcvgX{ig_Q zNpuWnAI!B;jPk(6N4;UE$QUJAX#_Ph!0O#e`>i^#m(`5y|5C*_cFaq7sY|OwH zd`)&RK)L$Gyo=rZPjBCM3>n}g0mG~Taw|}Zy~c!NfEjVczN-yZ|ML$0ogI7zAp;|N zIj;*L1BIR|_WiSw`fsV&7k2r?UXKF$X8$=NSQU2~I$r z_PPi%P*lER-`_yszXQnU(yBmj+%*AY;4-h+_fOuyb)WAyW-t?gH~~_F*Chr6==~M* z{z4Pi5A^tq7t97o#9R|S26pFPtLhg~-yiNTKSmp$$sYnp<8^t#fPueO)i1))KQ-{1 z(Da!;BRc>UT@yV9?EBS!T!hJgYTq|n@LAO#kQ2W)dJGtN#e@6}4c+hPF~H{n0BQjG zydHQA*muQ){0#}+@8B^rAi)kqr@#%o9(W8Gc*TYM4GrBNv|ylhhW!tC!GM8Re8}I> z&;{Hs5S;^{_Sq{4$luV={RcA`7+DQm@-@L@z`iR^8zQR<1F5~9(W8Gc*TvJS4aNPjeMsDpS76* zei%TvuLm9j23~O^=VhBeH4p%gfl(enU&YzjFCgr{E_w_Yc*T$WhU)P@XCeR}{c^N1 zFjtEi&}q9adJGtN#gF{NDZOT>`VBp11O&4f*noHOdP38Hxc9G->QC_OHLd#w9y0^e zZva2SaXs)D2!Vbv?yT$TM<4JRc6>R2k6uYxg$URw0FO_{zyc(;=C-D${}dOzsKb7H zZGT|Lf5Z-E`$=){5<6xE;;es-9Y;!A#4}*GtRJG|Z-VacK0U6;EbT8fe%_+pUkWan zz-A&q+*rEyp-1aQx0s~G-BJOtK*DXM_3eR2;citTsYawNzGv@HRpB<`>>e)d&WZBvWik?+5xVUYo`_It5Us z*Wo$|#4_G_ONjtO($@kKuQpM^)F=XCt8!43 z97u)m@S7+fNs86vq#Ev7(FT9ukzFYrRmHP?q0W$Nn^U6)dOg zgV@vTDTyO@nmAW%7;Q(U(`@}{*Ksq6WOxa`yGzbT#nN>Z>m-QBjlIw@Ve75Uk1DWD z?luV#1z4j9@1kPKb_54he0T>rr-UQJjb$PD%VEac*l z6D>ugV(@WnVtuh-#kc}6u>D3~@)wTU#S8ZnN9|1d1}L{*gQLcFsVxd{gDwj3m)fFd zvqjDe_?OzE|NM+D)_nVnuDLs~1IZT$P)h;IWWbz@>vOq)#lP$i7nkyf=AG5yfvG`& zq6?t$#}0H20bDM?jdF4@|BrLyf#~ImeSe_}#RjyjF>suBO|k%G0AL3^E5mcJv#|cp z_FZvJ=a2qR?;p#VHGtj+6HrYC5;C9&e?HZT{eL#^N`iC#M*gXJz)TeuW`KtY3|IkN zJKz8SCIb+Nv2p&-_Fc(u&Q*KA*$23%i%%oD$HiFzV@#cl6<5d?`$4-kH3kN5q`jc zK1!u@w||$4FQoV*%xO!p<$Jge8Xx~y7J0$Jh;>brL%X%oCHg0KC5B&P`pSZCkd=w$ zHr?6n=ddx>SP7}Jd3m3BuIG{AW?kGai726R5%gE4mu{HVAY06g`B%5g-zeGrx?P^% zfS|JT@q?I%&d9}oA>VvnCh%Dz3^GZ~xn z|KR9_jZJOzt%2bgrrI|8g8I4^diroYJaCU~to60c;2g%hmBd44*-&eH3OCI3^;G&k zY<*-45)D;j<3soq`rebKkIi0B7A0r(U~*kCFI>eg_pZ^4hk4Y+O6#e!l3sNVCE{#V zEJ$fIx7l}hACz)}pAKXxy;GK*sS(-(~K%HupS=~I5W*0NUKnwO%plDg_M$E){lqK0J zXc%KXn#uXjrg3$$u8Shc_p{^BL~N{-fkX0LSQ2vApsmHwsi*kn$;B=>C$4?@;qV*= zJn>8672&snM1`*bs%rZ%F}IoQ$;}wF0iTzBKC;6PciB6P*1?@ImbRkHf+xTW*fl^Eb3^WVgS^@h z3QKS334S7-c{4vQ7`+Yap0J~KdI*BECe$kWz+L@h9OZZ@HV4HLj_~DOvy8jzOG*;p za%PpdH!yap!Ecls=KS z)Rki8QCJ%64Ev#l%SHK6Ep>e;9CvT7A}*-Yu4~u$F)Tqkq+lt)px-SEK19-V#mK3x z9~W1WT@m*clRf^_SeDJ_&stOT3OtgW>2csxtx>xcafuE>$tuX8fg6hB04q;NIA!vz zUmL+gzXrp?UBh|PHv>_r*$N5}hrOR@74dz=^Q&f|XHTK;%Onh7*%v))h!Z0Oz0aS} zx!41lT@{;%CvuY(Pb6Vg00I~xLYm3AyN_jWHsUB5EL9%T?*9Pkr7+0En#IG-g`hO| zM>5Z$T*k>|8N$_-da^1yn`k`Z?2n{sZi$0GDgZk~Z;gI{53;iIPA^1n60*efvq!zv zCY0M}J6u(tHx{6NO?B9z!c&jxPgC}BU0iGY+T$Oa!<$!ajOWOz2U_I@r)XZF;g;|%J#-L492t2)&7=;8getGW4<1nsH zevIP^A>jdHk0u0NdRJl)q9BLu$!E!!H}kvKuE8_UP8$7FDV{66R~9Z$sb^ z#9KR3+q#IwI-&zYZjRwS-u(DfuCOV+-xWQ&AC&o>4B|a5VzE)(uCxUmyJ@m`q9{;r z;SQ`yAJfWIoH8*xv1Ffc$52VjVcR&7o@eA0v`{yiO>U+ns(FcX9kM<{wZXHWB^X4S zC&@V~qfIrBIB|mMJ^};JUdzjd4=og@Zo|hQ8*jZO3#C?PbK9E``?GmWUk}%C+S0yD z?jyR>2zlc&xf>mdU8grEH9%?9Kf$UG#g*WA_hjMM_6#86;UGQ}F`rk6WF~k&&n0$$ zM(Il&DdfEeoGIfrW0D)D)@w|UeI3W?%0oQ5E0BtH9TQjPN80FO7%-kLMtRzLJdS~L zRJJT#joKz5(eQmhlNnpcmv6Eu^=dz!4A(AT5bFkA5d_X~O#OoYo7DQ0D9P^Ty#D=9 zr~4&u)uEV^s3NDs-$L&9SB6K<+!LXjPU>M0c5GQ)C2tMH2a_mUBY#th_0V0A<3{F7 z`r5{Y7boIg4?7oqn-Bdy63JGl-d#((-PinaR=~7%S)TJ$9CjtS7JvRelSUEa$2!@l z`CJR5-sC8RFR(7Wc3NDNG6xzxDYu)a)6!jVqpS|uXUH?_p1+y&ZMz}8cQ=+RMxf7P z;*+cjxA=n@)YbSf(oT9NXg9?cV%PR+yEj-7r0>1l5gQigg=Yz-o3;zSR_lJUCd?F4 zu6{HNc?ymut(I=KRp8AV&Wd-S>;Bv&8thGzVBhQkL||^Mta3W4M2A@IN4?se8Bs2U zK}`L7RWao%!qZk#Z+lufqqd)WV%n-IgXS0>2tz8Ja+>h?a{0|qrL(VO?L3QWm@2em zNqc@za=%n1pw(S2X`zJ}iAVZ5Ts3!Kjnj?;FXc;*f%=oF1DYEFOisLSFn2I`r;@aj z<_?_$d-8W=Z=CkOCSLqXAc)@jo6zGb*mx!MxJ=9B^dDQ;TI=dR2BP$HO_2W@dazy0 zP5_+skI>_v5({T><>h#W{~mh$8nRsUW_@1=a3g+OE@Asg;_)|U1PI=AENAq_Ukfcj z_VoXs6VRfhV`TsmjVmjE(yjdwCIO^EK!o-@CH-j<7`-sS1OlW$&i@98Z0KdIEp#8~ z+YqS|(aQ)56Vc1-JJ=BYl)e5mrR*|h;s6r7e;qSD1bY36kZX<=7yS%OAe9NDf^(MB zmoj1p%QK;AwEg`daQQ^H*Q;J}6fv9M<$1N@L{nvf#Ti6-(r;ArY*;z0m#Z+|$ ze1DY~aRYT@j%s?_+{*U3zO2~uxMAbcy9wT-uX#n|TI=j43(U7>A|f%K$QdYuY7-c5 z?;g39yZA-tdW5t1M+=Fzoi^=}Yb<=a(@pi>R6XXc-F}or*uYbYWtguWWiP|;+zv33 z?C??$S}i$rbrT$>G9JuB{Q8LvvZ#h(@#F1XFHA>DZBU$rOr)DOrQ<9r5(;MK=OTQooS zjQl-y6WjYF@FJDx?rr7$ypE#x9QTfttVA2mvGejqbCOoo_&a!!i z2z3-&NcraZEplpDo35^Ayk+zPczKX&zo>O8NtM@+(PT73?+=;An0CFXvgh8m?cWCD zzLhIWkdbUzZqKBTfx~Z3xq?xHrZ_N#m+TAWK9I33g~KrrUS8qO!VqY9k_43zf{Y2; zV(MWfK}s|fKST6Dc!UzILV65tn=t&aQAcJ=*=wI_Vk(B3W8Wl-cEAGX&Y_Lm-b{+kX?e{3w zTAxASflM1gDa)UMnnJfH4y{fwPt^Jt^L4SYd#@8J$;Lai9u*S0@af8{BSl$E(!+yj zu&?S*;vz6k6x9#zwROM^qfH_C_DvIB-8p}w-1+Oyc`+j9pG~xYy3W~0{;zjV`ty4K zV_+j-yJ)}tWf%AZK^PVQ?*`^(0G);3$_Rk&B!H3tm5KkQjG$|zZ3$#&SKC<5=i+>; z1Dx%<=Qr%%R1kiWZ2hr&{#lawQ@#CLl6l71{g+8*qLTRISvG{)1;vB1Er~p_;i_`; z%#hLnW2D;G+`Xv!#tOvhvSWi^Ye7K!6;Ri2JuhCpuijmEbiJ_ulc>-vCH89T%H zO-`$?(PNL*WI`Q-tS7L`cLUXAf!%b%>^HSSy2QT=~lTF<_UXRH&f%OKW8Ia zX|_I>%CY+}ZT`a2Fwf{>FOR*KrSDS4nvzW4QE^ZjpW1ltSYm02N8y3=KBC!>BYvWc zMJF-hN6bR#0;xS%&gdSnEWaG~@OK)0FVmk8KkH(hwu`Pm^zGL8GDE6dFx*76tjxCa z?k4EVA%tXfA8+#aV5&n*JAMWHB2ziNMu;lOgo%Y&#+=M{Y52RJdSzC=IHG2fpytIX z@O^xI#DkPp{jM%iIKkgOF)3m$De(*5kxV%8IPmvj$)Bwoa|w>aG^Qzsyt4}jWgUIYZV|3%_N@UlVVoCgyAWP!ZlH^ zLO5ANsRGk&Eh~K0WV08Xe#7JAP_;X46B)CEqE&2zqo_WV>=Fub^!w^NnnZq|0xUeO z**%?kz#}JmUa;h2NAPl_H#m~{Z)BwCUvESw zcEC})s%4lD-2w##Va3*=#rjc!BN=TSY~E>V#ilYH??q`>As=&p`WI4K{sgbLWi0534%AoaS}>8hJgp&ZKH4)B={C(j#p`DGH0XUz|rXcuM4^cqE93`zh<;NjZ>q4+yOH z4}@et!y~9V;X4XSYx=DQi@LbD?qXOEjzy|aQXf3rpbnW#IC}Y6r)167wKfkew%W>Z z;2|R@(K9LQq(WA;Dx$dKfX#-Nq(IQIF{qV<`nPz^j+?t zrfP{2d){65nyTp!NT;va!ztlPSURe4cSI9vc%Yv$J1o5T3JR01ZE)4Q|HP%eK!<+y z?&lum=aTFNhWoF*`#DWy&xtvu!p!fv`ElJ`pS36C+Q#wZ<+(kh9HxgNK44u|P&jG||LMbRsn*9F z$sstd${IC}@ubY%sgSB0@2#0pit=2M9BzIoI@uliz=HSqEmv?jsWg9{uH)(2k?WIf z+4a;u8q6PA@&yLYdjOxR=5S`QJ#s) z?X|1Ex(@y%G$Bf{wADdk<#LL})|J~YSl3h`Zu>i>Y%W*iVIC)`-1^Y)lA+t9Zk)HT zKhg6QZ9%8cL6{T0>AMcC+q7Ydl8@e2J`{Eu>EL^fc+*(+d8vV6C3nvAxK6H@cD}jC zp^tA0I=E8w;U+=W1g8~STOw{iyqISU2nnodOg?N(188AaCJhje^ZSY7){dP?T7sv~%x9@u> z^>BH*F=b<0AoWKr5Mz7SNQ(_OV+gEML^_gGS+Im!WN{5)H=SWQ;nO`gY;44JZx6mw zylwo}^(ovoO~v9=f}wu1gNAc*+6h@O4=gSGpaR})--G;!%%E~rCB*hPLxffD=P7f{ zK3nPR5v`yh$&96e?HoOAz59686dV1S13V336=;ZwsP5FMx%!236%UpPZc^*8ePk>j zB?_rGdvK4#GN;OM&dUA4JYWF$P~ zM5>;6g;g`m#D56U8`CxX~*69 zz&^c%M`Cz{E36ZId{d?r38wPwHLUI@0{4yVQ%@N?i|dVPL04SN;>tAdn#E{leZlAD z9;_81!X$3g5rHTb^8IY?7AJY3rinzF+`z-fTJ zi)8o?oO>FF1Wq-Cl8&)xvAD0dgwCNZstkiiL|H<5RO8Sfdgp`G(F~}^fCk}SID&ly zro~bJI|c3B4HX^|@H7}QIgxDcLM=fhwZh-L zr}%(%bZEcxi}E8V+?tgYff|EZ$5Zwm)ujC{7J9HGHS^3@-NnWD>;w4FFcmD-{UZ6F zK*>FzdYl6wb+U$%6Y29B?NNhTd1VZrqq#FYMJUtG0t4kiu*}}^vZsKIq6|&Q=BA$J zhtJW@&e@xn*7`~wwXofy749@B9g6<7l_t#fD;hjAbyu3S=0|fb+bIb2R)0MIlMR^$ zx(sKN1_Cj=!^w{`Irra-b5-(KjOczqa_Tb=BpXd>ab`o@1YIFh=hVS$Fxld2tc{Xn zmT;GfG1BC);=(G|*i4XSDy_Q2{ct|0t*Z@HhV{t)mzI$rAxeFKm~5(0}EL0FLB8 zPWR0dol#2ur6-!e?g%F-Uo9wH{7^PS;Il%0T*S$#YGqQcrd(xrqhPC2P9BNOwv5o4 zS6H@|2L!Z?rNr!R(TH!l4H1l+0}4o=T$oq#vn|s02PEmkLh`Tia0oz7M}l;UyWx}+ zVeExF7T5L`lh@gwo`_}15(`C zuIwQJH^jvk%KZI%N{vnJV^$k#yv(9N%$#Zcwt^$~2|9Q^a_RfnZJ=gi$*CZbkw635 zb)D{T-hE;4u=#;>Zuw2Wki`T%Ixm9dGV>L_^!m@XO;P^b2eJm%)jKSI;I@`QMARltFnf8njWo3U5wC^QABt`^Q z5LLF2rfY;tm*+p@RZ*FHG(Cu9XYHjlGqbuxC}MImd3i}hg#JtNE(fha)7xO3u0AJ= zM@h|DQ2jXk-g^jv8Oy??$Hn#zb0T*Tx~00jvyW3OV7pdWA3q_qN)#q$5$6XjgIvZ7 z)GH{A^6E5vl)Z>Nshb)4Xu$ieM&bCQ)nR8YBvy*(&Y7Y~>4kg`IDSGDPwQJe6D&H~ zd}S*P`t$zT$onL0f%5Yoada1YGIc9-x9tFOsV*CkOSzeENmhKC0Y5SJ(O};4IR-JQ&S4%L9&lXrWh}(W zL>0YF4ZhAU362cW6@>x7QbA6nuWmP$`7wExH+EE=UpS_wGE+-(Zp3EdiD{t&j42sdquQVr8MKS_k;{t1YQ_WJw2;0`^ zC=rRNULD)iX!#MhyOdCaZ&uI@{hN(Y-D9_o?OyWi}?uYSs_xN4A$^wI8{q!_(M8V~vJqkcNsOG{i;J`**-D9wuO*{G+HEUi~()YdYp^)T6`*2P! zC{Mk=9OFR>7;V3RUB82b#L(Yp!W$;$w=30ls%O|*NxTtnzdq^Qs_uPX*Q=;PBgLyr zb1j-aBNf>=jK2~a^q!o5vKSmsCc3l4El)P#nBqV=SxjLe&w#y=Li)`7r|!ntwLl@KtkZ3gARKJB9TcB~1hq00J z!56Ht7gYSgb3ODvH`Fp*!eKi%tEf(tCqJ=1_NbuHuPfu}U__z7@g@gYo|7O1sinvBt18D93BU%8$nhOK|MYZ}TBGB&^ z{-^x=C;rB77BT_a2>>yi^9s5M5U>7!TN!~1@$Gb%5gZesHT-WQxK%aH=O4;Yp4LgH zWchqnV))`Ik%_bruu3k;ZR|V{%`q@7I!K`EFE6?@{wQm*rb;Q4*f!!5`IuM&xw|2}UQOM%q&`wDT%Tq+v3z+qe4nUYRL1?F6G=bg5kVk#+ z##<#JuT4S;cS6ECGd*=EE*c));%O@? z&mp$*F^4jL`J}eK$jKwPY-w^&(&NOYD7(1whGhG*>|7@G73JJsP8-o-Jw5vr`I(qO zf0$u;$;beiM_(bj9+?bks^`agQ^A^@yil__4jp0PR)NR7o0Zhl1JBf)p@;!jicCfK zINKyEFVjB8hT2B4$lPIh!sG*+1XhZO_(++u%M+s+twicFv|P>rGJB&Yusk)lND@yr zpIFjZ%BW^xiI=9urtxgH&d9i9Fb3XYn@y<6It)xhggcpJw2%t z%wj0+VR^u?tu>_PQ6D2(0ELCb#`8AN?Q~_p3C)8utfI*~13GBgM|ao}>48pV@| z_Z}weOdAcwKAz;T@ACIw^JN8#TYhHJ8EAM8;kr(HjJm|w!&ZXk%6R8>_VWOegs;70 zZ|wY1ifK+ZUPO%S(xvH$g@in~#pmvU4kS|C$?XIfl?7~Nx3fdk`*7HM@#w3j;Xe6V zqeTcjMT6Sid5ew!qh_GVeLvC4tD3jeMk8`JC2b7J!tIsEXu3cy{Myol{FYHU_lCV^ z$Jhgh(bcY|$BOG7qV*k`_O_u8(LR~%JEQV*E|CQz4ECm!V59VLTByMoyv2njNC_Rp z`)SzEKwg9~NDjK;QqdXRK*vX_wW=hhZl;ANjuuZvr!r<9z?_xQ9EoSs^B8efe?a!u zMnrO{Poe{zk|*!p3{ReuJD!_K%-u5gMmyW#z7f2FhX{N0AMy&e(>_aa!wrTbKw($w zInY!NK%n!rIpZlnE-$=VKB!06bUrXd-zR|@uA#l*FUOLL3jR@;j~;)I8rDzwF|X@N z{HWvRn%mHxQ@9mA*oK!QK*D*EaI9e&#y8H&2+_x|Y{oL-Rn_~M4*3oy!XT?WN$R3m zd|^qis^6M>hD^P!+{?9kFuSb8kkpA$QJ>QLHmuWYELI{-7N= z9!u}+8FZ@DoICBn+!6@7j=jMH?=a#2qBnSR4SW3yVQUq25siXy;tdB@U&%oj>+)@# z4@i$y1@P8+qBvLUz;I1+w4b9&kWDY2ShzfF3>=!mU0t%T(l^pv_}cje)vLQhy@(rw z<+g(gS?9rfW3TDAjSPE)t}DjaWljybUty z0rUQ4_sMP-qXTE4QuDz>d#{nX#tteD1Ce=Hhp>zX_`FZujPkkX89*A+x}Sn=4?ZRE z41gr1kPEcLnYJ#nEJ9YkbK7^C7)a2%S0rmfqVJzL54}O0zE8lO7GozDB7>7+T_n>7 zD;~(Y@IoNdyit+zS$wb6F+Dv@B$Ric4T+xcJ2e_T`Ofs>P0n{LnNp$e*IuS_YX&#o zvucUN?PE-x)#T{Bx4ui{Pda~d=X=}E{Z)Op%zCCbDx12 zeXxPtO5;uep%I=S0T%Xh8A^6}r9=G9`zx%fHAG{&8VfckYn)551#u>o(rYkPnvwR{ zN;>av&v$hgRsr0vHos#&t5X!ZnX%Jj!iVBwXB_q zTD#wGeS#v$CVhzBhpv^ECxW$1p6R97S5GjZ9CVQsTQ`AR+z7lO^pU=4kTCkFx^pZJBl@@9mc5S=L8eh$0Jz z_i9yagy+y;BM`-52DMaVwgS=@@1s(88cm7bi|k3+ASa#HQXFn4c>)vRYOQrgL_m;U z08?Bf6xK4`E3yi;D~V``w94kaj<7rmXg3_RV-TEiJ2@M~Mf96B4Z zOBh;`2?Av&3n@OM!Koom_#Zj4zmXh-#>2oT7u%t;nH>1&|8`mTIMYk0f7U(>T zat_XD5znc5`s*DHpJrVZf@2*@FKz#HK1;6_n4kbJpHPX%3*CI4G~9ZNx*j*@RwC#4 zbebAK^~lhMV?E_lyW6%uV^>!QPtxE_vow`Lj8Iq-Gu((H|6S$6F6>*J=4z~HlZua9At}lKi78!f`fF;#HuuJF*Gg4Dv z;B)3|V}yyXpT6{J!Y@97LZzTkaZ}BPwn%*)bUXt271SkIcJVif%s=a;{~?h%mzDcx zeU|+~$?jT-%s*R#&eMwX_RarZp9O{i{F)s6ypj!IL$R;`iPF`y;-5(3ujl-hRscM6 zI%Z}-i0jwoOg|Nde_aj`Us!-XOGb7;um9JT?7xDa?3c=a=cwto6SDx*7Z?DB%hlCa z@~D4Y@b}dKV;|sk|K_THl34iF>~G7N0a<%su)^C6x)t^RKS{XQ%gnvK_dCEF3^Se|7c0 zd0PSP2=+4u|CQC}+u65F{zu{9r&_^J1i}AQIG`5>D87K$CGZr1+Ke#35o5X(1^suR z(D{(cZ-#s?DFC$oe+de$s%VDHRv=7- zL+n9IQC3;W(u+lVdMddu&uy6&U%OxvDbdgbpbLeaghfy^h}G9=Vff~9$km4S=M^_4 zDsk8El-q+oXXl%g!1*{aS#wG`M2+l99Ij*dN zLjC0^)&|&C*jbgHb zuM_E+zP`p6CU`#=4M9&QbaTpwf2x%qweV$CkNr~|vOW*lF~uW>)~{wwxrR+Sz0!e< zo)u+Et561+v^ifrUe#_7+v*t#3=ehN^e*Yy>b8a+Cz|{ zkzGs>ON$tc*FOUP9)b2&p|}G>N@0cqJJt z>o*P4P`--r&;-X!$ZhbJmSMq`l*>t#S!QEjXd>Lcf=Zq|U!%Db<|2RT>hp?u{2+?o7-A-Q5Q^1+Ld8357BW65}%II3dMpXZ6e$l4iP(~=D$xS3~8vL7gw?MAlk2O;RZG_ zpW10+-~m$STk7!FQ6qUVyOyn;Cp_h^($qgXMKCAniuRvGd<~LX*_t#B@z=lg0Ls!( zf6HSR9EKrL(E2qjDsNzuWuMTkFWsWzklHX4PDITI4?+(MGof1Ck$~~X#mgN>+BL9| z8^oGl%xnC?rcXJ!5lRTkz7hm=#3ilw%(6dYjdJtfA=4+h<^Kr$h4s^WnkR2#bxN4%k@Mv3` zF8&#(xHdWR*KZ4q0`BM*pEh*ffdQk>PZ&>Kw#r6D@+H=JF5-Hw*@B))3Vo(->0q`Ui)YD-hY@7yS#f(S!1&I4ti_%}q% zPyd0ZBuz@(K}1#@0e8N;%r4PR(ioI-Z3JiRtjX0KS)#Jkylz~bnm{kc zYKQ42dsYh4o0d)PnLbK~RjPP4-)1WB&H7XAx4zhF&@o>~au|_-`p0e(BC4}C?WTQ> zOc5$ckB<9b3629lB(Y^b>c_Gd3!&&S4RH`SoST8liI2mzKF#=bZ~G_~+?ytFa%{s> zL`N>NlNqc*49KAjUMUKfp`jr!=EX1$1|vq=omfsusH(PhseWc!d5txzMJ~M zQ5Fra!yk#98)ltF6xUh=x19`eP9TNICxX03r`J3M00>NB6D4{ZX=dkG)a)mzPbI7wrh36P=Ul_2GkY_nF! zTa*YJM67OJ?nT_!bz(X80wmoR)w|sR+`a{CU1St+XrO|gv4(o8Lk9RL2A7YR&i zS3hj)JEk~KIaHMOyCTW-^!zL-?@z+S)Q!Buq zYDal1jHHp|IYNo`H16}~#-ec)>Y#VJ1ErsA8uvRrFSA)QtfobRa|jkAQHIRo!;PrG6Z zQ}Id*Jyg%3C%nHPko9#iVwB8w$Dk_g{jS>`$4nl6#MEYs0~!u--{$Vr&WX?AkT)B0 z)ZYh3$C?>0Q$R6Ctkz{ZBUe$*xfo18<2WLJq{Dn-5@F5-JJr`9n#(1-7O^{($d|aba#W&-61Ufbjd#!6<`<6BLntRSXm^lRL%44T!{T>@^wr%u*u1VsGa?hxs`ssbQ<_0w3j4v;z zz23T*%`K*xyhpawp2WSt_!xj1BnL%#Om7~kBrQbwz@DK9&L}e<4AnouV5}L=NN`%i z@lv##Arl z;I82kx9SfqdXRJ=_+r9=?XkXyuTJ;MEAVDkyW`~SNu&GF+a*+X zs`}s0831VKA7u0NIm3S(+8>=W{Kv%of1We2{l|3uUl%#q9(gH$hZ8>v_=|xl8vt1S zQ|YgfKOr33_ZcQVKoRISEb+rn{$~sS$8dn^89h5d#N_wzUoqIf>;9SjyG#z?sNxCS z41jh2yZG~0klLL-=03L!*;MYfv zsDBIxob>?Id7s#HKfWhFH{Cw~_7P@%gl7MBq4yDH{X3Wn_}qVX*?(aw07d^TOnt6t zKmYOTLW|x~Vd?-SVS&s=-!X}4skj>tmy|K>1%bI~nOp3~_-ZHa)cXsNXT6#;cCnuZ zc;-J>F-agl6F>wKkj+pPK0*nXq-Bf`ki*#uFXRbBR{`>JCI09Rc2^`6V7w(NqfK6e zD5okMsG6cJEtXQ|4Qo(+yK~!+N4L6;C_!q9NhS}hCd_#^(08#l;;mY0fDA^dQ5wq( zt<~aoGo@m!jeNBJwNBBsK~dc1Wb_M|5O_Cr=#5(~TtLh(scE zoWB2UyPaB8YtpN?%Y#64rg-xf4#72qm~8L)H=O1sl{miS67hfDvzr9XjDOak+D|_H zCTk}Rh(Mt&XQx1vP6XM5dd@QIQxRUlR-slu@yBj2(IJ`oydFu}hmF#r^9T#6g*WfF zj!}?ZGrA-S`*Q_!{o<4vq2m>^Uuv15gP|24Zsml4G}W$>``HgbI7nUkoYS8-n9YBC zzlr&B;`L&t`TV5D+$q?b_ZwFoeaX=T{EfyZR>H=ReLg@g^Kguci;R{+8?)>jpJJ|& z16>LPsNGFj>+E4(O2?tL?Jy*ivuegS2%wC ze`(?DkH5&A;gC}dau{{w_a44M=cILh79N6W@5>-wsfUrRdlFeB>X&HLgbn&hl~gVJ zaQ7Qcwl5{{Gy*X}U>0BmR672x(gKxasS4t>@KQ-Yo5&J7lfZ~7u`h%+>JNG}XAl>I z$z!edZMY)p9j6nB@|)amcGG3Frxp%~-Vjvnb1l&8Mnk=m!|Aff0=k~VinsKv(Pd1n zl@R$7p*e5X!bw#P+CxP zk8R8CT=1~GYGaiSH7pC2d+8p9_whidtSzV>3-Xe#R@(KWrNPm`KGqDio8L)Trn%*X zp5{(l6a$U3)sWLv9FGmzk!o~-WAn7V{!ptOxZpdrn9mL=KG@~bWYXfOKo#BE%0vRz zyS73$Wz0U6_i80gOVrhztF5H_0V zMjG7b;BVwq!U44W0cVrNw6>hx0sG4;a`buWY=%BivLF=Ir0%Defmy1bdg@{G=g+?7 zYvQAPoS94md5@)B%(TVuMMaNH?!pS6B_V&A<7(zUp*%&08Vx-n$FKCm=LNC6t>QUB z{qj5tH}R8VN-l0=L}}9@fO$ZW#>uW;$-o9xVm}-0goB2+*>|us&4M*uNLVzx+Kn2TnBWqXc=@oX^PN=y@THNxZv2UrkjEtR@1&>%sI8nj_8}*!Nk_iQQGrs}&TCiE4 z{}L~lQko>_u+=Rk*fehRxJ2-iMku7=`4C$GAKV47c7bfZ*jVbba%Fi6yG~hn$JZTl z!f*{h66+!Rcl+Vj|UGw!4fN1=6>@8m(}$^&oWCbqCL~`b41u(b4G@>3R#aUNRXuaF-3hL5HaS1X6k?8rR-z_` z9U=?h@nwfmNb-I!2wQlBdhdC*CNri7_i+i=R|&m9eV(6$)(+=$J*E8|PAcx*!bCWF zdREo)%2y4{0U06j?7e_&EbcVFo+VR9N`0V08_u)4QOK8>PlJg@d(04DYeela>Xd@ zbzA>iEw&Kq{q4&M?9SKMpj_*h9|PUH{BMXy+QlHhVFzH0m4#4$&~}r*7g!74rV@rn z5@Q|ExQI9t(FhPvfWp=zt9)1Ij1^uUV*jZ%YFsxZw+|ExGHUyHR8V`WLrg_GnMOR4 z0zPlAjhL|6yaKwnwIo9oXV^WxiIA)~9%x3S!h;@z_${@hJSU;ibTFJAUsk&k(V)^R zwK$Y!IOdJky2whb!80TJL2WoZ=p&M6mo_YkQNZ{5J`b47eBE^38JA!nw;#!4M>^@= z<)A~Q!cXODDQur?o};GjA0N-ABq>K>vooJ-t0S%PJ$SZeL9>G(BauZh3_U1GGGUMN z6B9wlH$)rV^8^OSz7W@sz_JTblc(Q>5PTlIeQYH7K2GR)|Lo!e@=o)etL`osEabd@`dEF%#$yxXL|K$KWG{j0Z^Oaf6reTCDd2Y21M5{3zg!DoSJMXPH2ih=9Z}L2VRK(7pbSiBpd?#(U5r82WUk^v^?SXB z(-DyfiYrgcl=sOz)2uf2>lJVeSx|H1+$a$i?fAp(##OU0h-6nLds?O3yjPJ$fIgZH zf^8;L@G53t+)Vq&oB0O4dVmGn#o)$ttPGMu>$#taIB})f3_v$FXH^;yXVP=Fs$eyv zQ?yZ-Pyh=x6#USjhgtPoFH;MoPoq+!IG4&QOH2NE1izkreBO~_jt@)1v z{sKwrU%0metSRG&!6^qsWJ0`Nxu4a7V$W&btuCw%-K&cOm8`2HUL zD}?%Y$^Q)pfLBHU%>6Z*@rO^|PZaWNa=_S>k%5(#9WZhJEt2h#75cA{Kl1|E#sCX; z!07GQ#B4ua?$5;kz@JBm=MffqL<#;E7WzB*11RBl_`?FA1OF}j(fmpLZR1rkBg6y( zMwHA=wdHo~Ns~@yy_h6M;D&bABaERGzuMn9YjDPZk)IUd)U+SYwqwAdUFn)@Pf_M4go9vwM7k9rEc|Jk#*@kYyVmw2Zy*x^CxH!!7JHe*$Y&T8!WuH z4(tzG5fp>_L?x)jje0>6h$czvJ7Ys@eT0VU+qW&-QjiIu-0mM4CUxk(lD$V{_o{%$ zPsLs`A0{{e0?#~{J{l3jy?Drf)_MQU;+tMQ~OMb zLmPA0SZP6F^DZ%uKb9glZjexnP>dFac`Go@|k7!1egRA)`L ztZ`Dbv7D>cmTk5o|LU|6W_K7?OKJ7xfGsa05hT{qjPQ)`>;oSf3%l7-*~w9K*m2+S z-LY}-;5%^lulQizwijhzM5ZcK$WkdYlLBQqRtZ;E^=x18U$pUXfJOiw29xB2pGP_{ zk>d3fMT$*VfFkEA@#?ysZ9B)M;1`^p&}F}k0%dn4(F}{ZUCptEJiJCT{$%Kpe8{(u zZzTdk!8L;<0V``T=^)(KBGc9evU&vP93T`R6p@?-E(&+g0$V>OS#Ud;S;U&K@p2+_ zPx~g`d?a94-57R0+lBmjrtPQEQHlYBv{c{jjGYN45@C_p_6dPxZZ*h+P0CZ)mQxmv ziI+Kj0a}R=){JJ(-k3h#JuJa3s|FUC%o8V2oLI-`$LB3!Y`w=!be*C+WTVvgHkaVC zxbC3&BrfKr*OP2MB5L(3oqL*}i^H4Eb`{D&BkT*jLanQ=n0N;^`7W5&WX{&i?~!;L zf^?J&W@J4Lz6JVqO}QlUuV>&C@YahkDrGRB17(wJ=cIUSJG=Pm7~ovVx<6<*dMYgq zVaT6iai{ScE3_GF*L~L5o#DFeNf*=o=A0r?r{$zrX!feZGq8X$56e%)pwB^!56iWm z#g+!KkCV$YQLux#xMC(W3E1fbl~WFAHwD|xuDPJCp!oU&t?n5`U6tkBAedx6RBpVB*0!Vy$^jXZ^fgZB^JRp>&!8j2(WtSU;c5jrbP)kWh=w+kIJ&Wk>fnxWOt zuxhF-6oVehTHie<+(64ZS%Ps0B$Gc{X+{j%tcy;`VXRr%!)>voNMwfM*t>R8Ip=yF zlfqIL2j9^x4^33CyI8ZZ^>M__1lrtw3LTp=j+rwQ9}?FAarl@)!kpN+WUjW<-bFEV zJUC%({7n`33pV=Jb_6h^q6lA_lhd_elsUKD@fFA_9CY-SWHCohb1N?!Lzye3F}d6f zVo4a7Fz~vvWNM(eYrmHPAl4Km*9Xy6FrG_;Br3e%==j-)8 znV89j5-H5H%cdYe;%iir80u_Mps?!uPqdv>+Tw2P=H?9+w#GDdD8aw68GdI4ts3H2 z9?B%tg?yE-Iw^-#cn3bxwo)6-Plh!9YF9dmZH->68u*|wep)4* zA*d`V)qtYxylG)3I>2oEMk0?N0Wp(MYT-0jqasdzjT`KM8D%}eiv7XO;7W4Am*T*b zP7tBYcI|xvrWjcmoLIM}WS|Ncq7%;uzy5VCbnL;VPK^yrd3nKs@*RUzKvJgNOol^r zf{)k(L6sgMC}nLt=mV@2@})6d=ock+L_NH8I0e&z=vcYd6k~IzJ(8Mw+h906f-msu z&`EtJ!qe!5C!lRWFID=z8S)E zrlq>SAwPv(r+_|hdC9a}k{?j(muypNgr8Q_XCQddeQ`N9`Wy&osO*Yi7y$Gjkel73s9@n*vTLIgH2iS+pAOD9~!YkB2BW&0w>$1+My4t zK}$09>KqLNw{S^fJhx#Y3t}mk=P{T$j#_OFzw8mbaFFo?(S6O&yhY9lcKw_+fYReO z2_cB+8CD+8IWmX>{;K~-v1fF4{Cmv_kDSy_B3aCkhWeM*6;vMFz|Zil^@0Rdk`%Tn z?|`8?Yq0CDLj!K&ix`lVm&dcxBddk@c$7vJWLWMZSFw9p8+>aiyHmJ!D+D7Z-Bfs( zI<7#BDEd!?LzE9S2;8lokJsJgx0d0)M0N7^SXHCw51ju!}JnAUVewTxDI@g9psQ6WSaN1;~nDH zdl#Vfj!{cw@2JdCW@UIeu$nVDEWc(xv{#UgRz^~=BzojXLZO(iJOncXWL@$)Qa)Y1 zIQo(iKhuFQ-xTV_qq@+;YX_mwBacEi{W4#JR#Coj!}es@wL9SDR4Qt!m$h+2gPIDN zbt(+h&4<;JQ^+tF@W4)N+&rt)C=9-rN_>YQ#TfyeC5!Adw)MK`bA|g_x4zP zx!qlxRqI{UbiIbf${w`+Zu4zOiNIJoOo?^cGpYeKqt&}>$fAKjrJy>4VXZQJ)VojR z*FA4_3{Q@yrih9Oi)l}diIWoYnzLpe%tV?W(qYm-i}reSgc~ zx9}e}BLDNz0qjt~i0O$T(GT~L{}~QohqAB&3}JuI{%_Rt$43XSL)igK_eA*rYp4GA z*}vOaG6JC5@7e!m(*c~^zZ;4?0Wbl>&i}pXSO5f3fDGgl#99C?{4c^;0d}OUPoZ+w zU&+u}LXRWRVuf8TVBKm6wZ^x^=xnu#9Z?Zp6)1O9#0e#P@oC1wJART&wc;IA`2 za%%qdm4D|!16-In=mGoc_r!m*(*fU5zyZip-_l1u4!q*4F) zHTH9#{&NiT=;YqrPB2$BOKIp`E!iAU6RC zcH9;QEdxQ1)v1aV{SZ%mN$l?7VYpd(baRDw%=dTH}f3cS6sNAdr6vdo}FAwuan(Y ztucgA2lsZ{j--Wn`>Iykw?k$CjY~Yoj zn~fx=ClE%_Lyl2^X-h(lt+ioehmQ+tE3M(E*)43$QP%gKL6f3mcn+OrLT(a4Mmyfd zR84i}1Ugsk@3H2Nnr5(_2bP*+oKy)I&+_qD@3jZQt9|C4Z2Q`quvlKYm>e*CB1Fdo zX*9Jz+K&Dv+#l9KfCxGv0g~NB?G~HJCn_ItW>}Os!jl*-$MiM(aDD)U_FS#1ity6= z(kiLX@()glnkWmGF-_gur7w@F3QjdQMVX1gZG9VW0@CJU*}Yyyr39p4RsvPR8_}G~ zIhg8ta8hHN^VUu-3TV}e=qKdJv=%Q~4hRg4JF$IngZui$s0(6PWK(3!8wM$Zh+tWi zp#VtU2ftjBB7s~wL7a3e9H1N6D8d%u4B41B9K77|hRZ-a4tnZJ+Xa@IGvq@EaCIeLLP8XIo~}V$)~@po-zesVrOT9=6p){OvK}>k0nl7nDt=WwL4uh*KN$W#AZF#tH{_-2EiVllxs( zfnU+6ov)J38unBEe(giLFXAnc7R=M zEG-S!f}^gslE9vn9@0=K!)9)!A!NA|wAh0^nW1|g~Gx@_&rnW9c`>&~{| zJlJ=P9+Sm6B;$M!f3cN9_c{%8yejmu4RjS&^T(x^`s2OTQ-~E zBuqrZr#%3Q_U#1O_n*A$KH=REC{=?zzV`v#0pFC1k|rs_<1Jxg z^Ug}|UzF__@K}EDeSBBC-Rz@$Id!9~5>HPXzze+dESn65*d=&^I}8t0K7AK5n}o^L z>p+Y97&N-X!rupr-yt!OoN&?mpd&WoUFXnFKn_Ym8f8MZjxBP|g$~p;m29(&jaUP)0c`E95oR_qwaI9SKj*e0f@f48)O%6kPP>&f#QK|$QZeOcb^rK!B8SG;&rX! z$#T#(4!{;fX4E$ZmKb;Jmx%CvuH9Q#2;CeBI_vR!Rx-2z9?;&AZn&KhW^^EDYIDHxu{*G zF2g{)-!kXw>A)5+&&7GP>HIO-p0Ytp0beWHHc`hUl0w4lo9HWN6ycs%+)BLO%U(T8 zNaDD0-<~fW2Pgt4M26ptUe^WUqp&yGga^LBT6|@T>mgL5aPAuXIL^Gce__Fm!2h9iAM z)>5-m=|0Q#rS>1Lk_am&K!xABAM^{g#))hh_A*i@o9-@LzYp=^Pide(^2_Li01vn1 zrkTUmye?BxC|xmVs86^jT~yk-bRS0$?1j}@p(wC(QS6+aKA637luZIII5@nF5Vd?W zvAb1U4A;CL+)}bEc;y!kBbn1*e+^Ra`K_b5fOD=G7X5)+%U^B=9fde%SeqK8JT*D0 z{z}ZDL2Z`X`J2$uB&V>>>t`5eG$4IeFMSNQ8TKq+Q^UpMWwIZiw8ydTl{W|V=oC-A zZqS2A+_Sxj*!4OGH_{KbEjFqo>{W5(UxX3>gViI4Ykh9WKnsj0N&*B^kU!dwfkV*J zKUljEe;|(o1*x>;z|a#^RQhQk@5bDsgrFKC6z7w>JI#mX-B}6iX>wwG62hCiee)xrz+Y+R*k?5d^ANGO!$96%e@f(c2 z+)81JDFt5Yt9*&tl7-2}D_&$QQ*!r|^8F_E^_UjSJ>2h9>ciROm#h!#M~Y{B2jASv ze?LuO`!{@f`ZVQ76ZrTv1wiinKc1%iusHeIz?s@ndLi^P{=E;fyf=jf_Pw|X@IOqH+ z@6YFD0x*361NA3PG9Fnd{JPNp4QFPjr3ctWK2iIxAm`uf_1|zNR$3-{0EzeaNB@5< z_kY6yOkWoEr*7H)>KyU($^odp?5t1Rvi*&i{_omJ@BjlBPE%Kb=U{3pEnZpHYw@CsYgdae6-p+zuC(N^y~ykUOt?cpvJa&;oB zaR!38>?pD&QjA!9_Udzy2lp*~@fb!Lus&Q_2tQzZXD6p-C!r;>n-0h@ z`r|Wp?j%MCK=-HdupKa%+OSBA3tFDv+K8Db^ynH>78aw#=1ZHS94uC^2rCHP9=>Wn zoPX^}j;c%FgozK?zFtfJc>JwrF8PpmFg3Jv3;f86cgVZ(ZnFqM9RVu2vkQci0BT(6 zc}%I5mHQ4dk+eh<qaL&eiX`P6&!86r5O|?%LZiebDK%oLHZeCGha}$0(*J4eQS^?;o zy1ec)WxXbb?*r>d|ER^3+CYg`)#pN!@Ir%}S?HY+boB!EG0G&GxR9Fh#&<;?pZaz` zcmNqd^_ovg)Ngxf)5g4SrM^l!_(+=qhRa)gP_5VDvp@p^xMU@JMNZKY*bts1w6|J(k*^=(6NJeK3FlMZVTSv{x!+f=Mk>p@_%s%R@g>eX z*vu(d!!m&aaZDr7Bf^X^P6l%9Q{CkTHU+bB3+vwY%V*b&WuK$(GhaTNwGc;% z0GWfp)mEKw)<-UV>qV<$^m1s6RQ0^{-R&lqhiffb^(u`GQ6}%5m;>U`Bp$nA!!;kr zCUv|<&Vw3)pIy6kzASH|tiBXu<%Ly*)guFuZIJ-BA^uo32FDJL31gweXxC7Bj$r<> zxoDO}s0=GQp6Z}wi0X~xB0}CVq+0DKj&hi=iZXWSkG8fOKQ%yU4TI9;HOilf$-8 z$6XrdpYQRB*Wurx#qqT?mYD~x)P4yJ5MN29f>5b_M(bAL?6(N1)io+gfWSG95D&jGLJG;A)EPSZ>6BfJ~R@;#zXNDoO1@n71YZ4Q0IAd6qWZ(-9UG zh>C5KJu~hL&*lD6C;I_lqN&_)cw!N_RSGZNW5I4wIH}5h&^e18*~T{-9fe}PobBvm z?3l{altj?nC&ArwcbwB(T@L3`K$qzXHKc<59(_p}(Zg7<%KqCur2{GL%Ic!>T;Hgq zWeTL^x@X^Lz(lTtjbmfLCJD2)xd|y@t@!G23L}?HkImJg#EOoEMQXYBG9|572aU$< z?CXugvr-z~4jOEamz+~@GOA1dd2TrrcWd%Rq$*gkQLY0x2VU)D15 z?{iFMc?}EoDVFqr*RO`i*56k~8-LixtNY|6!lBm8fy+@V$BI5%KO@_0Y}Q&7UV)CB zT~6p)5n_`4CiRHU1WH#}?e$m9{kXNMYm|!l{T>=y#{u(jy zC*sX_!I|b++n6hIi(T@n5)?S``{mtSz%yn9=n56$B{S(r7*gJV9{Jjq--?)le1vi= zRce0Mzj1hC7bxDZC=y34^>($pdy%9Jm63AG>oqjKkR06hDX|$klboAqU z;j0yM;YsvH7ErkYkK$^4S7dmEFw|KQM`inC(3gU0K3pQ7D9cenq+9ahs%wdeOiIrP zF(qXu=eb`w_GnaH)mx}L;iHo8L-7Mi5Ta1rnBoWP>uW6;4`7(Va-#Q73$S#;$1X(< zG*Y&W_Zq#uP;V7;90An{E*?^u-(eAftLFU(Kf)njwIc2dK|g0vlnd9YzXXDb1s}fY z+GHvCji{GTK1tY~H(#2V-xIa3L4XH@K5`d{!bKpk=;9s3GxjB81Vy_Q-YF%VdeP7@ z?)|+|c3;?Jqo|xlQpw>e`q9tPKCM=D6!5#C+4a_^KFXUqy#Qy+G*#J> zn&^AYoY&tslWUT$RfyL&+3|^0obGd$#J6pEp8EMcZ@vq+k7-?`6(?s+TDh$q6db(m z0U+Z#r@Ts>v0r*9nwAH|AgbwYU*HArL7U-=$l4Qjq3X{*vM7C8&ySyb#22@HcF@jzs4 zWRg{Oi96yr(M!FaCYc=$s^l&!73)zoE~1j>XD4n?p(tC1uxH(n-(*P?3~F(eyJX?r zOgv&ki^BnZMoF@K8vR)xC}%uw-_DJj?=}}4${B?s2U14zlP)^OSfr`qtu3E(WEdw9 z$MpG7sQSQK{j@A0y#Z_w-!{@6f|u|s(@|2OqN8WWA4Lo!=+(hgdv&gTv-wHm^ng5~ z5hb1%?0JQgv?KTlrw4Yq3N$*#OsO?#VB99ttx$Y!Vs}DU)d8K8Fe9B>ns#WUxI^GH zi$(e!JO1#x`PnT$jUE5vVe{z1>3>}8{x26!e^b5vQNUkdN2W(w!r#HrFOe*OYkv$Z zfE$9pA%fo|vHl(T6Uea81LnyrPf70lCT#UoI5RsyZHNg#Zv8#`uOrzf!`T38Ljcv@ z-=lxUa8E|F0>;T4PpDe~fZe}_KTj+g0|!9diQ}nZ>~AdPrxG&&R*#kADT?%Oyoo2n z0W&g=?`lrJKlZTQuOK8~w)?M_^bH~y7(~(eIqt6vN zU~X=XU<;2bZYsMOtsko|(h%=0!&cw-LNspuRf@m70&S8D^YgodZXmlC%jp`zW=LS& z80tOY7WRbbD)hGkD_9>cfH*P;WkJMlZ zQJ`GU<^zoqj?RQn)NPF{(x~)9(j6sIp+Fyg8(`yW_BaKFOKZNuU|FOFT}!<`+rOJL z{Lna&gT6RZb@8#MujGWbi_lr>I{fS}Gr$$G`BZ^o( z-xkowET-SOx00bFtf(EG3_%es-=oU#U68n(;|%M*KY1`V(Hm}#&E`LuMF<25s3;Sr zFXE`J{)jKTB7pO_=6MbxXlRcN;R>VJhg*VJJEZ46Q-pRa4hmabuvwXii(LKi zWeh>-W1|m;VVUaJullm8a8ftMI3*CTV(9G_)v}|#kTH2wIXMSv3;5<5P5Rg@KBEm8 zzOT4wJUpqY-+f6l z`YYrVwuF_j_{h>T6HRe5?Lbnu4D~%4T%Mh}hIwFbEJ#B;hu|zOZdzw{yp|~RTW6?k zQY5e9_T_sYE99>b>IJWR4(m+ME4G{0&n)%8uH`qksYQ)ltA~+Eno%=dmkHW(OIy0H z=7e2RKYYlV!&%rItCzyeq~SY4In>#?zd8yvJP4^K3#d{T6@^*|WwPi;n@e*1^ z1B4h`zR@cIL6Kz{_SxfN^;t#78{Xp`#khtAiQMqJia` z4a(?t_nmfjEkYr3>npRm)$j$ks*<7)yZLjoMU-Ei;Cyi3RXat3Dn>vyhk9!tf-}>o}JOY*nJHH5;E^Wt6Q>U`s+(lAVNJ2rY01&z+#%EUAOI245^%jTI4g&q^4iXcq>FXAC;RE; zWZubmG&h_+5JdR!iC0O>*0t_hB7n^c`<~n@#ET4sTtruo*Pej^qeVoVqhF>0H|T>M zzXdB1M2H(hx2Hph*1gyTxs-`WWCde!QquB36jb_%0AJ0P9A0nH*32?V;)784i9=QC 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

    A`Gayl1VZscX^df8zjS}3I$Tcf5UR{vtvkP;@ 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 addr". Instead the AMPacket.destination() method of the AMPacket interface should be used for this purpose. AMSenderC or AMReceiverC can be used to wire the AMPacket interface. + + 6. Similarly, in order to get a pointer to the payload of received message_t structures, and to get the payload lengths and maximum payload lengths of message_t structures, the Packet interface is used. This can also be wired to an AMSenderC or AMReceiverC component. Similarly, instead of using "msg->strength" to get the strength of a received signal, CC2420Packet.getRssi(msg) can be used. The CC2420Packet interface can be wired to CC2420ActiveMessageC. + + 7. Communication interfaces are very similar but require straightforward porting. SendMsg and ReceiveMsg interfaces (wherever used or provided by various modules) should be replaced by AMSend and Receive interfaces. At the lowest layer of the communication stack, AMSend and Receive interfaces should be wired to AMSenderC and AMReceiverC. + + 8. Where a module that previously provided SendMsg is changed to provide AMSend, extra methods have to be added that are part of the AMSend signature. These include the cancel, getPayload and maxPayloadLength methods. The Packet interface wired to AMSenderC can generally be used to implement these methods. + + 9. TOS_UART_ADDRESS no longer exists. Use an SerialAMSenderC component when you would like to send to the serial port. + + 10. TOS_LOCAL_ADDRESS no longer exists. There is now a distinction between the local node's ID (which is TOS_NODE_ID) and the active message address. The active message address of a communication interface can be obtained through the AMPacket.localAddress() command. By default, node ID and AM address are the same. TOS_NODE_ID is bound at compile-time, while an interface's AM address can be changed at runtime. + + 11. Calls such as Leds.greenToggle(), Leds.yellowToggle() etc need to be replaced by Leds.led1Toggle(), Leds.led2Toggle() etc. + + 12. You should no longer use "#ifdef PLATFORM_PC" to separate pieces of code that are to run only on the 'pc' target. Instead, "#ifdef TOSSIM" is used to identify blocks of code that should be run only in TOSSIM. + + 13. dbg messages no longer use one of the debug modes of the form, DBG_* as their first argument. Instead, they should be replaced with strings identifying the sources from where the messages originated. + +2. Author's Address +==================================================================== + +| Tahir Azim +| 358 Gates Hall +| Computer Systems Laboratory +| Stanford University +| Stanford, CA 94305 +| +| email - tazim@cs.stanford.edu +| +| Philip Levis +| 358 Gates Hall +| Computer Systems Laboratory +| Stanford University +| Stanford, CA 94305 +| +| phone - +1 650 725 9046 +| +| email - pal@cs.stanford.edu + +3. Citations +==================================================================== + +.. [1] Rodrigo Fonseca, David Culler, Sylvia Ratnasamy, Scott Shenker, and Ion Stoica. "Beacon Vector Routing: Scalable Point-to-Point Routing in Wireless Sensornets." In Proceedings of the Second USENIX/ACM Symposium on Network Systems Design and Implementation (NSDI 2005). + diff --git a/overall-todo.txt b/overall-todo.txt new file mode 100644 index 00000000..55e25458 --- /dev/null +++ b/overall-todo.txt @@ -0,0 +1,119 @@ +nesC: +- David Gay's todo list +- everyone: use, report problems, improvement requests (minor only, please) + +tools: +- select, patch, build, package tools (Kristin) + Java, cygwin, avr+msp gcc+gdb+binutils+libc, graphviz, avarice + support using JREs rather than only JDKs +- javax.comm replacement (Cory) +- build-system (tools/make) (Cory) + +packaging: +- cleanup the tinyos tools story (tinyos-1.x/tools), make into cleanly + compilable + installable package + initial setup: Phil B. +- cleanup our jar story (aka, no more giant CLASSPATH) + drop useless stuff, merge into single jar? +- tinyos RPMs should come with compiled .class files (see JRE requirement) + (alternately, they could all be placed in the single jar file...) +- source vs binary rpms? (i.e., provide binary-only rpms if possible) + +regression testing: +- from 1.2 (Ion) + +TinyOS core (platform-independent): +- booting (Phil L.) +- scheduler (Phil L.) +- routing + - protocols, implementations +- SNMS (Gil) +- Deluge (Jonathan) +- OSKI (Phil L.) +- protocol stack +- tinyos 1.x compatibility layer + +Apps: +- tests +- tutorial apps (see tutorial) +- surge-like +- TOSBase + +Tutorial: +- update, write apps, you name it + +mica2/mica2dot/micaz: +- booting (Martin) +- adc (Hu) +- timer (Martin) +- storage (David G.) +- hardware id (Martin) +- built-in sensors [dropped] + +storage: +- at45db (David G.) +- stm25p (Jonathan) +- intel mote (Lama) + +csma radio: +- cc1000 (Joe, David G.???) +- cc2420 (Joe) +- infineon (TU Berlin) + +security: +- cc1000, tinysec +- cc2420 + +buses: +- i2c (Joe: doc+msp430) (need: other platforms) +- spi (Joe: doc+msp430) (need: other platforms?) +- bus sharing/allocation (Joe, Vlado?) + +msp430: +- booting (done) +- adc (TU Berlin) +- timer (Cory) + +telos a/b: +- booting +- hardware id (Gil) +- built-in sensors + +eyes: +- booting +- hardware id + +intel mote 2: +- booting (Phil B.) +- timer +- storage (Lama) +- hardware id + +sensor boards: +- micasb +- basicsb +- any others?? (mts400 (weather), mda300ca (data ack), telos?, eyes?) + +PC-side java: +- guis for standard apps +- net.tinyos.message (mig-support) +- net.tinyos.packet (r/w TinyOS packets) +- net.tinyos.mcenter +- net.tinyos.sf (serial forwarder) +- net.tinyos.sim (tossim) +- net.tinyos.tools (basic user tools) +- net.tinyos.util (utility classes) + +PC-side other: +- XML mig / ncg-like (based on new nesC attribute stuff?) +- matlab +- C support for: + - serial protocol (over serial ports and tcp sockets) + - serial forwarder protocol (over tcp sockets) + - serial forwarder + - simple listening + - mig / ncg +- other-language support for: + - serial forwarder protocol (over tcp sockets) + - mig / ncg + - which languages? (python, perl?) diff --git a/support/sdk/java/net/tinyos/mviz/DDocument.java b/support/sdk/java/net/tinyos/mviz/DDocument.java new file mode 100644 index 00000000..df45c4b7 --- /dev/null +++ b/support/sdk/java/net/tinyos/mviz/DDocument.java @@ -0,0 +1,520 @@ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.tinyos.mviz; + +// DDocument.java + +import java.awt.*; +import java.awt.event.*; +import java.awt.image.*; +import java.io.*; +import java.lang.reflect.*; +import java.net.*; +import java.util.*; + +import javax.imageio.ImageIO; +import javax.swing.*; +import javax.swing.border.*; +import javax.swing.table.*; + +import net.tinyos.message.*; + +public class DDocument + extends JPanel + implements ActionListener{ + + protected String directory; + protected JPanel canvas; + protected Vector layers; + + private Color currentColor; + + public float[] maxValues; + public int selectedFieldIndex; + public int selectedLinkIndex; + public ImageIcon icon; + public Image image; + + + public DNavigate navigator; + public Color getColor(){ return currentColor; } + public Vector sensed_motes; + public Vector sensed_links; + public ArrayList moteModels; + public ArrayList linkModels; + private JTextField jText; + private DrawTableModel tableModel; + private JTable jTable; + + private String[] toStringArray(Vector v) { + String[] array = new String[v.size()]; + for (int i = 0; i < v.size(); i++) { + array[i] = (String)v.elementAt(i); + } + return array; + } + + public DDocument(int width, int height, Vector fieldVector, Vector linkVector, String dir) { + super(); + layers = new Vector(); + directory = dir; + + setOpaque(false); + setLayout(new BorderLayout(6,6)); + try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception ignore){} + + selectedFieldIndex = 0; + selectedLinkIndex = 0; + canvas = new DPanel(this); + canvas.setLayout(null); + canvas.setDoubleBuffered(true); + canvas.setPreferredSize(new Dimension(width, height)); + canvas.setMinimumSize(new Dimension(width, height)); + canvas.setSize(new Dimension(width, height)); + canvas.setOpaque(false); + canvas.setBorder(new SoftBevelBorder(SoftBevelBorder.LOWERED)); + add(canvas, BorderLayout.CENTER); + sensed_motes = fieldVector; + sensed_links = linkVector; + moteIndex = new HashMap(); + linkIndex = new HashMap(); + + String imgName = directory + "/mote.gif"; + try { + image = Toolkit.getDefaultToolkit().getImage(imgName); + } + catch (Exception e) { + System.out.println(e); + } + System.out.println(imgName); + + + canvas.addComponentListener(new ComponentListener(){ + public void componentResized(ComponentEvent e) { + navigator.redrawAllLayers(); + } + public void componentHidden(ComponentEvent arg0) { + } + public void componentMoved(ComponentEvent arg0) { + } + public void componentShown(ComponentEvent arg0) { + } + }); + + + + // Make control area + JPanel west = new JPanel(); + west.setDoubleBuffered(true); + west.setLayout(new BoxLayout(west, BoxLayout.Y_AXIS)); + add(west, BorderLayout.WEST); + currentColor = Color.GRAY; + navigator = new DNavigate(sensed_motes, sensed_links, this); + west.add(navigator); + west.add(Box.createVerticalStrut(10)); + tableModel = new DrawTableModel(sensed_motes); + jTable = new JTable(tableModel); + jTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); + JScrollPane scroller = new JScrollPane(jTable); + scroller.setPreferredSize(new Dimension(350, 200)); + scroller.setMinimumSize(new Dimension(350, 200)); + scroller.setSize(new Dimension(350, 200)); + west.add(scroller); + + enableEvents(LinkSetEvent.EVENT_ID); + enableEvents(ValueSetEvent.EVENT_ID); + } + public void actionPerformed(ActionEvent e) { + } + + private void zMove(int direction){ + tableModel.updateTable(); + } + public int width_canvas = 600; + public int height_canvas = 600; + + protected ArrayList motes = new ArrayList(); + protected ArrayList links = new ArrayList(); + protected DMoteModel selected = null; + + protected HashMap moteIndex; + protected HashMap linkIndex; + + // Provided default ctor that calls the regular ctor + public DDocument(Vector fieldVector, Vector linkVector) { + this(300, 300, fieldVector, linkVector, "."); // this syntax calls one ctor from another + } + + + public DShape getSelected() { + return null; + } + + public void setSelected(DShape selected) { + } + + Random rand = new Random(); + + + private DMoteModel createNewMote(int moteID){ + DMoteModel m = new DMoteModel(moteID, rand, this); + //System.out.println("Adding mote " + moteID); + motes.add(m); + moteIndex.put(new Integer(moteID), m); + tableModel.add(m); + + navigator.addMote(m); + return m; + } + + public void setMoteValue(int moteID, String name, int value) { + ValueSetEvent vsv = new ValueSetEvent(this, moteID, name, value); + EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); + eq.postEvent(vsv); + } + + private DLinkModel createNewLink(DMoteModel start, DMoteModel end) { + DLinkModel dl = new DLinkModel(start, end, rand, this); + links.add(dl); + linkIndex.put(start.getId() + " " + end.getId(), dl); + //System.out.println("Put with key <" + start.getId() + " " + end.getId() + ">"); + return dl; + } + + public void setLinkValue(int startMote, int endMote, String name, int value) { + LinkSetEvent lsv = new LinkSetEvent(this, name, value, startMote, endMote); + EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); + eq.postEvent(lsv); + } + + protected void processEvent(AWTEvent event) { + if (event instanceof ValueSetEvent) { + ValueSetEvent vsv = (ValueSetEvent)event; + String name = vsv.name(); + int moteID = vsv.moteId(); + int value = vsv.value(); + DMoteModel m = (DMoteModel)moteIndex.get(new Integer(moteID)); + if (m == null) { + m = createNewMote(moteID); + } + //System.out.println("Set " + moteID + ":" + name + " to " + value); + m.setMoteValue(name, value); + navigator.redrawAllLayers(); + } + else if (event instanceof LinkSetEvent) { + LinkSetEvent lsv = (LinkSetEvent)event; + String name = lsv.name(); + int startMote = lsv.start(); + int endMote = lsv.end(); + int value = lsv.value(); + DMoteModel m = (DMoteModel)moteIndex.get(new Integer(startMote)); + if (m == null) { + m = createNewMote(startMote); + } + DMoteModel m2 = (DMoteModel)moteIndex.get(new Integer(endMote)); + if (m2 == null) { + m2 = createNewMote(endMote); + } + DLinkModel dl = (DLinkModel)linkIndex.get(startMote + " " + endMote); + if (dl == null) { + //System.out.println("Does not contain key <" + startMote + " " + endMote + ">"); + dl = createNewLink(m, m2); + } + //System.out.println("Setting " + name + " " + startMote + " -> " + endMote + " to " + value); + dl.setLinkValue(name, value); + navigator.redrawAllLayers(); + } + else { + super.processEvent(event); + } + } + + public static void usage() { + System.err.println("usage: tos-mviz [-comm source] [-dir image_dir] message_type [message_type ...]"); + } + + // Just a test main -- put a little DDocument on screen + public static void main(String[] args) { + JFrame frame = new JFrame("MViz"); + Vector packetVector = new Vector(); + String source = null; + String dir = "."; + if (args.length > 0) { + for (int i = 0; i < args.length; i++) { + if (args[i].equals("-comm")) { + source = args[++i]; + } + else if (args[i].equals("-dir")) { + dir = args[++i]; + } + else { + String className = args[i]; + packetVector.add(className); + } + } + } + else if (args.length != 0) { + usage(); + System.exit(1); + } + if (packetVector.size() == 0) { + usage(); + System.exit(1); + } + + DataModel model = new DataModel(packetVector); + DDocument doc = new DDocument(600, 600, model.fields(), model.links(), dir); + + frame.setContentPane(doc); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.pack(); + frame.setVisible(true); + + MessageInput input = new MessageInput(packetVector, source, doc); + input.start(); + } + + private void repaintAllMotes(){ + Iterator it = motes.iterator(); + while(it.hasNext()){ + ((DMoteModel)it.next()).requestRepaint(); + } + } + private void repaintAllLinks(){ + Iterator it = links.iterator(); + while(it.hasNext()){ + ((DLink)it.next()).repaint(); + } + } + //#########################################################################// + + + + private class DrawTableModel + extends AbstractTableModel + implements DMoteModelListener { + private Vector fields; + + public DrawTableModel(Vector fields) { + this.fields = fields; + } + //-----------------------------o + public String getColumnName(int col){ + switch(col) { + case 0: + return "X"; + case 1: + return "Y"; + default: + return (String)fields.elementAt(col - 2); + } + } + //-----------------------------o + public int getColumnCount() { return fields.size() + 2; } + //-----------------------------o + public int getRowCount() { + return DDocument.this.motes.size(); + } + //-----------------------------o + public Object getValueAt(int row, int col) { + DMoteModel model = (DMoteModel) DDocument.this.motes.get(row); + switch(col) { + case 0: + return "" + (int)model.getLocX(); + case 1: + return "" + (int)model.getLocY(); + default: + return("" + (int)model.getValue(col - 2)); + } + } + //-----------------------------o + public void shapeChanged(DMoteModel changed, int type){ + int row = findModel(changed); + if (row != -1) fireTableRowsUpdated(row, row); + } + //-----------------------------o + public void add(DMoteModel model){ + model.addListener(this); + int last = DDocument.this.motes.size()-1; + fireTableRowsInserted(last, last); + } + //-----------------------------o + public void remove(DMoteModel model){ + int row = findModel(model); + if (row != -1) fireTableRowsDeleted(row, row); + } + //-----------------------------o + public void updateTable(){ + fireTableDataChanged(); + } + //-----------------------------o + private int findModel(DMoteModel changed){ + for (int i=0; i= low && val <= high); + } + public void mousePressed(MouseEvent e) { + lastX = e.getX(); + lastY = e.getY(); + Iterator it = doc.motes.iterator(); + while (it.hasNext()) { + DMoteModel model = (DMoteModel)it.next(); + if (withinRange(e.getX(), + model.getLocX() - 20, + model.getLocX() + 20) && + withinRange(e.getY(), + model.getLocY() - 20, + model.getLocY() + 20)) { + selected = model; + return; + } + } + } + public void mouseReleased(MouseEvent e) { + if (doc.selected != null) { + doc.selected = null; + lastX = -1; + lastY = -1; + } + } + }); + addMouseMotionListener(new MouseMotionAdapter() { + public void mouseDragged(MouseEvent e) { + if (doc.selected != null) { + if (lastY == -1) { + lastY = e.getY(); + } + if (lastX == -1) { + lastX = e.getX(); + } + int x = e.getX(); + int y = e.getY(); + int dx = x-lastX; + int dy = y-lastY; + lastX = x; + lastY = y; + + selected.move(selected.getLocX() + dx, selected.getLocY() + dy); + } + doc.navigator.redrawAllLayers(); + } + }); + } + + public void paintComponent(Graphics g) { + super.paintComponent(g); + setOpaque(false); + //System.out.println("Painting panel!"); + doc.navigator.redrawAllLayers(); + } + } + + private class CanvasMouse extends MouseAdapter { + + } + protected class ValueSetEvent extends AWTEvent { + public static final int EVENT_ID = AWTEvent.RESERVED_ID_MAX + 1; + private String name; + private int value; + private int mote; + + public ValueSetEvent(Object target, int mote, String name, int value) { + super(target, EVENT_ID); + this.value = value; + this.name = name; + this.mote = mote; + } + + public String name() { + return name; + } + + public int value() { + return value; + } + + public int moteId() { + return mote; + } + } + + + protected class LinkSetEvent extends AWTEvent { + public static final int EVENT_ID = AWTEvent.RESERVED_ID_MAX + 2; + private String name; + private int value; + private int start; + private int end; + + public LinkSetEvent(Object target, String name, int value, int start, int end) { + super(target, EVENT_ID); + this.value = value; + this.name = name; + this.start = start; + this.end = end; + } + + public String name() { + return name; + } + + public int value() { + return value; + } + + public int start() { + return start; + } + + public int end() { + return end; + } + } +} diff --git a/support/sdk/java/net/tinyos/mviz/DLayer.java b/support/sdk/java/net/tinyos/mviz/DLayer.java new file mode 100644 index 00000000..d0941688 --- /dev/null +++ b/support/sdk/java/net/tinyos/mviz/DLayer.java @@ -0,0 +1,365 @@ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.tinyos.mviz; + +// DDocument.java + +import java.awt.*; + +import javax.imageio.ImageIO; +import javax.swing.*; + +import java.util.*; +import java.awt.event.*; +import java.io.*; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.border.LineBorder; +import javax.swing.table.*; + +import java.awt.image.*; + + +// Standard imports for XML +import javax.xml.parsers.*; +import org.xml.sax.*; +import org.w3c.dom.*; + + + + +public class DLayer extends JPanel implements ActionListener{ + + public static final int MOTE = 0; + public static final int LINK = 1; + public static final int FIELD = 2; + private static final Color[] COLORS = { + new Color(231, 220, 206), + new Color(250, 210, 99), + new Color(209, 230, 179) + }; + + private int type; + protected int index; + protected int zIndex; + protected int z_index = 0; + private ArrayList layer = new ArrayList(); + + private JLabel label; + private JCheckBox check; + private String[][] DISPLAYS = { {"circle", "img", "txt"}, {"line", "line+label", "label"}, {"color 256", "color 1024", "color 4096", "color 16384"}}; + private JComboBox displays; + + private ArrayList models; + private ArrayList linkModels; + private JButton up; + private JButton down; + + protected int paintMode = 0; + // Values chosen for COLOR so that readings can be right shifted + // that many bits to be in range 0-255 + static public final int COLOR_256 = 0; + static public final int OVAL = 1; + static public final int COLOR_1024 = 2; + static public final int IMG = 3; + static public final int COLOR_4096 = 4; + static public final int TXT_MOTE = 5; + static public final int COLOR_16384 = 6; + static public final int LINE = 7; + static public final int LABEL = 8; + static public final int LINE_LABEL = 9; + + protected DNavigate navigator; + + private String name; + private DDocument parent; + + public DLayer(int zIndex, int index, String label, int type, DDocument parent, ArrayList models, DNavigate navigator){ + this.parent = parent; + this.type = type; + this.models = models; + this.zIndex = zIndex; + this.index = index; + this.navigator = navigator; + this.name = label; + if (type == MOTE) { + this.paintMode = OVAL; + } + else if (type == LINK) { + this.paintMode = LINE; + } + + + SpringLayout layout = new SpringLayout(); + setLayout(layout); + setMaximumSize(new Dimension(350, 25)); + setPreferredSize(new Dimension(350, 25)); + setSize(new Dimension(350, 25)); + setDoubleBuffered(true); + setBackground(COLORS[type]); + setBorder(new LineBorder(new Color(155, 155, 155))); + + check = new JCheckBox(); + check.setSize(35, 25); + check.setMaximumSize(new Dimension(35, 25)); + check.setMinimumSize(new Dimension(35, 25)); + check.setPreferredSize(new Dimension(35, 25)); + + up = new JButton("^"); + up.setFont(new Font("Times", Font.PLAIN, 9)); + up.setSize(25, 25); + up.setMaximumSize(new Dimension(25, 25)); + up.setMinimumSize(new Dimension(25, 25)); + up.setPreferredSize(new Dimension(25, 25)); + up.setMargin(new Insets(2, 2, 2, 2)); + + down = new JButton("v"); + down.setFont(new Font("Times", Font.PLAIN, 8)); + down.setSize(25, 25); + down.setMaximumSize(new Dimension(25, 25)); + down.setMinimumSize(new Dimension(25, 25)); + down.setPreferredSize(new Dimension(25, 25)); + down.setMargin(new Insets(2, 2, 2, 2)); + + this.label = new JLabel(" " + label, JLabel.LEFT); + this.label.setSize(125, 25); + this.label.setMaximumSize(new Dimension(125, 25)); + this.label.setMinimumSize(new Dimension(125, 25)); + this.label.setPreferredSize(new Dimension(125, 25)); + switch (type) { + case MOTE: + this.label.setBackground(new Color(255, 200, 200)); + break; + case FIELD: + this.label.setBackground(new Color(200, 255, 200)); + break; + case LINK: + this.label.setBackground(new Color(200, 200, 255)); + break; + default: + // do nothing + } + + displays = new JComboBox(DISPLAYS[type]); + displays.setSize(100, 25); + //displays.setMaximumSize(new Dimension(125, 25)); + displays.setMinimumSize(new Dimension(125, 25)); + displays.setPreferredSize(new Dimension(125, 25)); + + + check.addActionListener(this); + up.addActionListener(this); + down.addActionListener(this); + displays.addActionListener(this); + + layout.putConstraint(SpringLayout.WEST, this, 0, SpringLayout.WEST, down); + layout.putConstraint(SpringLayout.EAST, check, 0, SpringLayout.WEST, down); + layout.putConstraint(SpringLayout.EAST, down, 0, SpringLayout.WEST, up); + layout.putConstraint(SpringLayout.EAST, up, 0, SpringLayout.WEST, this.label); + layout.putConstraint(SpringLayout.EAST, this.label, 0, SpringLayout.WEST, displays); + layout.putConstraint(SpringLayout.EAST, displays, 0, SpringLayout.EAST, this); + + + add(check); + add(down); + add(up); + add(this.label); + add(displays); + + + + } + + public boolean isFieldSelected(){ + return (type==FIELD && check.isSelected()); + } + + public void actionPerformed(ActionEvent e) { + if (e.getSource() == check) { + if (check.isSelected()){ + parent.selectedFieldIndex = index; + //repaintLayer(g); + //System.out.println("redraw index " +zIndex +" on layer"); + } else if(type==FIELD){ + //System.out.println("clear"); + //parent.canvas.repaint(); + //repaintLayer(g); + } else { + //repaintLayer(g); + } + } else if (e.getSource() == up){ + parent.navigator.moveLayerUp(this.zIndex); + } else if (e.getSource() == down){ + parent.navigator.moveLayerDown(this.zIndex); + } else if (e.getSource() == displays){ + String selected = (String)displays.getSelectedItem(); + if (selected.equals("circle")){ + paintMode = OVAL; + } else if (selected.equals("img")){ + paintMode = IMG; + } else if (selected.equals("txt")){ + paintMode = TXT_MOTE; + } else if (selected.equals("color 256")) { + paintMode = COLOR_256; + } else if (selected.equals("color 1024")) { + paintMode = COLOR_1024; + } else if (selected.equals("color 4096")) { + paintMode = COLOR_4096; + } else if (selected.equals("color 16384")) { + paintMode = COLOR_16384; + } else if (selected.equals("line")) { + paintMode = LINE; + } else if (selected.equals("label")) { + paintMode = LABEL; + } else if (selected.equals("line+label")) { + paintMode = LINE_LABEL; + } + } + //System.out.println("Repainting parent?"); + //parent.repaint(); + } + + public void init(){ + if (type==LINK){ + //addLinks(true); + } else { + addMotes(true); + } + } + + public String toString() { + return "Layer " + name + " " + type; + } + + + // private void addLinks(boolean paint){ + // Iterator it = models.iterator(); + // while(it.hasNext()){ + // DLink mm = (DLink) it.next(); + // //canvas.add(mm); + // if (paint) mm.repaint(); + // } + // } + + protected void addMote(DMoteModel model, boolean paint){ + DShape mote = new DMote(model, this.parent, this); + layer.add(mote); + } + + private void addMotes(boolean paint){ + Iterator it = models.iterator(); + while(it.hasNext()){ + addMote((DMoteModel) it.next(), paint); + } + } + + + public void updateIndex(int index, boolean repaint){ + zIndex = index; + z_index = (navigator.totalLayers - zIndex)*100; + //if (repaint) redrawLayer(); + //parent.canvas.setLayer(d.canvas, length - i); + } + + public void paintScreenBefore(Graphics g) + { + + Dimension d = parent.canvas.getSize(); + int x = 0; + int y = 0; + int xstep = (int)(d.width / 40); + int ystep = (int)(d.height / 40); + + for(;x < d.width; x += xstep){ + for(y = 0;y < d.height; y += ystep){ + double val = 0; + double sum = 0; + double total = 0; + double min = 10000000; + Iterator it = models.iterator(); + while(it.hasNext()){ + DMoteModel m = (DMoteModel) it.next(); + double dist = distance(x, y, m.x, m.y); + if(true){ //121 + if(dist < min) min = dist; + val += ((double)(((int)m.getValue(index)) >> paintMode )) / dist /dist; + sum += (1/dist/dist); + } + } + int reading = (int)(val / sum); + //System.out.println("Reading: " + reading); + if (reading > 255) + reading = 255; + g.setColor(new Color(reading, reading, reading)); + //System.out.println("Filling " + x + "+" + step + " " + y + "+" + step + " with " + g.getColor()); + g.fillRect(x, y, xstep, ystep); + } + } + + + } + + public double distance(int x, int y, int x1, int y1){ + return Math.sqrt( (x-x1)*(x-x1)+(y-y1)*(y-y1)); + } + + protected void repaintLayer(Graphics g){ + if (check.isSelected()){ + //System.out.println("Repaint layer " + name); + if (type==FIELD){ + paintScreenBefore(g); + } else if (type == LINK) { + Iterator it = models.iterator(); + //System.out.print("Draw links: "); + while (it.hasNext()) { + DLinkModel model = (DLinkModel)it.next(); + DLink lnk = new DLink(model, parent, this); + lnk.paintShape(g); + //System.out.print("+"); + } + //System.out.println(); + } + else if (type == MOTE) { + Iterator it = models.iterator(); + //System.out.print("Draw motes: "); + while (it.hasNext()){ + DMoteModel model = (DMoteModel)it.next(); + DShape m = new DMote(model, parent, this); + m.paintShape(g); + //System.out.print("+"); + } + //System.out.println(); + } + } + } +} diff --git a/support/sdk/java/net/tinyos/mviz/DLink.java b/support/sdk/java/net/tinyos/mviz/DLink.java new file mode 100644 index 00000000..725d19b0 --- /dev/null +++ b/support/sdk/java/net/tinyos/mviz/DLink.java @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.tinyos.mviz; + +// DShape.java +import java.awt.*; +import java.util.*; +import javax.swing.*; +import java.awt.event.*; +import java.awt.geom.Line2D; + +public class DLink +extends JComponent +implements DLinkModelListener +{ + + protected DLinkModel model; + protected DDocument document; + private DLayer layer; + // remember the last point for mouse tracking + private int lastX, lastY; + + // Move or Resize ? + private int action; + private static final int MOVE = 0; + //=========================================================================// + public DLink(DLinkModel model, DDocument document, DLayer layer) { + super(); + this.model = model; + this.layer = layer; + this.document = document; + model.addListener(this); + + // Mouse listeners. + addMouseListener( + new MouseAdapter() + { + public void mousePressed(MouseEvent e) { + selected(); + lastX = e.getX()+getX(); + lastY = e.getY()+getY(); + + if (e.isControlDown()){ + }else if(e.isAltDown()){ + }else if(e.isShiftDown()){ + }else{ DetermineAction(lastX, lastY); } + } + } + ); + + addMouseMotionListener( + new MouseMotionAdapter() + { + public void mouseDragged(MouseEvent e) { + + int x = e.getX()+getX(); + int y = e.getY()+getY(); + // compute delta from last point + int dx = x-lastX; + int dy = y-lastY; + lastX = x; + lastY = y; + + switch(action){ + case MOVE: DoAction(dx, dy); break; + } + } + } + ); + + synchToModel(); + } + + //=========================================================================// + public DLinkModel getModel() { + return(model); + } + + //=========================================================================// + public void shapeChanged(DLinkModel changed, int type) { + synchToModel(); + repaint(); + } + //=========================================================================// + public void paintShape(Graphics g){ + Graphics2D g2 = (Graphics2D) g; + g.setColor(Color.BLACK); + int diffX = (model.m1.getLocX() - model.m2.getLocX()); + int diffY = (model.m1.getLocY() - model.m2.getLocY()); + if (diffX == 0 && diffY == 0) { + return; + } + if (diffX == 0) {diffX = 1;} + if (diffY == 0) {diffY = 1;} + int midX = (model.m1.getLocX() + model.m2.getLocX()) / 2; + int midY = (model.m1.getLocY() + model.m2.getLocY()) / 2; + midY += 8; + midX += 10; + //midX += Math.abs(((double)diffX / ((double)Math.abs(diffY) + (double)Math.abs(diffX))) * 60); + if (diffX * diffY < 0) { + midY += Math.abs(((double)diffX / ((double)Math.abs(diffY) + (double)Math.abs(diffX))) * 10); + midX += Math.abs(((double)diffX / ((double)Math.abs(diffY) + (double)Math.abs(diffX))) * 10); + } + else { + midY -= Math.abs(((double)diffX / ((double)Math.abs(diffY) + (double)Math.abs(diffX))) * 10); + midX += Math.abs((double)diffX / ((double)Math.abs(diffY) + (double)Math.abs(diffX)) * 10); + } + switch(layer.paintMode) { + case DLayer.LINE_LABEL: + g.setColor(Color.BLACK); + g2.drawString(document.sensed_links.elementAt(layer.index) + ": " + (int)model.getValue(layer.index), midX, midY); + case DLayer.LINE: + g2.setStroke(new BasicStroke(3)); + g2.setColor(Color.RED); + g2.draw(new Line2D.Double(model.m1.getLocX(), model.m1.getLocY(), model.m2.getLocX(), model.m2.getLocY())); + break; + case DLayer.LABEL: + g.setColor(Color.BLACK); + g2.drawString(document.sensed_links.elementAt(layer.index) + ": " + (int)model.getValue(layer.index), midX, midY); + break; + } + } + //=========================================================================// + public void paintComponent(Graphics g) { + } + //=========================================================================// + private void DetermineAction(int x, int y){ + action = MOVE; + } + //=========================================================================// + private void DoAction(int dx, int dy){ + } + //=========================================================================// + private void synchToModel(){ + setBounds(model.getTop(), model.getLeft(), model.getWidth(), model.getHeight()); + } + //=========================================================================// + private void selected(){ + } + +} + + + diff --git a/support/sdk/java/net/tinyos/mviz/DLinkModel.java b/support/sdk/java/net/tinyos/mviz/DLinkModel.java new file mode 100644 index 00000000..560d78a3 --- /dev/null +++ b/support/sdk/java/net/tinyos/mviz/DLinkModel.java @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.tinyos.mviz; + +// DShapeModel.java +/* + Store the data state for a single shape: + type, two points, color + Supports DShapeModelListeners. +*/ +import java.awt.*; + +import javax.swing.*; +import java.util.*; +import java.awt.event.*; +import java.io.*; + + +class DLinkModel +extends Object +implements Serializable { + + public static final int VALUE = 0; + public static final int MOTION = 1; + public static final int ANY = 1; + + + public DDocument root; + transient private ArrayList listeners; + + protected int x12, y12; + protected int[] values; + + DMoteModel m1; + DMoteModel m2; + + protected int COLOR_MAX = 230; + + public DLinkModel(DMoteModel m1, DMoteModel m2, Random rand, DDocument root){ + this.root = root; + this.m1 = m1; + this.m2 = m2; + + x12 = getMiddle(m1.x, m2.x); + y12 = getMiddle(m1.y, m2.y); + + values = new int[root.sensed_links.size()]; + + for (int i=0; i=0; i--){ + DLayer a = (DLayer)layers.get(i); + a.repaintLayer(g); + } + parent.canvas.getGraphics().drawImage(offscreen, 0, 0, this); + } + + public void update(Graphics g) { + paint(g); + } + +} diff --git a/support/sdk/java/net/tinyos/mviz/DShape.java b/support/sdk/java/net/tinyos/mviz/DShape.java new file mode 100644 index 00000000..a4222afe --- /dev/null +++ b/support/sdk/java/net/tinyos/mviz/DShape.java @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.tinyos.mviz; + + +// DShape.java +import java.awt.*; +import java.util.*; +import javax.swing.*; +import java.awt.event.*; + +abstract class DShape +extends JComponent +implements DMoteModelListener +{ + + protected DMoteModel model; + protected DDocument document; + public Image img; + + + + // remember the last point for mouse tracking + private int lastX, lastY; + protected DLayer layer; + + // Move or Resize ? + private int action; + private static final int MOVE = 0; + //=========================================================================// + public DShape(DMoteModel model, DDocument document, DLayer layer) { + super(); + this.model = model; + this.img = document.image; + this.document = document; + this.layer = layer; + model.addListener(this); + + addMouseMotionListener( + new MouseMotionAdapter() + { + public void mouseDragged(MouseEvent e) { + + int x = e.getX()+getX(); + int y = e.getY()+getY(); + // compute delta from last point + int dx = x-lastX; + int dy = y-lastY; + lastX = x; + lastY = y; + + switch(action){ + case MOVE: DoAction(dx, dy); break; + } + } + } + ); + + synchToModel(); + } + + //=========================================================================// + public DMoteModel getModel() { + return(model); + } + + //=========================================================================// + public void shapeChanged(DMoteModel changed, int type) { + synchToModel(); + repaint(); + } + //=========================================================================// + public abstract void paintShape(Graphics g); + //=========================================================================// + public void paintComponent(Graphics g) { + } + //=========================================================================// + private void DetermineAction(int x, int y){ + action = MOVE; + } + //=========================================================================// + private void DoAction(int dx, int dy){ + model.applyDeltas(dx, dy); + } + //=========================================================================// + private void synchToModel(){ + int x=0, y=0, w=0, h=0; + switch(layer.paintMode){ + case DLayer.IMG: + x = model.getLocX(); + y = model.getLocY(); + //w = model.getWidth(layer.index); + //h = model.getHeight(layer.index); + w = 250; + h = 250; + break; + case DLayer.OVAL: + x = model.getLocX(); + y= model.getLocY(); + w = 10; + h = 10; + break; + case DLayer.TXT_MOTE: + x = model.getLocX(); + y= model.getLocY(); + w = 250; + h = 250; + break; + } + //setLocation(x, y); + setBounds(0, 0, 0, 0); + } + //=========================================================================// + private void selected(){ + document.setSelected(this); + } + +} + + + diff --git a/support/sdk/java/net/tinyos/mviz/DShapeModel.java b/support/sdk/java/net/tinyos/mviz/DShapeModel.java new file mode 100644 index 00000000..37e548fe --- /dev/null +++ b/support/sdk/java/net/tinyos/mviz/DShapeModel.java @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.tinyos.mviz; + + +// DShapeModel.java +/* + Store the data state for a single shape: + type, two points, color + Supports DShapeModelListeners. +*/ +import java.awt.*; + +import javax.swing.*; +import java.util.*; +import java.awt.event.*; +import java.io.*; + + +class DShapeModel extends Object implements Serializable { + + // The 5 standard things for a DShapeModel to store + protected char type; + protected int x1, y1, x; + protected int x2, y2, y; + protected Color fill; + + protected float value; + + protected int HALF_WIDTH = 20; + protected int HALF_HEIGHT = 20; + + // NOTE: "transient" -- not serialized + transient private ArrayList listeners; + + public DShapeModel(char type, int x, int y, float value) { + this.type = type; + this.x = x; + this.y = y; + this.value = value; + int color = (int)(value)%230; + this.fill = new Color(color+15, color, color+25); + + listeners = null; + + this.x1 = x - this.HALF_WIDTH; + this.x2 = x + this.HALF_WIDTH; + this.y1 = y - this.HALF_HEIGHT; + this.y2 = y + this.HALF_HEIGHT; + } + + // Construct a DShapeModel with default size. + public DShapeModel(char type, Color color) { + this(type, 50, 50, 89, 89, color); + } + + public DShapeModel(){ + this('m', new Color(12,24,48)); + } + + public DShapeModel(char type, int x1, int y1, int x2, int y2, Color fill) { + this.type = type; + this.x1 = x1; + this.y1 = y1; + this.x2 = x2; + this.y2 = y2; + this.fill = fill; + + listeners = null; + } + + public DShapeModel(DShapeModel other) { + this.type = other.type; + this.x1 = other.x1; + this.y1 = other.y1; + this.x2 = other.x2; + this.y2 = other.y2; + this.fill = other.fill; + + listeners = null; + } + + public char getType() { return(type); } + + public int getX1() { return(x1); } + public int getY1() { return(y1); } + public int getX2() { return(x2); } + public int getY2() { return(y2); } + + + // Below here, code not done + + + public void applyDeltas(int dx1, int dy1, int dx2, int dy2) { + x1 += dx1; + x2 += dx2; + y1 += dy1; + y2 += dy2; + + x += dx1; + y += dy1; + fireChanges(); + } + + public int getWidth() { + return Math.abs(x2-x1)+1; + } + + public int getHeight() { + return Math.abs(y2-y1)+1; + } + + public int getLocX() { + return Math.min(x1, x2); + } + + public int getLocY() { + return Math.min(y1, y2); + } + + + + public Color getColor() { return(fill); } + public void setColor(Color color) { + if (fill.equals(color)) return; + fill = color; + fireChanges(); + } + + + public void addListener(DShapeModelListener listener) { + if (listeners == null) listeners = new ArrayList(); + Iterator it = listeners.iterator(); + while (it.hasNext()) { + if (it.next() == listener) + return; + } + listeners.add(listener); + } + + public void removeListener(DShapeModelListener listener) { + if (listeners == null) return; + Iterator it = listeners.iterator(); + while (it.hasNext()) { + if (it.next() == listener){ + it.remove(); + return; + } + } + } + //=========================================================================/ + protected void fireChanges(){ + if (listeners==null) return; + Iterator it = listeners.iterator(); + while (it.hasNext()) + ((DShapeModelListener)(it.next())).shapeChanged(this); + } + //=========================================================================/ + public void rotate(){ + // Get old height/width and locations. + int x = getLocX(); int y = getLocY(); + int w = getWidth(); int h = getHeight(); + int dL = (h/2-w/2); + // Get the locations right. + x-=dL; y+= dL; + x1=x; x2=x+h-1; + y1=y; y2=y+w-1; + fireChanges(); + } + //=========================================================================/ + // Rotation with respect to center. + public void scale(int magnitude){ + if (x1"); + links.add(name); + } +} diff --git a/support/sdk/java/net/tinyos/mviz/Makefile b/support/sdk/java/net/tinyos/mviz/Makefile new file mode 100644 index 00000000..7ea734fb --- /dev/null +++ b/support/sdk/java/net/tinyos/mviz/Makefile @@ -0,0 +1,6 @@ +# Top-level Makefile for tools/java + +SUBDIRS = +ROOT = ../../.. +include $(ROOT)/Makefile.include + diff --git a/support/sdk/java/net/tinyos/mviz/MessageInput.java b/support/sdk/java/net/tinyos/mviz/MessageInput.java new file mode 100644 index 00000000..26d1e463 --- /dev/null +++ b/support/sdk/java/net/tinyos/mviz/MessageInput.java @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.tinyos.mviz; + +import java.lang.reflect.*; +import java.io.*; +import java.util.*; + +import net.tinyos.message.*; +import net.tinyos.packet.*; +import net.tinyos.util.*; + + +public class MessageInput implements net.tinyos.message.MessageListener { + private Vector msgVector = new Vector(); + private MoteIF moteIF; + private DDocument document; + + public MessageInput(Vector packetVector, String commSource, DDocument doc) { + document = doc; + loadMessages(packetVector); + createSource(commSource); + installListeners(); + } + + private void loadMessages(Vector packetVector) { + for (int i = 0; i < packetVector.size(); i++) { + String className = (String)packetVector.elementAt(i); + try { + Class c = Class.forName(className); + Object packet = c.newInstance(); + Message msg = (Message)packet; + msgVector.addElement(msg); + } + catch (Exception e) { + System.err.println(e); + } + } + } + + private void createSource(String source) { + if (source != null) { + moteIF = new MoteIF(BuildSource.makePhoenix(source, PrintStreamMessenger.err)); + } + else { + moteIF = new MoteIF(BuildSource.makePhoenix(PrintStreamMessenger.err)); + } + } + + private void addMsgType(Message msg) { + moteIF.registerListener(msg, this); + } + + private void installListeners() { + Enumeration msgs = msgVector.elements(); + while (msgs.hasMoreElements()) { + Message m = (Message)msgs.nextElement(); + this.addMsgType(m); + } + } + + public void start() {} + + public void messageReceived(int to, Message message) { + Hashtable table = new Hashtable(); + Hashtable linkTable = new Hashtable(); + //System.out.println("Received message:"); + //System.out.println(message); + + Class pktClass = message.getClass(); + Method[] methods = pktClass.getMethods(); + for (int i = 0; i < methods.length; i++) { + Method method = methods[i]; + String name = method.getName(); + Class[] params = method.getParameterTypes(); + Class returnType = method.getReturnType(); + if (params.length != 0 || returnType.isArray()) { + continue; + } + if (name.startsWith("get_") && !name.startsWith("get_link")) { + name = name.substring(4); // Chop off "get_" + try { + //System.out.println(name + " returns " + res); + Integer result = (Integer)method.invoke(message, null); + table.put(name, result); + } + catch (java.lang.IllegalAccessException exc) { + System.err.println("Unable to access field " + name); + } + catch (java.lang.reflect.InvocationTargetException exc) { + System.err.println("Unable to access target " + name); + } + } + else if (name.startsWith("get_link_")) { + name = name.substring(9); // chop off "get_link_" + try { + Integer result = (Integer)method.invoke(message, null); + linkTable.put(name, result); + } + catch (java.lang.IllegalAccessException exc) { + System.err.println("Unable to access field " + name); + } + catch (java.lang.reflect.InvocationTargetException exc) { + System.err.println("Unable to access target " + name); + } + } + } + if (table.containsKey("origin")) { + Integer origin = (Integer)table.get("origin"); + //table.remove("origin"); + Enumeration elements = table.keys(); + while (elements.hasMoreElements()) { + String key = (String)elements.nextElement(); + Integer value = (Integer)table.get(key); + document.setMoteValue(origin.intValue(), key, value.intValue()); + } + elements = linkTable.keys(); + while (elements.hasMoreElements()) { + String key = (String)elements.nextElement(); + if (!key.endsWith("_value")) { + continue; + } + Integer value = (Integer)linkTable.get(key); + key = key.substring(0, key.length() - 6); // chop off "_value" + String addrkey = key + "_addr"; + if (!linkTable.containsKey(addrkey)) { + continue; + } + Integer addr = (Integer)linkTable.get(addrkey); + document.setLinkValue(origin.intValue(), addr.intValue(), key, value.intValue()); + } + } + else { + System.err.println("Could not find origin field, discarding message."); + } + + } + +} diff --git a/support/sdk/java/net/tinyos/mviz/images/tmote_sky.gif b/support/sdk/java/net/tinyos/mviz/images/tmote_sky.gif new file mode 100644 index 0000000000000000000000000000000000000000..f3bd1929317a764f1bda69104c2ec5bc6708cc6c GIT binary patch literal 4262 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 z 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�>Ly=u9NkjVU<|I8K|CDv+15Ac@H$JR?(r&Zv{%j>(-suKmx{3& zF3X+Y7ezF_(NiiSl{p?AT9Y4>p#-W$9VNFGR6sh5%N4=vuXAe?uC`fh%ByYBH&X{u zy>77Po@#a);)Jf}J2NO#YpO@z2~1CHen#klNB)?uBJkolZD0N=*;Vaq++@6=@~H`t z;Hm6aar}eEeZ<+G9yhB*{yMuJdtkP1(?=f8-2>QCz96jzZuu_s-XFV1F)pJT=d_2Z)COw#SHzI!11~k)7 z=wQdv>+dm9I^7|H#E8SYgA*Y`g1BNerdUJM31fw-C8WYvg!@Vemp%;8){tR}#Q4uw z0R6LR?q71qLtT`AyDV>CUk=f1Q>bX+=i&5}yAqa@q(Q`Cc9qonh<1ZeQ*08k?s`mL) z<8;0Z>Xkt2KN(k)r^7DxHIkrMvNqtX*HBKUadcX%%%N|WZEiDr^+|CE5VGFFiZu(J z_XrHSH-*IO4@u9~5%4>Bm5UF8ph2P(ho{)<9#{4vOKRh;P|?!QwGd6DBgN#n{sYUH zurwqJ-nVk$fy14({R!1`9bW3f#}sB(d%+);ZT#kUD3L9^Fk`3Um~(Q!G&f+KAdkM?6uHebz>!tw(n0CC7&Qv&gjhB-%@~*u&xz3( zc1dj?HhvIymJAUtEH&a^bL#v47Yu7DpOQ<`RI}ESj(}x*5}h@M@Huc5Y&R;|_C}M_?^{V~_W6{%0Ltus7JS05xsKK67Mbc6B;S*^^%sqy}B*RB_&!p|iDF2S;j*pkgG0D9ah$S|*{1yPN4Xv58jjbDARmn3iRV zuAie9TE;L=20ivsZfx|@Q#W#6DZbb|2V&WQByUg5hDmWKnp{iWuBB+ z0W6~pQ#wD%rw@u4j{WEw^=P!Xo;6co83=w9EI77QlU>;W&d=$xe}o}1syNjaN548h z)G+*ac@qDX@eG>7oV_C(_z?3&h`a;mX48313GGdli8R_Wl{MToWm01sPB+ebAR0HW z)gT|xfHJI$NP};L^gq3lgMW)zjDL%KeRBO;Q1^8+B1|WWNqG##D89Xwq#z5DNl4uT zI3WEsA3EGZ_XJ+d+dqJDt^MTE>fQ)dV)gj;`tr2csteG|W56dLsM zPQdfr5K{l~X8V^&VJ=2ylr)IPkv1d!g*FbZb=?uL)3uy;r?fgf)ZCJVu$=Sf{#h)F zuWr^OP|Yy?iSx$c8sv+CsAd!@1ZItwnd9Nb>3rJy5;Whc2=S_Pq|%&xezZx;D`YMS zd7nNGQ%yGLMjK|oPFqEws;TWs*r@CQK2<`qXJ?@3qmSdVNK>ghAucRE9<%!b*neu(YMxbxQ&}zC>r}7PD^POoje85muZibHjvZKUyX28@Iloh zmYzyrFwa_BMgBSKL+kMSle|o!!WN^E@sEzXMBAAyLj9aTZo?Jhx1@Q8KmukIYYl_f zER&KPqY`;H1a)$U_U7J2XW=~H=dRw@Z`e{CSdp}w$ota3`y_Pnu=03c|H&u(^3ere z!RZRHrCVPuyWoi2fZR~=)AA@c3f(Bk{xN>v$p9Ez*8;ZAUHeHJBCW0Ab0Kaal;2N! znx~6VzNLSoY~U5OhPauv1Tityjb=bcMr+)ie95*JXpN);Wx_Kc*53UQ}vkn5&RejbG;&XFchu~~!i@7>Z)MznFqB^-j5Z-Tz-!x$V( zsl810b}!I1T;C^weLthBT0{Lem|6gDE3$VIVIDY|c}2{=)J(HIqYz{lcEafPHXTas z#2U@;`Xp88edq?0o4%+L$d9#Z#M2--cyb*V#S61=do_t-rtf{=lIx)#u;av#eUNFB zD7iMyv|qds=SJb}SfbIgC%lyski)t*)_cP<<4I{rUsUlo?MDK2s2&fXHJ;3%^8me_ zT``ydJLYSJ+Y#To5&Xi|6+fuWQ9dMSzq9=em=*|q-LrDe8DR==@;!vOI$!Pqjj0*s zD$N9Ha+pUdW9f@*@0$`}RU`%vZRry?M8?2F9cEn+FUOT#yxqfi zs6NFtfvmd@krKC}%tQm~0+Fj>y#v^|R5jKKAtr(Hc_g z7!`|WVQdRFrcLkn+LR^gS-1;<;0{VXGR--$$lN^bq&p(f52$g5ho?%6ty~zTe#xi^ zoivqTE%m;I3h`)W(v)12SdqbcD)9if&Z&>p*Ez3M#uCUY zp-K0NJtn1dJ6yF`^Qz)A7Uhw)oex#3YZ6Y#QFv&CFo+}`0}~lxfMdnoajxchuxwyv zb~(4SHlBtuz!T{|0^V}uI@U%(fbu}%|Gdg|1{EtFjPF$ zEPF~HPT|{|$eFjHsc=#V1Uao7Z9r~Yl)wi(7KB)Q=i)0Xx|y4g{ZqO5hleK@1{8lZ zyJ1A*e(s_vgU2YcqeyltjK33+oP8AWK2`a>Hor<)C`cuzi77HdEZIT%zGJRC%2mLh~|*zowuF%#jpVNK2``mxE$Jk@l*lSH& zb3XH#!UrMa>0VV|Tg73kxFX@4(;&LXLhlf(kDTyNK5nJ&=xUTF3{kQ%iIq?Wv9l1i zX|3F5h$MY?QF~Xc8Y@-4Rq#?#i6+8odzN0YPMqUj@0iV}LP+~(wew|Xtg1wO`LO3| zAmZmaE2pV(Xd$awO97W-x#KyYcM454-%)Lh8A#g^<6fK%9FZ!}WKt+nR=^JR?5531 zTEVE1vc+%8$J;F_rhcxM&GfB;Lheuz3#4nVKqWA;T1QBbwS7)g#N<`A-&fI5AXYoc zZ<4<2pR{5hH>d|xI^dq0mpG?336jK9aKc5eT5kqY{02yh53sNwJ5JKo9d~me++n7; zP_NM_`N#PC47x-d-Bv|cYh8)i#@G8YbDd1by%8onT*rUM6qrkOHd4^71GNqR0 zK~4QL2bz)AnY=BZn;%FWW`4+T94_4LPZ-iXwebSf&GZu}OmY0?I%KO*c zx9)r#1+RIT@e%H+it`l(-!t6ik)#phlPVUt<*1L^lAc=l(djnf--ro?X1NWuky>Y& z9IM9Ue_|S)X34;=|B~BK)FKqhQP|QH=2%PzZ=hqWMUq$IuMsO!r`uxA|iIvvnNxKprA&+hUFw zjxS%IPSdx|F!9H-Kf$GNiRhv^;L)VuuxJAvy9eaV84fwWBiSZNz9|0oP@4F%?f7Wa zQ8~U-)ySNUgh#)RHC4jDYuFa3%GwFSDZX?SS8YG_wtpUdDAP za`O0u@W#sD_F5lr24(5jPQO<$P<${uVVJ>AABZJImTW$j+?(cHAb{awBr1hX72y+^ zlAzJK0j__ttk=bqA3jlXG87o0v|C>3#3Ii*-d>vq3eZYLRid*WF`6uz^zCvgP-@s* zj9{SO{Ru6{l`|=Cek|LCi&yC7IW_8zxU0C1$561n+$0$O%Ei$$;-@`*)`YM3X}eo& zdVo+-x7V7nR!F1&T#em}L~(*12j8-dhEQ=>P;AMi%n2VSo2u+$_R_Lg6JoGDz2#7* z4At_nLk~k;!SBN$k$B;H*!Q^a>EAa?_`e87|Jz*Q@9;wihX1XfUfHNP*J-#bqPZbm zrd-)@R^tTSug*W8zsRJZm$iFOG2@}Ec}3*IKiGco2ok2!THj}|32h1kNrx6_LL|Ky4Lb0vae5tJO!uaW?!w5@{T?U|Y-$obm#y7N!DHTDyua2$U{N7;xHqdV&p z1@ZjK#24+K()g@_>+&&@CRf@y_Pw!Hn-OL#+poAtIlnccGrj@qe3*kdE%ZOhtxKnz z{S6>kKga;y>Nas2(R}Wd(aU6Py+o*A+9S3^rAM0L$E<-B1z@GY6x|HN z<6B;0&j+&B%E@115q*G@XRwX4(}-yL>j@9fK{JCAl&)m%0*AwN_T!?D?d@VkHcgT; zlOIU)@Knw(api0`dHRkN;{Iu^9;>f$wtmDr-|d3C3HE~#W(!CoiQV@KbpC3(Ml1vMlA2(gz73@cl|OZB=6?_}7%{^(>LV*3enSm0Yw8K4g@wcL zwyH*n+wh8Ph=&TdReSGuxjc3ZV4PE1?i{oy&iOs`tuB#d;hXET&z^sX8jz9xIoY;< zs+B~keCsZkXX8Oa+)p}?XS=d&EQGdSbvlH_ujron=`Ez-ZT+|f;a9l>ewGKeyPh8g zny!S<1ilqGIZi5Cy8EQhac*XR*Z30427KZe2IP6lG8> zwNRNPx~>Xe7=7?S4>^*D$-}5G)iF%o$w|3PeylKioORfOd5u7L8ALXBRP;6(6N5QR zr{xW;0lb4}FmsL|^M{5pj$}X6to-RN>TWI` zV$d6O2Fp>ng0Il(h|EIqHBO^@h+yJdDxx;1C}q$&cd^in9rz#%QvS1-H{PSkW} zx7>J#h;YP6fnf%^9c=MLy^f#vzIAma!2N~Wuz8?yYA{_kEiUSkO}t^7RjbzN<|abz zpqQP+1pA(GzbcH}0Vi}jO4E0VDBhlMCVct$c0{nLx7!f6q)`&KCv+Ale}=~3Hs@(x zBKkR=6+2$TM!tb(Q;!oyl`;!%4#tx5j3LZ&1n#? zL7gOyXHUyMd%DD{0_O}Oe!^6aW~Dd9`F^HA$g)I3w!X*-1x}x?baqFKFq|xcJ8E;K z%11@t8l=;7afX|lUkzwa9JH5g$tjqbxbNwuPVvZN73WqLPLH6c4O%YXrJju%YFt;d zdz>LBPc>wO)ByUE03nag+n%agqW8V1KYpG3O7jjVx+9Q(8xCDU%XihB5+^vP8A)`m zlkjr9pB*uQwAVL(JGa_^8bSdR!QL*w8l-Gq)$E2I{JH7#p#&(HwkH<>U z{0!$Unu(%3l2Q!vC-yoEPNhfF766`#2b}F;F>&WVq6yJu9Q1N!0n;|zcAl3xKwLatN z56QvH08bJbH#f&kTWuh%zxPJJgkB1RZ`=1rd&DOxVg-@kDyAzQU_P)oyi2>;;IRPO zhYX$9WE-Y1oX{js4HdO{*Y>vYJzc>^hn|Ymy%KJ`9QsMEae}++rx&4}2A*=Dw>74J z?-`_-*Ez*N&%M7u_|EXeeL!Q}s%~;mr6ra~kg`NV*clD+bTyyglYKpv%k}w+{&5YD zf$?yco{M7Ga5YmWwc$kT8X6ko*yugv*aPOK?>IwPdX-Xc_pI{1mLV)r_abAbnx^h> zGY^<o?LJz6;wuN zBp&$LXFO=y;Ft$=2ip095o;9($n52-`1#Cwb$-bu`9;sow^&Udz1D|^$5S0*4;kLp zR*c)5M(1UK$ z&=aYjLG;aOIr14~U)VQ>{G-<@Y4cokgf6fDavh&hYi6Ci_2}5=2 z2*D)dpsR5FHLqOZ^9=E6+0pQn0ov+tQje08G_vzBjxUPnVRP!i<2Bua2abuP5UBTH z&z%z?e1k1mXFOg%y$o2-}884&)y$9Z`vYMiqo7wb$ z!YorQ*5!U3$fcgRzqRJ1!;bHMTpV2n<~bz z?}~BAnyf3Xq9}?92dI9d>_&(c!7Kmv%BNEDy=Xy=R?(20(tzco?Z$6`@>F=r@*EGb z!bK)F$5<8`D#N<+`K3)f;-^aE*$&5<^--1sKl6(s$r&qEmQD*5D5t7qGdl+cy#dVE}H&8^F5`T2T4%{fUOmdGD?KdbL9R@}8?M_CD0J2}u zvqIhSnaVA`WPz<)$M;#AX6)K>e&|L4qrY_3rM#Z>aEc7(2pv8$mcG{gg2U&4Vtdq$ zbyiTa-LwAgLVRi6y?2mt+4^=oQJ)HLB<@a0Q9{OpW2p>LeQ(r7E5hIT$skGOK1|4zw9gqm6w{(k{1LK%d`tnrCfhaR?q!Co>B;P;6gpDuz0O%!{ zdO9}Y-J9&*b3w>WCufEP3sQn6Qh!d{lW2xANr4;fz=oq?P;k#+#Pjy%tRNs<0mJ-k2~6KdmE!@MTy&p>~VfpxuHR6&eb0|a9181 z$eD8GGw3ZApR+0H{8lku#>OurHZXqJLP7#dkOG|o!1IZ?R?~^st4->75z}x!AXRrY zoNelIDl!)5(f2N~dso}*^@jGxGc!41+6LIsNCHkY)S8+pH^WYRhPFYE5=P2OP0Ow0YeO zcvpx5u&Mou&xGIysi$ihGibdG#!GS|To}7VZHkX+ZVgEyAt6GXLS&lOe zh!32%d$$uWaT&nd5*QCwgDf60F>JT+vv3dv8`>$nj^(f$LKHHUYUPg9A8^j=^)|JZ zg|13fSJwfNc872y!S&67eeVNBN!v zR{?Jw9PP2%DGr!7nsxnGLE;}NG5lYIK*$T;?3n}$(54!-qJdkR=sFBN2*}V0O0M5O zL%(Hl;nsd!R8+8+C)=||dvxBXrx?EL=*h(rzDR>di9sjYl*AYlpEmVwo*?OzjG$um z;hWDDznT$9%UqFF3h+EZCAz7Sg+0WFLqik-Dhh^w!~W4$-FO>2+f z>~+Ac&Uq?>ymN{KZPr3|uOGnp_6U|Vr-?o;#HW9Q7EvaWM|TQYVdxo4@Eyc4sZSn1 z8l=PyNNPg7_XTHXv$=R|E3<+eq?~{w#(S-JM-;T?L8M92pHjvMuV>}F7kVIgu?H;-41g#;_BSup z)fsYjoDlfbNLq&5S?#&WtrbIHv&;aLsD0wzXGAgp^uQ*MiiuX7Q05)Gmu{NfBVPj$ zYKFgepQ0hfEKqSKFqay34k*Jrvfk5NG*@)WKv<-Wogi2wY6@ z&E6XsJ{1z17{DuYDO0|Fnc7{{;;MaXkH@AV}W$q3nINBKQDlCbc=HCk#QwuMC@zFPi&<1MX zKtzS|$^J9*!lb@QHo5s1qOBD*DCgJjXhb?I|7QI|`u{%wyr##4)X|X4Nw8!67nwES zCu)v&&bkiJ=FFWHpuF21@041(R9>>&l`e|B0td^fwWYZymH)+HV&SI%;L#_=Hlo)0 z&y^e8Iy=xtfj&dzj}{yUBl)9340}`?AL>gsU4QS7!S7Q}d*lnrwhq4BJ(5(Q(>-&X zR$^zxK;jG;dXNAwc(?ERRY8^A#nUQw4)j~BdUXk^ZDslFeC{Ygg=x3&X;YlrIm{~C zjH+;esNJx5(zy|Rse7r}7+!?$L+RSsZWQ&U$K+u79P5NYI*%Xfo*O}WL*kRSrD)-2k3~wca}!ST zTzi!D3Fzsua@C7ppi~cm>eYwnurbsWalj&zx9t!0nbBgLJDhc-aqy)AEYtygV0LJ; zzq3wQF|bel1uXL{aU=2Ziv(y*dYM2}SOFU}2b+AYl0B$&^257Q)s<(?2XR=1Xjh>d zkKUPJPH{|FbOmw00f~Z(q+Yo2ji7IbNAx}8u&#^iCStG4*@5-D!&!l(TWmMIl#(|V z13dKPkr3H)ehKDKPsAR|l;zKJy%9J0MAA z_Au?zN@T*f$g5Zt3Vi7X+>kF8BO=2im?;rEv2Gwqt}lW+(1f%1;d{{5Hy#4X*1_n6Ju&KjfatOM;%bbc}z%x-VPuwW&Y z7`)+?2Sl>s6MLb%xZyN%XWc4XheI2w5O3djr87I$$apG$DvzB`b2a9DSrJCu<(7?) z!#+M5R9kfl*0wJs9zDT(6|uW%?eLlCbkHn>Q7>1L(uTD(FcozUn51APsTG$$X<=2! z8#|`bl=HbheE?e)AQ{ZQ9bot`ulW4`!r@<7rPG@E!g!HvQ-DIx)9qImrWQ{q52# z+Y6BtzFM)RuUFdneu8uVcH zA*?{KqJc4TW?6c+dt*plBX&^&>Pw5{$bL!xf#WPjF@u+LmAF^JSA))` zH}4=RC3D5yV6~BZl^OnUn=l>T7I)FwPR0(8;g#f8>-f^+mrN<-$IKnI5(agE01TjK zRftl6VR3)#gu}4}XcA%ikx9csD;6B=14Hy+H{g&6YKCQN8rJNJ9%~mQK(h2gQ0taI z8YsRCfM1$Pd1h;c5mEUM0gBV@*uML*7WrK&l0E*o*&7*}actJSf?A|N-k+lm;QsTm zM-$u7oGN>rEs(m)QJ>z@QaYlGgu=YoyvrR_U7+$p7pUnTwNJFDtU84aOfA>^k32XlPO@d^K3Ff^dXFAo*GVg&R5KtM?w-!^O<{gvr$&fAT zNk-@bFocK*;L%T4kFB$&FsHqy&rIxX8DIUZ_M3rf#a>>p4WKHTRp;Mt;r}4i|G_jQ zNh1pi>TJTv7|?(g@Gn9gUm))&Mo5h4WJoicKy9dZW;9=8f>(rs;CW2noe-ogxB}7@ z)(@N8O66$exic}BH%`nf3rv7qs~=1@Pa@owQ;C&AzTKE&;Pyw+U8Yr{-GSgT&zMzguAU!u*P4<{kUkX8XNMI;j^MI>$az5!jJ5p!`MA%_)NM{uB#6VCm6!` zR}O|S8n4_cDZoK+RN|Uk*e%yW`RiipOQzQ1R0%&?7cr{)-56|6K6rbZ+xw$MG;}Jd z$%253g;ZMNd6mrIiVP)SyXm`WaaCZwgv#*!#IE2F-HXXnGRrq7z5wcAyF0FhT0KtF zU5VuTGZ2tKA(S>JjjuO%aTlAs znb}hFg0S11@|`BJq)1EY``-X-o&hFP!#L@y;rk}Yp+`tC3~553(F&nX>No+2P0~bP zyTI`!opO0dk^j+PV_++5+G_x+EQREfP~Bvp|1s6rE*v!~fnP>LX3jj_F(v0O?CQVq z@sCwo2ugq!H2(s2pO{2N-du`gp#)9z>EJ`l`PQ^A`t-i1@NMGM7XS1k5O#p()bBLf z_WlO2H&wJQ(=htL4;Srd=M>!teB=r=S9yr`-j|kcGt2At1YUnxP&*+3L0Pk=z4U=I z*?3adRsCGp+);94S7MBm*MPrGN(FgrejFK9(@ddA~1bf@ChmZ=Et>-Cq##q*`p7f8=GL}+YYZZdQNRRRu)ez~9D zf#QEAw(g(<7$~^2RwVAK>mpgSyHgj-Bm#U*iNm|&Fum^7UJ;d$efs-D?gOB5F? z{T`>j4^?|Es7pDDE&jDto&qfn;#sGNidCHcf*h81ld4u4ilo*n7#L=s^T^vH{ym$M zn_%>fVMRxS7nUT@*0n;&S}5Ju^xQ#Eu?FryyfBH6BcaZ^xOWhX#0h8^jytHK1SHW{ z*jr`9Y>GN-@6YtJl9(Nt7iZ0t86W*KsWJcF^z^U0>>oHaWcTqI<$BSS!Hia{@}kb* z6l6R@ol=_Gr(G0aB^7gSSP1H=s@UgnRKlC**V+d_>mW1mfuO72zu zhJHK6S0w91+SfJ)Y06RDu3prTT|ey}8*^`+(Bd85!>C80!h@1R`mEl`NxuO&Id<`_ z+a(!GQ2;SJ@hJLVxTFb!B$YwM5@_~dvmIz_GdNckG&}Nk6@OD%n`yhfHZRYju&G$bN60cn+G}I$t^h&Bk$ayW(EFH~XKr^I#TzJyf1)vY zUdGti7>ITGIU5f@2-NtO=J8LgrI8x4{UUfNU-zLL4ax3DUvP|x{*V(L(WSFCn+Bo~ zR7QwDu1gdcW`=Xbqu9Rg+&8tR>ERi(^>Ooyfs5!_hFLjzK_1%fdz@N=!qmRi>(Jyv zg{zld3?G9o@oSCFnxg1xr&I0H0Mt~>#r);U+CID|M8cE{c+w`DYzKn?4<7cycEsx5-DDk zV2B2^!t{k{y@7G*+@loIigz+Vnx~iY*3>jtRU6w*oGPQm7CiVv7;M!Hg%+xoE)MuO zG{YZZ9=g#@B*TND5de7#s++Zkbmb@Bl?gd|+wNbuLl z$dQMbYX>c7yi~uW1eYds2++vw^l1nfxb3aquVP7_XEqkCDD#yks7!F|Vy?6&HF4aG z-)N>lh*QAr9{sS1b8?l<2}(KqrI--D#-Y1y_oS^}rR&%5hnI^Y(wC80Pb!ZPzi*FC< zChUNEOD>}7^=PkVVVGvoUdf74>ySLPv&2o80sG#Rz;e4oeHA&1LZIn)_GYf=~mQHm*&_hMp{Z83UtN{qN>pr9c>q6+g_BdE%1Jh?)SV*ivJ}R z5f8ejU=79 zY+Qp1Rc4)hLnsZHXQD2Q?D{~1(?U?89>7=RO{t*DMCE~sV#?|P-9p}WpS~z8)y|3r zYc>H7@f=Jj<)b@iUINR^H8xhSX2aikwb#pLMQq^EPzs39*>_Ra@cbW~&>zn4oA6p0 zb2y_Esau~W1%iz>b{uTj2?}OYY3Bw9+d-xB1tz~hde`bR^tKg9dT%no+yE3wIFaCA z3t;{?bf^j1^(TV}bh7xZKr*tR*hT3dgOU_f{h(YmB!lW)DSQ@ahXLxTF0zL}9+YlR ztSs;;XQz?7QNR%thF*808L+x~9yhI;^X_yFj8cSeG`685yH7+ay3P;dF~7NrS}NWV z_0KPp-?t}Rfo!@;n=6U{fOZ?yXn%+6>WWfnJJBBWFqd1dNdyzzw}Xht2P*7_iu^N& z=Q03wY}RdMzTh6m|B2%Ksak;(KGzmtRf6J{^%Nd~WwcL8OA87Uj{&w6gF!H z0QPn0LIwAKtB!xV>c95oUn((qre=?n|6g9h2?3P+DR7@Jljz8;ol!#JLFKFyJy*J* z>-&pU{PV*;WP_wZ8cSUeh(Hur--Rr>35xz&~ZK7HJZ4C0BPaEYQlk0DUC#tO2UHpO4z ze)wO7+yAw+wl%qu4U-eddMZ}6XT6jyLz$cr9n!_F7`=tNWYpg9yk zWFIP$wL@pEf)ZLzOH~67@@1^K)IFC4Ep-IV@&F>#j@!&j_M)Sl9KD+HSfW8GPaZhM zl9qWf{cqUNzv)K)QMvu&Me{#|(7dt`l;h*b6q&VN2#Vv0-N1(<-Kx#+TZC@}E+w$Z zhCMG88&QZ0Ws3nKz0_MujsA8GsTi|=d)fQH_pJZumi)f*FYWvzwczhQg0!sd#=Jx| z=fQ&w%mJVTKMDe9U@NC+Ub*Hg&`R9la zQeOTTyZ?vlG?H-!3$5u}fMhRA6`XC4xJ7Hg&(~mDGQj7hR**srlmaAS6$?zCQZbs{KFbJO4iM`i0E;oxA9lCI9~-z5?gF`R&uSQUMy%yR42HZIl1~IP71v IIls;SAE|uVHvj+t literal 0 HcmV?d00001 diff --git a/support/sdk/java/net/tinyos/mviz/images/tmote_sky.png b/support/sdk/java/net/tinyos/mviz/images/tmote_sky.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf018e4befd6a9365026c4529618b7ec5a99c53 GIT binary patch literal 9506 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 At^fc4 literal 0 HcmV?d00001 diff --git a/support/sdk/java/tinyos.jar b/support/sdk/java/tinyos.jar index 3910e3fed9a39992bd1c9033ca7b8812acf825cc..8b027ee89f7777c1df1a261e3a62a6766fb07d0b 100644 GIT binary patch delta 162828 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 n`bd}sMZ!OC2XzV%`M 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 +# @author Kaisen Lin +# +# $Revision$ +# $Date$ +# + +from re import match +from sys import * +from xml.dom import minidom + +NUM_SECTORS = 16 +SECTOR_SIZE = 2097152 + +volumes = {} + +volumeNames = [] +volumeSizes = [] +volumeOffsets = [] +freeSectors = NUM_SECTORS*[ True ] + +def error_exit( s ): + stderr.write( "ERROR: " + s + "\n" ) + exit( 2 ) + +try: + dom = minidom.parse( stdin ) +except xml.parsers.expat.ExpatError: + error_exit( "input invalid" ) + +# initialize reserved piece +volumes [ "PXARESERVED" ] = "blah" +volumeNames.append( "VOLUME_PXARESERVED" ) +volumeSizes.append( 1 ) +volumeOffsets.append( 0 ) +freeSectors[ 0 ] = False + +# extract information +for volume in dom.documentElement.getElementsByTagName( "volume" ): + name = volume.getAttribute( "name" ) + size = volume.getAttribute( "size" ) + base = volume.getAttribute( "base" ) + if name == "": + error_exit( "volume has no name" ) + elif not match( "^[a-zA-Z0-9_]+$", name ): + error_exit( "volume has invalid name '%s'" % name ) + elif volumes.has_key( name ): + error_exit( "duplicate volume definition '%s'" % name ) + else: + volumes[ name ] = "blah" + + if size == "": + error_exit( "volume '%s' has no size" % name ) + try: + size = int( size ) + except ValueError: + error_exit( "volume '%s' has invalid size" % name ) + if base != "": + try: + base = int( base ) + except ValueError: + error_exit( "volume '%s' has invalid base" % name ) + + if ( size & ( SECTOR_SIZE - 1 ) ) != 0: + error_exit( "size of volume '%s' is not a multiple of %d" % \ + ( name, SECTOR_SIZE ) ) + if base != "" and ( base & ( SECTOR_SIZE - 1 ) ) != 0: + error_exit( "base of volume '%s' is not a multiple of %d" % \ + ( name, SECTOR_SIZE ) ) + + volumeNames.append( "VOLUME_" + name ) + volumeSizes.append( size / SECTOR_SIZE ) + if base == "": + volumeOffsets.append( -1 ) + else: + base = base / SECTOR_SIZE + volumeOffsets.append( base ) + for i in range( size / SECTOR_SIZE ): + freeSectors[ i + base ] = False + +# allocate with first fit policy +for i in range( len( volumeOffsets ) ): + size = volumeSizes[ i ] + if volumeOffsets[ i ] == -1: + for j in range( NUM_SECTORS ): + if freeSectors[ j ]: + size -= 1 + if size == 0: + volumeOffsets[ i ] = j - ( volumeSizes[ i ] - 1 ) + break + else: + size = volumeSizes[ i ] + if volumeOffsets[ i ] == -1: + raise "Unable to satisfy allocation request." + else: + for j in range( volumeSizes[ i ] ): + freeSectors[ volumeOffsets[ i ] + j ] = False + +# output C file + +print "#ifndef __STORAGE_VOLUME_H__" +print "#define __STORAGE_VOLUME_H__" +print "" +print "#include \"P30.h\"" +print "" + +for i in range( len( volumeNames ) ): + print "#define %s %d" % ( volumeNames[ i ], i ) + print "#define %s %s" % ( volumeNames[ i ] + "_UQ", "unique(\"pxa27xp30.Volume\")" ) +print "#define _V_NUMVOLS_ %d" % ( len( volumeNames )) +print "" + +print "static const p30_volume_info_t P30_VMAP[ %d ] = {" % \ + len( volumeNames ) +for i in range( len( volumeNames ) ): + print " { base : %d, size : %d }," % \ + ( volumeOffsets[ i ], volumeSizes[ i ] ) +print "};" + +print "" +print "#endif" diff --git a/tools/tinyos/misc/tos-storage-pxa27xp30.1 b/tools/tinyos/misc/tos-storage-pxa27xp30.1 new file mode 100644 index 00000000..61f065b1 --- /dev/null +++ b/tools/tinyos/misc/tos-storage-pxa27xp30.1 @@ -0,0 +1,25 @@ +.TH tos-storage-pxa27xp30 1 "July 26, 2006" +.LO 1 +.SH NAME + +tos-storage-pxa27xp30 - Generate storage volume description code +.SH SYNOPSIS + +\fBtos-storage-pxa27xp30\fR +.SH DESCRIPTION + +\fBtos-storage-pxa27xp30\fR reads a user specification describing the +layout of storage volumes on an embedded P30 flash in the Intel Xscale +PXA27X series processor, and generates code describing that layout for +use by the TinyOS 2.0 storage subsystem. The user specification is in +XML and is read from standard input. The code is written to standard +output. + +This program is normally invoked automatically by the TinyOS build system +when your application directory contains a \fBvolumes-pxa27xp30.xml\fR file. +.SH EXAMPLES + + tos-storage-pxa27xp30 build/telosb/StorageVolumes.h +.SH SEE ALSO + +.IR tos-storage-pxa27xp30 (1) diff --git a/tools/tinyos/misc/tos-storage-pxa27xp30.in b/tools/tinyos/misc/tos-storage-pxa27xp30.in new file mode 100755 index 00000000..275b5007 --- /dev/null +++ b/tools/tinyos/misc/tos-storage-pxa27xp30.in @@ -0,0 +1,152 @@ +#!@pythonpath@ +# -*- python -*- +# Copyright (c) 2005-2006 Arch Rock Corporation +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the +# distribution. +# - Neither the name of the Arch Rock Corporation nor the names of +# its contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +# OF THE POSSIBILITY OF SUCH DAMAGE +# +# @author Jonathan Hui +# @author Kaisen Lin +# +# $Revision$ +# $Date$ +# + +from re import match +from sys import * +from xml.dom import minidom + +NUM_SECTORS = 16 +SECTOR_SIZE = 2097152 + +volumes = {} + +volumeNames = [] +volumeSizes = [] +volumeOffsets = [] +freeSectors = NUM_SECTORS*[ True ] + +def error_exit( s ): + stderr.write( "ERROR: " + s + "\n" ) + exit( 2 ) + +try: + dom = minidom.parse( stdin ) +except xml.parsers.expat.ExpatError: + error_exit( "input invalid" ) + +# initialize reserved piece +volumes [ "PXARESERVED" ] = "blah" +volumeNames.append( "VOLUME_PXARESERVED" ) +volumeSizes.append( 1 ) +volumeOffsets.append( 0 ) +freeSectors[ 0 ] = False + +# extract information +for volume in dom.documentElement.getElementsByTagName( "volume" ): + name = volume.getAttribute( "name" ) + size = volume.getAttribute( "size" ) + base = volume.getAttribute( "base" ) + if name == "": + error_exit( "volume has no name" ) + elif not match( "^[a-zA-Z0-9_]+$", name ): + error_exit( "volume has invalid name '%s'" % name ) + elif volumes.has_key( name ): + error_exit( "duplicate volume definition '%s'" % name ) + else: + volumes[ name ] = "blah" + + if size == "": + error_exit( "volume '%s' has no size" % name ) + try: + size = int( size ) + except ValueError: + error_exit( "volume '%s' has invalid size" % name ) + if base != "": + try: + base = int( base ) + except ValueError: + error_exit( "volume '%s' has invalid base" % name ) + + if ( size & ( SECTOR_SIZE - 1 ) ) != 0: + error_exit( "size of volume '%s' is not a multiple of %d" % \ + ( name, SECTOR_SIZE ) ) + if base != "" and ( base & ( SECTOR_SIZE - 1 ) ) != 0: + error_exit( "base of volume '%s' is not a multiple of %d" % \ + ( name, SECTOR_SIZE ) ) + + volumeNames.append( "VOLUME_" + name ) + volumeSizes.append( size / SECTOR_SIZE ) + if base == "": + volumeOffsets.append( -1 ) + else: + base = base / SECTOR_SIZE + volumeOffsets.append( base ) + for i in range( size / SECTOR_SIZE ): + freeSectors[ i + base ] = False + +# allocate with first fit policy +for i in range( len( volumeOffsets ) ): + size = volumeSizes[ i ] + if volumeOffsets[ i ] == -1: + for j in range( NUM_SECTORS ): + if freeSectors[ j ]: + size -= 1 + if size == 0: + volumeOffsets[ i ] = j - ( volumeSizes[ i ] - 1 ) + break + else: + size = volumeSizes[ i ] + if volumeOffsets[ i ] == -1: + raise "Unable to satisfy allocation request." + else: + for j in range( volumeSizes[ i ] ): + freeSectors[ volumeOffsets[ i ] + j ] = False + +# output C file + +print "#ifndef __STORAGE_VOLUME_H__" +print "#define __STORAGE_VOLUME_H__" +print "" +print "#include \"P30.h\"" +print "" + +for i in range( len( volumeNames ) ): + print "#define %s %d" % ( volumeNames[ i ], i ) + print "#define %s %s" % ( volumeNames[ i ] + "_UQ", "unique(\"pxa27xp30.Volume\")" ) +print "#define _V_NUMVOLS_ %d" % ( len( volumeNames )) +print "" + +print "static const p30_volume_info_t P30_VMAP[ %d ] = {" % \ + len( volumeNames ) +for i in range( len( volumeNames ) ): + print " { base : %d, size : %d }," % \ + ( volumeOffsets[ i ], volumeSizes[ i ] ) +print "};" + +print "" +print "#endif" diff --git a/tos/chips/atm128/Atm128Uart0C.nc b/tos/chips/atm128/Atm128Uart0C.nc new file mode 100644 index 00000000..1767680a --- /dev/null +++ b/tos/chips/atm128/Atm128Uart0C.nc @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Alec Woo + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +configuration Atm128Uart0C { + + provides interface StdControl; + provides interface UartByte; + provides interface UartStream; + uses interface Counter; + +} + +implementation{ + + components new Atm128UartP() as UartP; + StdControl = UartP; + UartByte = UartP; + UartStream = UartP; + UartP.Counter = Counter; + + components HplAtm128UartC as HplUartC; + UartP.HplUartTxControl -> HplUartC.Uart0TxControl; + UartP.HplUartRxControl -> HplUartC.Uart0RxControl; + UartP.HplUart -> HplUartC.HplUart0; + + components MainC; + MainC.SoftwareInit -> UartP; + +} diff --git a/tos/chips/atm128/Atm128UartP.nc b/tos/chips/atm128/Atm128UartP.nc new file mode 100644 index 00000000..4891e734 --- /dev/null +++ b/tos/chips/atm128/Atm128UartP.nc @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Alec Woo + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include + +generic module Atm128UartP(){ + + provides interface Init; + provides interface StdControl; + provides interface UartByte; + provides interface UartStream; + + uses interface StdControl as HplUartTxControl; + uses interface StdControl as HplUartRxControl; + uses interface HplAtm128Uart as HplUart; + uses interface Counter; + +} + +implementation{ + + norace uint8_t *m_tx_buf, *m_rx_buf; + norace uint16_t m_tx_len, m_rx_len; + norace uint16_t m_tx_pos, m_rx_pos; + norace uint16_t m_byte_time; + + command error_t Init.init() { + if (PLATFORM_BAUDRATE == 19200UL) + m_byte_time = 200; // 1 TMicor ~= 2.12 us, one byte = 417us ~= 200 + else if (PLATFORM_BAUDRATE == 57600UL) + m_byte_time = 68; // 1 TMicor ~= 2.12 us, one byte = 138us ~= 65 + return SUCCESS; + } + + command error_t StdControl.start(){ + call HplUartTxControl.start(); + call HplUartRxControl.start(); + return SUCCESS; + } + + command error_t StdControl.stop(){ + call HplUartTxControl.stop(); + call HplUartRxControl.stop(); + return SUCCESS; + } + + async command error_t UartStream.enableReceiveInterrupt(){ + call HplUartRxControl.start(); + return SUCCESS; + } + + async command error_t UartStream.disableReceiveInterrupt(){ + call HplUartRxControl.stop(); + return SUCCESS; + } + + async command error_t UartStream.receive( uint8_t* buf, uint16_t len ){ + + if ( len == 0 ) + return FAIL; + atomic { + if ( m_rx_buf ) + return EBUSY; + m_rx_buf = buf; + m_rx_len = len; + m_rx_pos = 0; + } + + return SUCCESS; + + } + + async event void HplUart.rxDone( uint8_t data ) { + + if ( m_rx_buf ) { + m_rx_buf[ m_rx_pos++ ] = data; + if ( m_rx_pos >= m_rx_len ) { + uint8_t* buf = m_rx_buf; + m_rx_buf = NULL; + signal UartStream.receiveDone( buf, m_rx_len, SUCCESS ); + } + } + else { + signal UartStream.receivedByte( data ); + } + + } + + async command error_t UartStream.send( uint8_t *buf, uint16_t len){ + + if ( len == 0 ) + return FAIL; + else if ( m_tx_buf ) + return EBUSY; + + m_tx_buf = buf; + m_tx_len = len; + m_tx_pos = 0; + call HplUart.tx( buf[ m_tx_pos++ ] ); + + return SUCCESS; + + } + + async event void HplUart.txDone() { + + if ( m_tx_pos < m_tx_len ) { + call HplUart.tx( m_tx_buf[ m_tx_pos++ ] ); + } + else { + uint8_t* buf = m_tx_buf; + m_tx_buf = NULL; + signal UartStream.sendDone( buf, m_tx_len, SUCCESS ); + } + + } + + async command error_t UartByte.send( uint8_t byte ){ + call HplUart.tx( byte ); + while ( !call HplUart.isTxEmpty() ); + return SUCCESS; + } + + async command error_t UartByte.receive( uint8_t * byte, uint8_t timeout){ + + uint16_t timeout_micro = m_byte_time * timeout + 1; + uint16_t start; + + start = call Counter.get(); + while ( call HplUart.isRxEmpty() ) { + if ( ( (uint16_t)call Counter.get() - start ) >= timeout_micro ) + return FAIL; + } + *byte = call HplUart.rx(); + + return SUCCESS; + + } + + async event void Counter.overflow() {} + + default async event void UartStream.sendDone( uint8_t* buf, uint16_t len, error_t error ){} + default async event void UartStream.receivedByte( uint8_t byte ){} + default async event void UartStream.receiveDone( uint8_t* buf, uint16_t len, error_t error ){} + +} diff --git a/tos/chips/atm128/HplAtm128Uart.nc b/tos/chips/atm128/HplAtm128Uart.nc new file mode 100644 index 00000000..fc46b300 --- /dev/null +++ b/tos/chips/atm128/HplAtm128Uart.nc @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCH ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Alec Woo + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +interface HplAtm128Uart { + + async command error_t enableTxIntr(); + async command error_t disableTxIntr(); + async command error_t enableRxIntr(); + async command error_t disableRxIntr(); + async command bool isTxEmpty(); + async command bool isRxEmpty(); + async command void tx( uint8_t data ); + async event void txDone(); + async command uint8_t rx(); + async event void rxDone( uint8_t data ); + +} diff --git a/tos/chips/cc1000_lpl/ByteRadio.nc b/tos/chips/cc1000_lpl/ByteRadio.nc new file mode 100644 index 00000000..468507ab --- /dev/null +++ b/tos/chips/cc1000_lpl/ByteRadio.nc @@ -0,0 +1,96 @@ +/* $Id$ + * Copyright (c) 2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ +/** + * Radio logic is split between Csma (media-access control, low-power + * listening and general control) and SendReceive (packet reception and + * transmission). This interface specifies the interaction between these + * two components. + * + * @author David Gay + */ + +interface ByteRadio +{ + /** + * SendReceive wants to send a packet. + * @param msg Message to be sent. + */ + event void rts(message_t *msg); + + /** + * Access to the media granted. Start sending. SendReceive must signal + * sendDone when transmission is complete. Note: the media-access-contro + * layer must have enabled listening before calling cts(). + */ + async command void cts(); + + /** + * Between the rts() and sendDone() events, this must return the + * message under transmission. + * @return Message being transmitted. + */ + async command message_t *getTxMessage(); + + /** + * Transmission complete. + */ + async event void sendDone(); + + /** + * Set message preamble length. + * @param bytes Preamble length in bytes + */ + async command void setPreambleLength(uint16_t bytes); + + /** + * Get message preamble length. + * @return Preamble length in bytes + */ + async command uint16_t getPreambleLength(); + + /** + * Enable listening for incoming packets. + */ + async command void listen(); + + /** + * Disable listening for incoming packets. + */ + async command void off(); + + /** + * SendReceive signals this event for every radio-byte-time while + * listening is enabled and a message isn't being received or + * transmitted. + * @param preamble TRUE if a message preamble byte has been received + */ + async event void idleByte(bool preamble); + + /** + * Detect if SendReceive is attempting to sync with an incoming packet. + * During sync, idleByte events are not signaled. If sync is successful, + * an rx() event will be signaled, if it fails, idleByte events will + * resume. If syncing() returns TRUE, the last idleByte() event must + * have had preamble = TRUE. + * + * @return TRUE if a sync attempt is in progress, FALSE if not. + */ + async command bool syncing(); + + /** + * A message is being received + */ + async event void rx(); + + /** + * Message reception is complete. + */ + async event void rxDone(); +} diff --git a/tos/chips/cc1000_lpl/CC1000ActiveMessageC.nc b/tos/chips/cc1000_lpl/CC1000ActiveMessageC.nc new file mode 100644 index 00000000..c4ed2b00 --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000ActiveMessageC.nc @@ -0,0 +1,76 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2004-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2004-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/** + * + * The Active Message layer for the CC1000 radio. This configuration + * just layers the AM dispatch (CC1000ActiveMessageM) on top of the + * underlying CC1000 radio packet (CC1000CsmaRadioC), which is + * inherently an AM packet (acknowledgements based on AM destination + * addr and group). + * + * @author Philip Levis + * @date June 19 2005 + */ + +configuration CC1000ActiveMessageC { + provides { + interface SplitControl; + interface AMSend[am_id_t id]; + interface Receive[am_id_t id]; + interface Receive as Snoop[am_id_t id]; + interface AMPacket; + interface Packet; + interface PacketAcknowledgements; + interface LowPowerListening; + } +} +implementation { + + components CC1000ActiveMessageP as AM, CC1000CsmaRadioC as Radio; + components ActiveMessageAddressC as Address; + components CC1000LowPowerListeningC as Lpl; + + SplitControl = Radio; + Packet = Radio; + PacketAcknowledgements = Radio; + LowPowerListening = Radio; + + AMSend = AM; + Receive = AM.Receive; + Snoop = AM.Snoop; + AMPacket = AM; + + AM.SubSend -> Lpl.Send; + AM.SubReceive -> Lpl.Receive; + AM.amAddress -> Address; + AM.Packet -> Radio; +} diff --git a/tos/chips/cc1000_lpl/CC1000ActiveMessageP.nc b/tos/chips/cc1000_lpl/CC1000ActiveMessageP.nc new file mode 100644 index 00000000..734d562f --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000ActiveMessageP.nc @@ -0,0 +1,169 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2004-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2004-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ +/** + * Implementation component for CC1000ActiveMessageC. + * + * @author Philip Levis + * @date June 19 2006 + */ + +module CC1000ActiveMessageP { + provides { + interface AMSend[am_id_t id]; + interface Receive[am_id_t id]; + interface Receive as Snoop[am_id_t id]; + interface AMPacket; + } + uses { + interface Send as SubSend; + interface Receive as SubReceive; + interface Packet as Packet; + command am_addr_t amAddress(); + } +} +implementation { + + cc1000_header_t* getHeader(message_t* amsg) { + return (cc1000_header_t*)(amsg->data - sizeof(cc1000_header_t)); + } + + command error_t AMSend.send[am_id_t id](am_addr_t addr, + message_t* amsg, + uint8_t len) { + cc1000_header_t* header = getHeader(amsg); + header->type = id; + header->dest = addr; + header->source = call AMPacket.address(); + header->group = TOS_AM_GROUP; + return call SubSend.send(amsg, len); + } + + command error_t AMSend.cancel[am_id_t id](message_t* msg) { + return call SubSend.cancel(msg); + } + + event void SubSend.sendDone(message_t* msg, error_t result) { + signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); + } + + command uint8_t AMSend.maxPayloadLength[am_id_t id]() { + return call Packet.maxPayloadLength(); + } + + command void* AMSend.getPayload[am_id_t id](message_t* m) { + return call Packet.getPayload(m, NULL); + } + + /* Receiving a packet */ + + event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { + if (call AMPacket.isForMe(msg)) { + return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len); + } + else { + return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len); + } + } + + command void* Receive.getPayload[am_id_t id](message_t* m, uint8_t* len) { + return call Packet.getPayload(m, len); + } + + command uint8_t Receive.payloadLength[am_id_t id](message_t* m) { + return call Packet.payloadLength(m); + } + + command void* Snoop.getPayload[am_id_t id](message_t* m, uint8_t* len) { + return call Packet.getPayload(m, len); + } + + command uint8_t Snoop.payloadLength[am_id_t id](message_t* m) { + return call Packet.payloadLength(m); + } + + command am_addr_t AMPacket.address() { + return call amAddress(); + } + + command am_addr_t AMPacket.destination(message_t* amsg) { + cc1000_header_t* header = getHeader(amsg); + return header->dest; + } + + command am_addr_t AMPacket.source(message_t* amsg) { + cc1000_header_t* header = getHeader(amsg); + return header->source; + } + + command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { + cc1000_header_t* header = getHeader(amsg); + header->dest = addr; + } + + command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { + cc1000_header_t* header = getHeader(amsg); + header->source = addr; + } + + command bool AMPacket.isForMe(message_t* amsg) { + return (call AMPacket.destination(amsg) == call AMPacket.address() || + call AMPacket.destination(amsg) == AM_BROADCAST_ADDR); + } + + command am_id_t AMPacket.type(message_t* amsg) { + cc1000_header_t* header = getHeader(amsg); + return header->type; + } + + command void AMPacket.setType(message_t* amsg, am_id_t type) { + cc1000_header_t* header = getHeader(amsg); + header->type = type; + } + + //command am_group_t AMPacket.group(message_t* amsg) { + // return amsg->header.group; + //} + + default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { + return msg; + } + + default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { + return msg; + } + + default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { + return; + } + + + +} diff --git a/tos/chips/cc1000_lpl/CC1000Const.h b/tos/chips/cc1000_lpl/CC1000Const.h new file mode 100644 index 00000000..9543c891 --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000Const.h @@ -0,0 +1,469 @@ +// $Id$ + +/* -*- Mode: C; c-basic-indent: 2; indent-tabs-mode: nil -*- */ +/* tab:4 + * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By + * downloading, copying, installing or using the software you agree to + * this license. If you do not agree to this license, do not download, + * install, copy or use the software. + * + * Intel Open Source License + * + * Copyright (c) 2002 Intel Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ + +/* + * Constants for CC1000 radio + * + * @author Phil Buonadonna + */ + +#ifndef CC1000CONST_H +#define CC1000CONST_H + +/* Constants defined for CC1K */ +/* Register addresses */ + +enum { + CC1K_MAIN = 0x00, + CC1K_FREQ_2A = 0x01, + CC1K_FREQ_1A = 0x02, + CC1K_FREQ_0A = 0x03, + CC1K_FREQ_2B = 0x04, + CC1K_FREQ_1B = 0x05, + CC1K_FREQ_0B = 0x06, + CC1K_FSEP1 = 0x07, + CC1K_FSEP0 = 0x08, + CC1K_CURRENT = 0x09, + CC1K_FRONT_END = 0x0A, //10 + CC1K_PA_POW = 0x0B, //11 + CC1K_PLL = 0x0C, //12 + CC1K_LOCK = 0x0D, //13 + CC1K_CAL = 0x0E, //14 + CC1K_MODEM2 = 0x0F, //15 + CC1K_MODEM1 = 0x10, //16 + CC1K_MODEM0 = 0x11, //17 + CC1K_MATCH = 0x12, //18 + CC1K_FSCTRL = 0x13, //19 + CC1K_FSHAPE7 = 0x14, //20 + CC1K_FSHAPE6 = 0x15, //21 + CC1K_FSHAPE5 = 0x16, //22 + CC1K_FSHAPE4 = 0x17, //23 + CC1K_FSHAPE3 = 0x18, //24 + CC1K_FSHAPE2 = 0x19, //25 + CC1K_FSHAPE1 = 0x1A, //26 + CC1K_FSDELAY = 0x1B, //27 + CC1K_PRESCALER = 0x1C, //28 + CC1K_TEST6 = 0x40, //64 + CC1K_TEST5 = 0x41, //66 + CC1K_TEST4 = 0x42, //67 + CC1K_TEST3 = 0x43, //68 + CC1K_TEST2 = 0x44, //69 + CC1K_TEST1 = 0x45, //70 + CC1K_TEST0 = 0x46, //71 + + // MAIN Register Bit Posititions + CC1K_RXTX = 7, + CC1K_F_REG = 6, + CC1K_RX_PD = 5, + CC1K_TX_PD = 4, + CC1K_FS_PD = 3, + CC1K_CORE_PD = 2, + CC1K_BIAS_PD = 1, + CC1K_RESET_N = 0, + + // CURRENT Register Bit Positions + CC1K_VCO_CURRENT = 4, + CC1K_LO_DRIVE = 2, + CC1K_PA_DRIVE = 0, + + // FRONT_END Register Bit Positions + CC1K_BUF_CURRENT = 5, + CC1K_LNA_CURRENT = 3, + CC1K_IF_RSSI = 1, + CC1K_XOSC_BYPASS = 0, + + // PA_POW Register Bit Positions + CC1K_PA_HIGHPOWER = 4, + CC1K_PA_LOWPOWER = 0, + + // PLL Register Bit Positions + CC1K_EXT_FILTER = 7, + CC1K_REFDIV = 3, + CC1K_ALARM_DISABLE = 2, + CC1K_ALARM_H = 1, + CC1K_ALARM_L = 0, + + // LOCK Register Bit Positions + CC1K_LOCK_SELECT = 4, + CC1K_PLL_LOCK_ACCURACY = 3, + CC1K_PLL_LOCK_LENGTH = 2, + CC1K_LOCK_INSTANT = 1, + CC1K_LOCK_CONTINUOUS = 0, + + // CAL Register Bit Positions + CC1K_CAL_START = 7, + CC1K_CAL_DUAL = 6, + CC1K_CAL_WAIT = 5, + CC1K_CAL_CURRENT = 4, + CC1K_CAL_COMPLETE = 3, + CC1K_CAL_ITERATE = 0, + + // MODEM2 Register Bit Positions + CC1K_PEAKDETECT = 7, + CC1K_PEAK_LEVEL_OFFSET = 0, + + // MODEM1 Register Bit Positions + CC1K_MLIMIT = 5, + CC1K_LOCK_AVG_IN = 4, + CC1K_LOCK_AVG_MODE = 3, + CC1K_SETTLING = 1, + CC1K_MODEM_RESET_N = 0, + + // MODEM0 Register Bit Positions + CC1K_BAUDRATE = 4, + CC1K_DATA_FORMAT = 2, + CC1K_XOSC_FREQ = 0, + + // MATCH Register Bit Positions + CC1K_RX_MATCH = 4, + CC1K_TX_MATCH = 0, + + // FSCTLR Register Bit Positions + CC1K_DITHER1 = 3, + CC1K_DITHER0 = 2, + CC1K_SHAPE = 1, + CC1K_FS_RESET_N = 0, + + // PRESCALER Register Bit Positions + CC1K_PRE_SWING = 6, + CC1K_PRE_CURRENT = 4, + CC1K_IF_INPUT = 3, + CC1K_IF_FRONT = 2, + + // TEST6 Register Bit Positions + CC1K_LOOPFILTER_TP1 = 7, + CC1K_LOOPFILTER_TP2 = 6, + CC1K_CHP_OVERRIDE = 5, + CC1K_CHP_CO = 0, + + // TEST5 Register Bit Positions + CC1K_CHP_DISABLE = 5, + CC1K_VCO_OVERRIDE = 4, + CC1K_VCO_AO = 0, + + // TEST3 Register Bit Positions + CC1K_BREAK_LOOP = 4, + CC1K_CAL_DAC_OPEN = 0, + + + /* + * CC1K Register Parameters Table + * + * This table follows the same format order as the CC1K register + * set EXCEPT for the last entry in the table which is the + * CURRENT register value for TX mode. + * + * NOTE: To save RAM space, this table resides in program memory (flash). + * This has two important implications: + * 1) You can't write to it (duh!) + * 2) You must read it using the PRG_RDB(addr) macro. IT CANNOT BE ACCESSED AS AN ORDINARY C ARRAY. + * + * Add/remove individual entries below to suit your RF tastes. + * + */ + CC1K_433_002_MHZ = 0x00, + CC1K_915_998_MHZ = 0x01, + CC1K_434_845_MHZ = 0x02, + CC1K_914_077_MHZ = 0x03, + CC1K_315_178_MHZ = 0x04, + + //#define CC1K_SquelchInit 0x02F8 // 0.90V using the bandgap reference + CC1K_SquelchInit = 0x120, + CC1K_SquelchTableSize = 9, + CC1K_MaxRSSISamples = 5, + CC1K_Settling = 1, + CC1K_ValidPrecursor = 2, + CC1K_SquelchIntervalFast = 128, + CC1K_SquelchIntervalSlow = 2560, + CC1K_SquelchCount = 30, + CC1K_SquelchBuffer = 12, + + CC1K_LPL_PACKET_TIME = 16, + + CC1K_LPL_CHECK_TIME = 16, /* In tenth's of milliseconds, this should + be an approximation of the on-time for + a LPL check rather than the total check + time. */ + CC1K_LPL_MIN_INTERVAL = 5, /* In milliseconds, the minimum interval + between low-power-listening checks */ + CC1K_LPL_MAX_INTERVAL = 10000, /* In milliseconds, the maximum interval + between low-power-listening checks. + Arbitrary value, but must be at + most 32767 because of the way + sleep interval is stored in outgoing + messages */ + + CC1000_MIN_BACKOFF = 2, + CC1000_BACKOFF_PERIOD = 2, +}; + +#ifdef CC1K_DEFAULT_FREQ +#define CC1K_DEF_PRESET (CC1K_DEFAULT_FREQ) +#endif +#ifdef CC1K_MANUAL_FREQ +#define CC1K_DEF_FREQ (CC1K_MANUAL_FREQ) +#endif + +#ifndef CC1K_DEF_PRESET +#define CC1K_DEF_PRESET (CC1K_914_077_MHZ) +#endif + +static const_uint8_t CC1K_Params[6][20] = { + // (0) 433.002 MHz channel, 19.2 Kbps data, Manchester Encoding, High Side LO + { // MAIN 0x00 + 0x31, + // FREQ2A,FREQ1A,FREQ0A 0x01-0x03 + 0x58,0x00,0x00, + // FREQ2B,FREQ1B,FREQ0B 0x04-0x06 + 0x57,0xf6,0x85, //XBOW + // FSEP1, FSEP0 0x07-0x08 + 0X03,0x55, + // CURRENT RX MODE VALUE 0x09 also see below + 4 << CC1K_VCO_CURRENT | 1 << CC1K_LO_DRIVE, + // FRONT_END 0x0a + 1 << CC1K_IF_RSSI, + // PA_POW 0x0b + 0x0 << CC1K_PA_HIGHPOWER | 0xf << CC1K_PA_LOWPOWER, + // PLL 0x0c + 12 << CC1K_REFDIV, + // LOCK 0x0d + 0xe << CC1K_LOCK_SELECT, + // CAL 0x0e + 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE, + // MODEM2 0x0f + 0 << CC1K_PEAKDETECT | 28 << CC1K_PEAK_LEVEL_OFFSET, + // MODEM1 0x10 + 3 << CC1K_MLIMIT | 1 << CC1K_LOCK_AVG_MODE | CC1K_Settling << CC1K_SETTLING | 1 << CC1K_MODEM_RESET_N, + // MODEM0 0x11 + 5 << CC1K_BAUDRATE | 1 << CC1K_DATA_FORMAT | 1 << CC1K_XOSC_FREQ, + // MATCH 0x12 + 0x7 << CC1K_RX_MATCH | 0x0 << CC1K_TX_MATCH, + // tx current (extra) + 8 << CC1K_VCO_CURRENT | 1 << CC1K_PA_DRIVE, + }, + + // 1 915.9988 MHz channel, 19.2 Kbps data, Manchester Encoding, High Side LO + { // MAIN 0x00 + 0x31, + // FREQ2A,FREQ1A,FREQ0A 0x01-0x03 + 0x7c,0x00,0x00, + // FREQ2B,FREQ1B,FREQ0B 0x04-0x06 + 0x7b,0xf9,0xae, + // FSEP1, FSEP0 0x07-0x8 + 0x02,0x38, + // CURRENT RX MODE VALUE 0x09 also see below + 8 << CC1K_VCO_CURRENT | 3 << CC1K_LO_DRIVE, + //0x8C, + // FRONT_END 0x0a + 1 << CC1K_BUF_CURRENT | 2 << CC1K_LNA_CURRENT | 1 << CC1K_IF_RSSI, + //0x32, + // PA_POW 0x0b + 0x8 << CC1K_PA_HIGHPOWER | 0x0 << CC1K_PA_LOWPOWER, + //0xff, + // PLL 0xc + 8 << CC1K_REFDIV, + //0x40, + // LOCK 0xd + 0x1 << CC1K_LOCK_SELECT, + //0x10, + // CAL 0xe + 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE, + //0x26, + // MODEM2 0xf + 1 << CC1K_PEAKDETECT | 33 << CC1K_PEAK_LEVEL_OFFSET, + //0xA1, + // MODEM1 0x10 + 3 << CC1K_MLIMIT | 1 << CC1K_LOCK_AVG_MODE | CC1K_Settling << CC1K_SETTLING | 1 << CC1K_MODEM_RESET_N, + //0x6f, + // MODEM0 0x11 + 5 << CC1K_BAUDRATE | 1 << CC1K_DATA_FORMAT | 1 << CC1K_XOSC_FREQ, + //0x55, + // MATCH 0x12 + 0x1 << CC1K_RX_MATCH | 0x0 << CC1K_TX_MATCH, + // tx current (extra) + 15 << CC1K_VCO_CURRENT | 3 << CC1K_PA_DRIVE, + }, + + // 2 434.845200 MHz channel, 19.2 Kbps data, Manchester Encoding, High Side LO + { // MAIN 0x00 + 0x31, + // FREQ2A,FREQ1A,FREQ0A 0x01-0x03 + 0x51,0x00,0x00, + // FREQ2B,FREQ1B,FREQ0B 0x04-0x06 + 0x50,0xf7,0x4F, //XBOW + // FSEP1, FSEP0 0x07-0x08 + 0X03,0x0E, + // CURRENT RX MODE VALUE 0x09 also see below + 4 << CC1K_VCO_CURRENT | 1 << CC1K_LO_DRIVE, + // FRONT_END 0x0a + 1 << CC1K_IF_RSSI, + // PA_POW 0x0b + 0x0 << CC1K_PA_HIGHPOWER | 0xf << CC1K_PA_LOWPOWER, + // PLL 0x0c + 11 << CC1K_REFDIV, + // LOCK 0x0d + 0xe << CC1K_LOCK_SELECT, + // CAL 0x0e + 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE, + // MODEM2 0x0f + 1 << CC1K_PEAKDETECT | 33 << CC1K_PEAK_LEVEL_OFFSET, + // MODEM1 0x10 + 3 << CC1K_MLIMIT | 1 << CC1K_LOCK_AVG_MODE | CC1K_Settling << CC1K_SETTLING | 1 << CC1K_MODEM_RESET_N, + // MODEM0 0x11 + 5 << CC1K_BAUDRATE | 1 << CC1K_DATA_FORMAT | 1 << CC1K_XOSC_FREQ, + // MATCH 0x12 + 0x7 << CC1K_RX_MATCH | 0x0 << CC1K_TX_MATCH, + // tx current (extra) + 8 << CC1K_VCO_CURRENT | 1 << CC1K_PA_DRIVE, + }, + + + // 3 914.077 MHz channel, 19.2 Kbps data, Manchester Encoding, High Side LO + { // MAIN 0x00 + 0x31, + // FREQ2A,FREQ1A,FREQ0A 0x01-0x03 + 0x5c,0xe0,0x00, + // FREQ2B,FREQ1B,FREQ0B 0x04-0x06 + 0x5c,0xdb,0x42, + // FSEP1, FSEP0 0x07-0x8 + 0x01,0xAA, + // CURRENT RX MODE VALUE 0x09 also see below + 8 << CC1K_VCO_CURRENT | 3 << CC1K_LO_DRIVE, + //0x8C, + // FRONT_END 0x0a + 1 << CC1K_BUF_CURRENT | 2 << CC1K_LNA_CURRENT | 1 << CC1K_IF_RSSI, + //0x32, + // PA_POW 0x0b + 0x8 << CC1K_PA_HIGHPOWER | 0x0 << CC1K_PA_LOWPOWER, + //0xff, + // PLL 0xc + 6 << CC1K_REFDIV, + //0x40, + // LOCK 0xd + 0x1 << CC1K_LOCK_SELECT, + //0x10, + // CAL 0xe + 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE, + //0x26, + // MODEM2 0xf + 1 << CC1K_PEAKDETECT | 33 << CC1K_PEAK_LEVEL_OFFSET, + //0xA1, + // MODEM1 0x10 + 3 << CC1K_MLIMIT | 1 << CC1K_LOCK_AVG_MODE | CC1K_Settling << CC1K_SETTLING | 1 << CC1K_MODEM_RESET_N, + //0x6f, + // MODEM0 0x11 + 5 << CC1K_BAUDRATE | 1 << CC1K_DATA_FORMAT | 1 << CC1K_XOSC_FREQ, + //0x55, + // MATCH 0x12 + 0x1 << CC1K_RX_MATCH | 0x0 << CC1K_TX_MATCH, + // tx current (extra) + 15 << CC1K_VCO_CURRENT | 3 << CC1K_PA_DRIVE, + }, + + // 4 315.178985 MHz channel, 38.4 Kbps data, Manchester Encoding, High Side LO + { // MAIN 0x00 + 0x31, + // FREQ2A,FREQ1A,FREQ0A 0x01-0x03 + 0x45,0x60,0x00, + // FREQ2B,FREQ1B,FREQ0B 0x04-0x06 + 0x45,0x55,0xBB, + // FSEP1, FSEP0 0x07-0x08 + 0X03,0x9C, + // CURRENT RX MODE VALUE 0x09 also see below + 8 << CC1K_VCO_CURRENT | 0 << CC1K_LO_DRIVE, + // FRONT_END 0x0a + 1 << CC1K_IF_RSSI, + // PA_POW 0x0b + 0x0 << CC1K_PA_HIGHPOWER | 0xf << CC1K_PA_LOWPOWER, + // PLL 0x0c + 13 << CC1K_REFDIV, + // LOCK 0x0d + 0xe << CC1K_LOCK_SELECT, + // CAL 0x0e + 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE, + // MODEM2 0x0f + 1 << CC1K_PEAKDETECT | 33 << CC1K_PEAK_LEVEL_OFFSET, + // MODEM1 0x10 + 3 << CC1K_MLIMIT | 1 << CC1K_LOCK_AVG_MODE | CC1K_Settling << CC1K_SETTLING | 1 << CC1K_MODEM_RESET_N, + // MODEM0 0x11 + 5 << CC1K_BAUDRATE | 1 << CC1K_DATA_FORMAT | 0 << CC1K_XOSC_FREQ, + // MATCH 0x12 + 0x7 << CC1K_RX_MATCH | 0x0 << CC1K_TX_MATCH, + // tx current (extra) + 8 << CC1K_VCO_CURRENT | 1 << CC1K_PA_DRIVE, + }, + + // 5 Spare + { // MAIN 0x00 + 0x31, + // FREQ2A,FREQ1A,FREQ0A 0x01-0x03 + 0x58,0x00,0x00, + // FREQ2B,FREQ1B,FREQ0B 0x04-0x06 + 0x57,0xf6,0x85, //XBOW + // FSEP1, FSEP0 0x07-0x08 + 0X03,0x55, + // CURRENT RX MODE VALUE 0x09 also see below + 8 << CC1K_VCO_CURRENT | 4 << CC1K_LO_DRIVE, + // FRONT_END 0x0a + 1 << CC1K_IF_RSSI, + // PA_POW 0x0b + 0x0 << CC1K_PA_HIGHPOWER | 0xf << CC1K_PA_LOWPOWER, + // PLL 0x0c + 12 << CC1K_REFDIV, + // LOCK 0x0d + 0xe << CC1K_LOCK_SELECT, + // CAL 0x0e + 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE, + // MODEM2 0x0f + 1 << CC1K_PEAKDETECT | 33 << CC1K_PEAK_LEVEL_OFFSET, + // MODEM1 0x10 + 3 << CC1K_MLIMIT | 1 << CC1K_LOCK_AVG_MODE | CC1K_Settling << CC1K_SETTLING | 1 << CC1K_MODEM_RESET_N, // MODEM0 0x11 + 5 << CC1K_BAUDRATE | 1 << CC1K_DATA_FORMAT | 1 << CC1K_XOSC_FREQ, + // MATCH 0x12 + 0x7 << CC1K_RX_MATCH | 0x0 << CC1K_TX_MATCH, + // tx current (extra) + 8 << CC1K_VCO_CURRENT | 1 << CC1K_PA_DRIVE, + }, +}; + +#define UQ_CC1000_RSSI "CC1000RssiP.Rssi" + +#endif /* CC1000CONST_H */ diff --git a/tos/chips/cc1000_lpl/CC1000Control.nc b/tos/chips/cc1000_lpl/CC1000Control.nc new file mode 100644 index 00000000..b653e94f --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000Control.nc @@ -0,0 +1,137 @@ +/* $Id$ + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ +/** + * CC1000 internal radio control interface. + * @author Philip Buonadonna + * @aythor Jaein Jeong + */ +interface CC1000Control +{ + /** + * Initialise the radio to its default state. + */ + command void init(); + + /** + * Tune the radio to one of the frequencies available in the CC1K_Params + * table. Calling Tune will allso reset the rfpower and LockVal + * selections to the table values. + * + * @param freq The index into the CC1K_Params table that holds the + * desired preset frequency parameters. + */ + command void tunePreset(uint8_t freq); + + /** + * Tune the radio to a given frequency. Since the CC1000 uses a digital + * frequency synthesizer, it cannot tune to just an arbitrary frequency. + * This routine will determine the closest achievable channel, compute + * the necessary parameters and tune the radio. + * + * @param The desired channel frequency, in Hz. + * + * @return The actual computed channel frequency, in Hz. A return value + * of '0' indicates that no frequency was computed and the radio was not + * tuned. + */ + command uint32_t tuneManual(uint32_t DesiredFreq); + + /** + * Turn the CC1000 off + */ + async command void off(); + + /** + * Shift the CC1000 Radio into transmit mode. + */ + async command void txMode(); + + /** + * Shift the CC1000 Radio in receive mode. + */ + async command void rxMode(); + + /** + * Turn off the bias power on the CC1000 radio, but leave the core and + * crystal oscillator powered. This will result in approximately a 750 + * uA power savings. + */ + async command void coreOn(); + + /** + * Turn the bias power on. This function must be followed by a call to + * either rxMode() or txMode() to place the radio in a recieve/transmit + * state respectively. There is approximately a 200us delay when + * restoring bias power. + */ + async command void biasOn(); + + /** + * Set the transmit RF power value. The input value is simply an + * arbitrary index that is programmed into the CC1000 registers. Consult + * the CC1000 datasheet for the resulting power output/current + * consumption values. + * + * @param power A power index between 1 and 255. + */ + command void setRFPower(uint8_t power); + + /** + * Get the present RF power index. + * + * @return The power index value. + */ + command uint8_t getRFPower(); + + /** + * Select the signal to monitor at the CHP_OUT pin of the CC1000. See + * the CC1000 data sheet for the available signals. + * + * @param LockVal The index of the signal to monitor at the CHP_OUT pin + */ + command void selectLock(uint8_t LockVal); + + /** + * Get the binary value from the CHP_OUT pin. Analog signals cannot be + * read using function. + * + * @return 1 - Pin is high or 0 - Pin is low + */ + command uint8_t getLock(); + + /** + * Returns whether the present frequency set is using high-side LO + * injection or not. This information is used to determine if the data + * from the CC1000 needs to be inverted or not. + * + * @return TRUE if high-side LO injection is being used (i.e. data does NOT need to be inverted + * at the receiver. + */ + command bool getLOStatus(); +} diff --git a/tos/chips/cc1000_lpl/CC1000ControlP.nc b/tos/chips/cc1000_lpl/CC1000ControlP.nc new file mode 100644 index 00000000..cff7a950 --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000ControlP.nc @@ -0,0 +1,385 @@ +/* $Id$ + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ +#include "CC1000Const.h" +#include "Timer.h" + +/** + * This module provides the CONTROL functionality for the Chipcon1000 + * series radio. It exports a custom interface to control CC1000 + * operation. + * + * @author Philip Buonadonna + * @author Jaein Jeong + * @author David Gay + */ +module CC1000ControlP { + provides { + interface CC1000Control; + } + uses { + interface HplCC1000 as CC; + interface BusyWait; + } +} +implementation +{ + uint8_t txCurrent, rxCurrent, power; + + enum { + IF = 150000, + FREQ_MIN = 4194304, + FREQ_MAX = 16751615 + }; + + const_uint32_t fRefTbl[9] = {2457600, + 2106514, + 1843200, + 1638400, + 1474560, + 1340509, + 1228800, + 1134277, + 1053257}; + + const_uint16_t corTbl[9] = {1213, + 1416, + 1618, + 1820, + 2022, + 2224, + 2427, + 2629, + 2831}; + + const_uint16_t fSepTbl[9] = {0x1AA, + 0x1F1, + 0x238, + 0x280, + 0x2C7, + 0x30E, + 0x355, + 0x39C, + 0x3E3}; + + void calibrateNow() { + // start cal + call CC.write(CC1K_CAL, + 1 << CC1K_CAL_START | + 1 << CC1K_CAL_WAIT | + 6 << CC1K_CAL_ITERATE); + while ((call CC.read(CC1K_CAL) & 1 << CC1K_CAL_COMPLETE) == 0) + ; + + //exit cal mode + call CC.write(CC1K_CAL, 1 << CC1K_CAL_WAIT | 6 << CC1K_CAL_ITERATE); + } + + void calibrate() { + call CC.write(CC1K_PA_POW, 0x00); // turn off rf amp + call CC.write(CC1K_TEST4, 0x3f); // chip rate >= 38.4kb + + // RX - configure main freq A + call CC.write(CC1K_MAIN, 1 << CC1K_TX_PD | 1 << CC1K_RESET_N); + + calibrateNow(); + + // TX - configure main freq B + call CC.write(CC1K_MAIN, + 1 << CC1K_RXTX | + 1 << CC1K_F_REG | + 1 << CC1K_RX_PD | + 1 << CC1K_RESET_N); + // Set TX current + call CC.write(CC1K_CURRENT, txCurrent); + call CC.write(CC1K_PA_POW, 0); + + calibrateNow(); + } + + /* + * cc1000ComputeFreq(uint32_t desiredFreq); + * + * Compute an achievable frequency and the necessary CC1K parameters from + * a given desired frequency (Hz). The function returns the actual achieved + * channel frequency in Hz. + * + * This routine assumes the following: + * - Crystal Freq: 14.7456 MHz + * - LO Injection: High + * - Separation: 64 KHz + * - IF: 150 KHz + * + * Approximate costs for this function: + * - ~870 bytes FLASH + * - ~32 bytes RAM + * - 9400 cycles + */ + uint32_t cc1000SetFrequency(uint32_t desiredFreq) { + uint32_t ActualChannel = 0; + uint32_t RXFreq = 0, TXFreq = 0; + int32_t Offset = 0x7fffffff; + uint16_t FSep = 0; + uint8_t RefDiv = 0; + uint8_t i, match, frontend; + + for (i = 0; i < 9; i++) + { + uint32_t NRef = desiredFreq + IF; + uint32_t FRef = read_uint32_t(&fRefTbl[i]); + uint32_t Channel = 0; + uint32_t RXCalc = 0, TXCalc = 0; + int32_t diff; + + NRef = ((desiredFreq + IF) << 2) / FRef; + if (NRef & 0x1) + NRef++; + + if (NRef & 0x2) + { + RXCalc = 16384 >> 1; + Channel = FRef >> 1; + } + + NRef >>= 2; + + RXCalc += (NRef * 16384) - 8192; + if ((RXCalc < FREQ_MIN) || (RXCalc > FREQ_MAX)) + continue; + + TXCalc = RXCalc - read_uint16_t(&corTbl[i]); + if (TXCalc < FREQ_MIN || TXCalc > FREQ_MAX) + continue; + + Channel += NRef * FRef; + Channel -= IF; + + diff = Channel - desiredFreq; + if (diff < 0) + diff = -diff; + + if (diff < Offset) + { + RXFreq = RXCalc; + TXFreq = TXCalc; + ActualChannel = Channel; + FSep = read_uint16_t(&fSepTbl[i]); + RefDiv = i + 6; + Offset = diff; + } + } + + if (RefDiv != 0) + { + call CC.write(CC1K_FREQ_0A, RXFreq); + call CC.write(CC1K_FREQ_1A, RXFreq >> 8); + call CC.write(CC1K_FREQ_2A, RXFreq >> 16); + + call CC.write(CC1K_FREQ_0B, TXFreq); + call CC.write(CC1K_FREQ_1B, TXFreq >> 8); + call CC.write(CC1K_FREQ_2B, TXFreq >> 16); + + call CC.write(CC1K_FSEP0, FSep); + call CC.write(CC1K_FSEP1, FSep >> 8); + + if (ActualChannel < 500000000) + { + if (ActualChannel < 400000000) + { + rxCurrent = 8 << CC1K_VCO_CURRENT | 1 << CC1K_LO_DRIVE; + txCurrent = 9 << CC1K_VCO_CURRENT | 1 << CC1K_PA_DRIVE; + } + else + { + rxCurrent = 4 << CC1K_VCO_CURRENT | 1 << CC1K_LO_DRIVE; + txCurrent = 8 << CC1K_VCO_CURRENT | 1 << CC1K_PA_DRIVE; + } + frontend = 1 << CC1K_IF_RSSI; + match = 7 << CC1K_RX_MATCH; + } + else + { + rxCurrent = 8 << CC1K_VCO_CURRENT | 3 << CC1K_LO_DRIVE; + txCurrent = 15 << CC1K_VCO_CURRENT | 3 << CC1K_PA_DRIVE; + + frontend = + 1 << CC1K_BUF_CURRENT | 2 << CC1K_LNA_CURRENT | + 1 << CC1K_IF_RSSI; + match = 2 << CC1K_RX_MATCH; // datasheet says to use 1... + } + call CC.write(CC1K_CURRENT, rxCurrent); + call CC.write(CC1K_MATCH, match); + call CC.write(CC1K_FRONT_END, frontend); + call CC.write(CC1K_PLL, RefDiv << CC1K_REFDIV); + } + + return ActualChannel; + } + + command void CC1000Control.init() { + call CC.init(); + + // wake up xtal and reset unit + call CC.write(CC1K_MAIN, + 1 << CC1K_RX_PD | 1 << CC1K_TX_PD | + 1 << CC1K_FS_PD | 1 << CC1K_BIAS_PD); + // clear reset. + call CC1000Control.coreOn(); + call BusyWait.wait(2000); + + // Set default parameter values + // POWER: 0dbm (~900MHz), 6dbm (~430MHz) + power = 8 << CC1K_PA_HIGHPOWER | 0 << CC1K_PA_LOWPOWER; + call CC.write(CC1K_PA_POW, power); + + // select Manchester Violation for CHP_OUT + call CC.write(CC1K_LOCK_SELECT, 9 << CC1K_LOCK_SELECT); + + // Default modem values = 19.2 Kbps (38.4 kBaud), Manchester encoded + call CC.write(CC1K_MODEM2, 0); + call CC.write(CC1K_MODEM1, + 3 << CC1K_MLIMIT | + 1 << CC1K_LOCK_AVG_MODE | + 3 << CC1K_SETTLING | + 1 << CC1K_MODEM_RESET_N); + call CC.write(CC1K_MODEM0, + 5 << CC1K_BAUDRATE | + 1 << CC1K_DATA_FORMAT | + 1 << CC1K_XOSC_FREQ); + + call CC.write(CC1K_FSCTRL, 1 << CC1K_FS_RESET_N); + +#ifdef CC1K_DEF_FREQ + call CC1000Control.tuneManual(CC1K_DEF_FREQ); +#else + call CC1000Control.tunePreset(CC1K_DEF_PRESET); +#endif + call CC1000Control.off(); + } + + command void CC1000Control.tunePreset(uint8_t freq) { + int i; + + // FREQA, FREQB, FSEP, CURRENT(RX), FRONT_END, POWER, PLL + for (i = CC1K_FREQ_2A; i <= CC1K_PLL; i++) + call CC.write(i, read_uint8_t(&CC1K_Params[freq][i])); + call CC.write(CC1K_MATCH, read_uint8_t(&CC1K_Params[freq][CC1K_MATCH])); + rxCurrent = read_uint8_t(&CC1K_Params[freq][CC1K_CURRENT]); + txCurrent = read_uint8_t(&CC1K_Params[freq][CC1K_MATCH + 1]); + power = read_uint8_t(&CC1K_Params[freq][CC1K_PA_POW]); + + calibrate(); + } + + command uint32_t CC1000Control.tuneManual(uint32_t DesiredFreq) { + uint32_t actualFreq; + + actualFreq = cc1000SetFrequency(DesiredFreq); + + calibrate(); + + return actualFreq; + } + + async command void CC1000Control.txMode() { + // MAIN register to TX mode + call CC.write(CC1K_MAIN, + 1 << CC1K_RXTX | + 1 << CC1K_F_REG | + 1 << CC1K_RX_PD | + 1 << CC1K_RESET_N); + // Set the TX mode VCO Current + call CC.write(CC1K_CURRENT, txCurrent); + call BusyWait.wait(250); + call CC.write(CC1K_PA_POW, power); + call BusyWait.wait(20); + } + + async command void CC1000Control.rxMode() { + // MAIN register to RX mode + // Powerup Freqency Synthesizer and Receiver + call CC.write(CC1K_CURRENT, rxCurrent); + call CC.write(CC1K_PA_POW, 0); // turn off power amp + call CC.write(CC1K_MAIN, 1 << CC1K_TX_PD | 1 << CC1K_RESET_N); + call BusyWait.wait(125); + } + + async command void CC1000Control.coreOn() { + // MAIN register to SLEEP mode + call CC.write(CC1K_MAIN, + 1 << CC1K_RX_PD | + 1 << CC1K_TX_PD | + 1 << CC1K_FS_PD | + 1 << CC1K_BIAS_PD | + 1 << CC1K_RESET_N); + } + + async command void CC1000Control.biasOn() { + call CC.write(CC1K_MAIN, + 1 << CC1K_RX_PD | + 1 << CC1K_TX_PD | + 1 << CC1K_FS_PD | + 1 << CC1K_RESET_N); + } + + + async command void CC1000Control.off() { + // MAIN register to power down mode. Shut everything off + call CC.write(CC1K_MAIN, + 1 << CC1K_RX_PD | + 1 << CC1K_TX_PD | + 1 << CC1K_FS_PD | + 1 << CC1K_CORE_PD | + 1 << CC1K_BIAS_PD | + 1 << CC1K_RESET_N); + call CC.write(CC1K_PA_POW, 0); // turn off rf amp + } + + command void CC1000Control.setRFPower(uint8_t newPower) { + power = newPower; + } + + command uint8_t CC1000Control.getRFPower() { + return power; + } + + command void CC1000Control.selectLock(uint8_t fn) { + // Select function of CHP_OUT pin (readable via getLock) + call CC.write(CC1K_LOCK, fn << CC1K_LOCK_SELECT); + } + + command uint8_t CC1000Control.getLock() { + return call CC.getLOCK(); + } + + command bool CC1000Control.getLOStatus() { + // We use a high-side LO (local oscillator) frequency -> data will be + // inverted. See cc1000ComputeFreq and CC1000 datasheet p.23. + return TRUE; + } +} diff --git a/tos/chips/cc1000_lpl/CC1000CsmaP.nc b/tos/chips/cc1000_lpl/CC1000CsmaP.nc new file mode 100644 index 00000000..6cb8716c --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000CsmaP.nc @@ -0,0 +1,579 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +#include "message.h" +#include "crc.h" +#include "CC1000Const.h" +#include "Timer.h" + +/** + * A rewrite of the low-power-listening CC1000 radio stack. + * This file contains the CSMA and low-power listening logic. Actual + * packet transmission and reception is in SendReceive. + *

    + * This code has some degree of platform-independence, via the + * CC1000Control, RSSIADC and SpiByteFifo interfaces which must be provided + * by the platform. However, these interfaces may still reflect some + * particularities of the mica2 hardware implementation. + * + * @author Philip Buonadonna + * @author Jaein Jeong + * @author Joe Polastre + * @author David Gay + */ + +module CC1000CsmaP { + provides { + interface Init; + interface SplitControl; + interface CsmaControl; + interface CsmaBackoff; + interface LowPowerListening; + } + uses { + interface Init as ByteRadioInit; + interface StdControl as ByteRadioControl; + interface ByteRadio; + + //interface PowerManagement; + interface CC1000Control; + interface CC1000Squelch; + interface Random; + interface Timer as WakeupTimer; + interface BusyWait; + + interface ReadNow as RssiNoiseFloor; + interface ReadNow as RssiCheckChannel; + interface ReadNow as RssiPulseCheck; + async command void cancelRssi(); + } +} +implementation +{ + enum { + DISABLED_STATE, + IDLE_STATE, + RX_STATE, + TX_STATE, + POWERDOWN_STATE, + PULSECHECK_STATE + }; + + enum { + TIME_AFTER_CHECK = 30, + }; + + uint8_t radioState = DISABLED_STATE; + struct { + uint8_t ccaOff : 1; + uint8_t txPending : 1; + } f; // f for flags + uint8_t count; + uint8_t clearCount; + + int16_t macDelay; + + uint16_t sleepTime; + + uint16_t rssiForSquelch; + + task void setWakeupTask(); + + cc1000_metadata_t *getMetadata(message_t *amsg) { + return (cc1000_metadata_t *)((uint8_t *)amsg->footer + sizeof(cc1000_footer_t)); + } + + void enterIdleState() { + call cancelRssi(); + radioState = IDLE_STATE; + } + + void enterIdleStateSetWakeup() { + enterIdleState(); + post setWakeupTask(); + } + + void enterDisabledState() { + call cancelRssi(); + radioState = DISABLED_STATE; + } + + void enterPowerDownState() { + call cancelRssi(); + radioState = POWERDOWN_STATE; + } + + void enterPulseCheckState() { + radioState = PULSECHECK_STATE; + count = 0; + } + + void enterRxState() { + call cancelRssi(); + radioState = RX_STATE; + } + + void enterTxState() { + radioState = TX_STATE; + } + + /* Basic radio power control */ + + void radioOn() { + call CC1000Control.coreOn(); + call BusyWait.wait(2000); + call CC1000Control.biasOn(); + call BusyWait.wait(200); + atomic call ByteRadio.listen(); + } + + void radioOff() { + call CC1000Control.off(); + call ByteRadio.off(); + } + + void setPreambleLength(message_t *msg); + + /* Initialisation, startup and stopping */ + /*--------------------------------------*/ + + command error_t Init.init() { + call ByteRadioInit.init(); + call CC1000Control.init(); + + return SUCCESS; + } + + task void startStopDone() { + uint8_t s; + + // Save a byte of RAM by sharing start/stopDone task + atomic s = radioState; + if (s == DISABLED_STATE) + signal SplitControl.stopDone(SUCCESS); + else + signal SplitControl.startDone(SUCCESS); + } + + command error_t SplitControl.start() { + atomic + if (radioState == DISABLED_STATE) + { + call ByteRadioControl.start(); + enterIdleStateSetWakeup(); + f.txPending = FALSE; + } + else + return SUCCESS; + + radioOn(); + + post startStopDone(); + + return SUCCESS; + } + + command error_t SplitControl.stop() { + atomic + { + call ByteRadioControl.stop(); + enterDisabledState(); + radioOff(); + } + call WakeupTimer.stop(); + post startStopDone(); + return SUCCESS; + } + + /* Wakeup timer */ + /*-------------*/ + + /* All timer setting code is placed in setWakeup, for consistency. */ + void setWakeup() { + switch (radioState) + { + case IDLE_STATE: + /* Timer already running means that we have a noise floor + measurement scheduled. If we just set a new alarm here, we + might indefinitely delay noise floor measurements if we're, + e,g, transmitting frequently. */ + if (!call WakeupTimer.isRunning()) + if (call CC1000Squelch.settled()) + { + if (sleepTime == 0) + call WakeupTimer.startOneShot(CC1K_SquelchIntervalSlow); + else + // timeout for receiving a message after an lpl check + // indicates channel activity. + call WakeupTimer.startOneShot(TIME_AFTER_CHECK); + } + else + call WakeupTimer.startOneShot(CC1K_SquelchIntervalFast); + break; + case PULSECHECK_STATE: + // Radio warm-up time. + call WakeupTimer.startOneShot(1); + break; + case POWERDOWN_STATE: + // low-power listening check interval + call WakeupTimer.startOneShot(sleepTime); + break; + } + } + + task void setWakeupTask() { + atomic setWakeup(); + } + + event void WakeupTimer.fired() { + atomic + { + switch (radioState) + { + case IDLE_STATE: + /* If we appear to be receiving a packet we don't check the + noise floor. For LPL, this means that going to sleep will + be delayed by another TIME_AFTER_CHECK ms. */ + if (!call ByteRadio.syncing()) + { + call cancelRssi(); + call RssiNoiseFloor.read(); + } + break; + + case POWERDOWN_STATE: + // Turn radio on, wait for 1ms + enterPulseCheckState(); + call CC1000Control.biasOn(); + break; + + case PULSECHECK_STATE: + // Switch to RX mode and get RSSI output + call CC1000Control.rxMode(); + call RssiPulseCheck.read(); + call BusyWait.wait(80); + return; // don't set wakeup timer + } + setWakeup(); + } + } + + /* Low-power listening stuff */ + /*---------------------------*/ + + /* Should we go to sleep, or turn the radio fully on? */ + task void sleepCheck() { + bool turnOn = FALSE; + + atomic + if (f.txPending || !sleepTime) + { + if (radioState == PULSECHECK_STATE || radioState == POWERDOWN_STATE) + { + enterIdleStateSetWakeup(); + turnOn = TRUE; + } + } + else if (call CC1000Squelch.settled() && !call ByteRadio.syncing()) + { + radioOff(); + enterPowerDownState(); + setWakeup(); + } + + if (turnOn) + radioOn(); + } + + task void adjustSquelch(); + + async event void RssiPulseCheck.readDone(error_t result, uint16_t data) { + if (result != SUCCESS) + { + /* Just give up on this interval. */ + post sleepCheck(); + return; + } + + /* We got some RSSI data for our LPL check. Decide whether to: + - go back to sleep (quiet) + - wake up (channel active) + - get more RSSI data + */ + if (data > call CC1000Squelch.get() - (call CC1000Squelch.get() >> 2)) + { + post sleepCheck(); + // don't be too agressive (ignore really quiet thresholds). + if (data < call CC1000Squelch.get() + (call CC1000Squelch.get() >> 3)) + { + // adjust the noise floor level, go back to sleep. + rssiForSquelch = data; + post adjustSquelch(); + } + } + else if (count++ > 5) + { + //go to the idle state since no outliers were found + enterIdleStateSetWakeup(); + call ByteRadio.listen(); + } + else + { + call RssiPulseCheck.read(); + call BusyWait.wait(80); + } + } + + /* CSMA */ + /*------*/ + + event void ByteRadio.rts(message_t *msg) { + atomic + { + f.txPending = TRUE; + + if (radioState == POWERDOWN_STATE) + post sleepCheck(); + if (!f.ccaOff) + macDelay = signal CsmaBackoff.initial(call ByteRadio.getTxMessage()); + else + macDelay = 1; + + setPreambleLength(msg); + } + } + + async event void ByteRadio.sendDone() { + f.txPending = FALSE; + enterIdleStateSetWakeup(); + } + + void congestion() { + macDelay = signal CsmaBackoff.congestion(call ByteRadio.getTxMessage()); + } + + async event void ByteRadio.idleByte(bool preamble) { + if (f.txPending) + { + if (!f.ccaOff && preamble) + congestion(); + else if (macDelay && !--macDelay) + { + call cancelRssi(); + count = 0; + call RssiCheckChannel.read(); + } + } + } + + async event void RssiCheckChannel.readDone(error_t result, uint16_t data) { + if (result != SUCCESS) + { + /* We'll retry the transmission at the next SPI event. */ + atomic macDelay = 1; + return; + } + + count++; + if (data > call CC1000Squelch.get() + CC1K_SquelchBuffer) + clearCount++; + else + clearCount = 0; + + // if the channel is clear or CCA is disabled, GO GO GO! + if (clearCount >= 1 || f.ccaOff) + { + enterTxState(); + call ByteRadio.cts(); + } + else if (count == CC1K_MaxRSSISamples) + congestion(); + else + call RssiCheckChannel.read(); + } + + /* Message being received. We basically just go inactive. */ + /*--------------------------------------------------------*/ + + async event void ByteRadio.rx() { + enterRxState(); + } + + async event void ByteRadio.rxDone() { + if (radioState == RX_STATE) + enterIdleStateSetWakeup(); + } + + /* Noise floor */ + /*-------------*/ + + task void adjustSquelch() { + uint16_t squelchData; + + atomic squelchData = rssiForSquelch; + call CC1000Squelch.adjust(squelchData); + } + + async event void RssiNoiseFloor.readDone(error_t result, uint16_t data) { + if (result != SUCCESS) + { + /* We just ignore failed noise floor measurements */ + post sleepCheck(); + return; + } + + rssiForSquelch = data; + post adjustSquelch(); + post sleepCheck(); + } + + /* Options */ + /*---------*/ + + async command error_t CsmaControl.enableCca() { + atomic f.ccaOff = FALSE; + return SUCCESS; + } + + async command error_t CsmaControl.disableCca() { + atomic f.ccaOff = TRUE; + return SUCCESS; + } + + /* Default MAC backoff parameters */ + /*--------------------------------*/ + + default async event uint16_t CsmaBackoff.initial(message_t *m) { + // initially back off [1,32] bytes (approx 2/3 packet) + return (call Random.rand16() & 0x1F) + 1; + } + + default async event uint16_t CsmaBackoff.congestion(message_t *m) { + return (call Random.rand16() & 0xF) + 1; + } + + /* LowPowerListening setup */ + /* ----------------------- */ + + uint16_t validateSleepInterval(uint16_t sleepIntervalMs) { + if (sleepIntervalMs < CC1K_LPL_MIN_INTERVAL) + return 0; + else if (sleepIntervalMs > CC1K_LPL_MAX_INTERVAL) + return CC1K_LPL_MAX_INTERVAL; + else + return sleepIntervalMs; + } + + uint16_t dutyToSleep(uint16_t dutyCycle) { + /* Scaling factors on CC1K_LPL_CHECK_TIME and dutyCycle are identical */ + uint16_t interval = (1000 * CC1K_LPL_CHECK_TIME) / dutyCycle; + + return interval < CC1K_LPL_MIN_INTERVAL ? 0 : interval; + } + + uint16_t sleepToDuty(uint16_t sleepInterval) { + if (sleepInterval < CC1K_LPL_MIN_INTERVAL) + return 10000; + + /* Scaling factors on CC1K_LPL_CHECK_TIME and dutyCycle are identical */ + return (1000 * CC1K_LPL_CHECK_TIME) / sleepInterval; + } + + command void LowPowerListening.setLocalSleepInterval(uint16_t s) { + sleepTime = validateSleepInterval(s); + } + + command uint16_t LowPowerListening.getLocalSleepInterval() { + return sleepTime; + } + + command void LowPowerListening.setLocalDutyCycle(uint16_t d) { + return call LowPowerListening.setLocalSleepInterval(dutyToSleep(d)); + } + + command uint16_t LowPowerListening.getLocalDutyCycle() { + return sleepToDuty(call LowPowerListening.getLocalSleepInterval()); + } + + command void LowPowerListening.setRxSleepInterval(message_t *msg, uint16_t sleepIntervalMs) { + cc1000_metadata_t *meta = getMetadata(msg); + + meta->strength_or_preamble = -(int16_t)validateSleepInterval(sleepIntervalMs) - 1; + } + + command uint16_t LowPowerListening.getRxSleepInterval(message_t *msg) { + cc1000_metadata_t *meta = getMetadata(msg); + + if (meta->strength_or_preamble >= 0) + return sleepTime; + else + return -(meta->strength_or_preamble + 1); + } + + command void LowPowerListening.setRxDutyCycle(message_t *msg, uint16_t d) { + return call LowPowerListening.setRxSleepInterval(msg, dutyToSleep(d)); + } + + command uint16_t LowPowerListening.getRxDutyCycle(message_t *msg) { + return sleepToDuty(call LowPowerListening.getRxSleepInterval(msg)); + } + + command uint16_t LowPowerListening.dutyCycleToSleepInterval(uint16_t d) { + return dutyToSleep(d); + } + + command uint16_t LowPowerListening.sleepIntervalToDutyCycle(uint16_t s) { + return sleepToDuty(s); + } + + void setPreambleLength(message_t *msg) { + cc1000_metadata_t *meta = getMetadata(msg); + uint16_t s; + uint32_t plen; + + if (meta->strength_or_preamble >= 0) + s = sleepTime; + else + s = -(meta->strength_or_preamble + 1); + meta->strength_or_preamble = 0; /* Destroy setting */ + + if (s == 0) + plen = 6; + else + plen = (((s * 614UL) >> 8) / 6) + 22; + // ~ (s * 2.4)/6 + 22 + // TODO remove the divide. It's there so we still have a long preamble, but + // 6 times shorter than the regular preamble. This will increase + // delivery time while modulating the channel long enough to get detected. + + call ByteRadio.setPreambleLength(plen); + } +} diff --git a/tos/chips/cc1000_lpl/CC1000CsmaRadioC.nc b/tos/chips/cc1000_lpl/CC1000CsmaRadioC.nc new file mode 100644 index 00000000..cadfe497 --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000CsmaRadioC.nc @@ -0,0 +1,115 @@ +/* $Id$ + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/** + * A low-power-listening CC1000 radio stack. + * + * Radio logic is split between Csma (media-access control, low-power + * listening and general control) and SendReceive (packet reception and + * transmission). + * + * CC1000RssiP (RSSI sharing), CC1000SquelchP (noise-floor estimation) + * and CC1000ControlP (radio configuration) provide supporting roles. + * + * This code has some degree of platform-independence, via the HplCC1000, + * RssiAdc and HplCC1000Spi interfaces which must be provided by the + * platform. However, these interfaces may still reflect some + * particularities of the mica2 hardware implementation. + * + * @author Joe Polastre + * @author David Gay + */ + +#include "CC1000Const.h" +#include "message.h" + +configuration CC1000CsmaRadioC { + provides { + interface SplitControl; + interface Send; + interface Receive; + + interface Packet; + interface CsmaControl; + interface CsmaBackoff; + interface RadioTimeStamping; + interface PacketAcknowledgements; + + interface LowPowerListening; + } +} +implementation { + components CC1000CsmaP as Csma; + components CC1000SendReceiveP as SendReceive; + components CC1000RssiP as Rssi; + components CC1000SquelchP as Squelch; + components CC1000ControlP as Control; + components HplCC1000C as Hpl; + components CC1000LowPowerListeningC; + + components MainC, RandomC, new TimerMilliC(), ActiveMessageAddressC, BusyWaitMicroC; + + MainC.SoftwareInit -> Csma; + MainC.SoftwareInit -> Squelch; + + SplitControl = Csma; + Send = SendReceive; + Receive = SendReceive; + Packet = SendReceive; + + CsmaControl = Csma; + CsmaBackoff = Csma; + LowPowerListening = Csma; + RadioTimeStamping = SendReceive; + PacketAcknowledgements = SendReceive; + + Csma.CC1000Control -> Control; + Csma.Random -> RandomC; + Csma.CC1000Squelch -> Squelch; + Csma.WakeupTimer -> TimerMilliC; + Csma.ByteRadio -> SendReceive; + Csma.ByteRadioInit -> SendReceive; + Csma.ByteRadioControl -> SendReceive; + + SendReceive.CC1000Control -> Control; + SendReceive.HplCC1000Spi -> Hpl; + SendReceive.amAddress -> ActiveMessageAddressC; + SendReceive.RssiRx -> Rssi.Rssi[unique(UQ_CC1000_RSSI)]; + + Csma.RssiNoiseFloor -> Rssi.Rssi[unique(UQ_CC1000_RSSI)]; + Csma.RssiCheckChannel -> Rssi.Rssi[unique(UQ_CC1000_RSSI)]; + Csma.RssiPulseCheck -> Rssi.Rssi[unique(UQ_CC1000_RSSI)]; + Csma.cancelRssi -> Rssi; + Csma.BusyWait -> BusyWaitMicroC; + + Rssi.ActualRssi -> Hpl; + Rssi.Resource -> Hpl; + Control.CC -> Hpl; + Control.BusyWait -> BusyWaitMicroC; +} diff --git a/tos/chips/cc1000_lpl/CC1000LowPowerListening.h b/tos/chips/cc1000_lpl/CC1000LowPowerListening.h new file mode 100644 index 00000000..6883ce80 --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000LowPowerListening.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + + /** + * @author David Moss + */ +#ifndef CC1000LOWPOWERLISTENING_H +#define CC1000LOWPOWERLISTENING_H + +/** + * The default duty period is usually 0, which is the equivalent of + * ONE_MESSAGE (below), which tells the node to transmit the message + * one time without expecting receiver duty cycling. + */ +#ifndef DEFAULT_TRANSMIT_PERIOD +#define DEFAULT_TRANSMIT_PERIOD 0 +#endif + +/** + * Value used to indicate the message being sent should be transmitted + * one time + */ +#ifndef ONE_MESSAGE +#define ONE_MESSAGE 0 +#endif + +#endif + diff --git a/tos/chips/cc1000_lpl/CC1000LowPowerListeningC.nc b/tos/chips/cc1000_lpl/CC1000LowPowerListeningC.nc new file mode 100644 index 00000000..f6e296cd --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000LowPowerListeningC.nc @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Low Power Listening for the CC1000 + * @author David Moss + */ + +#include "CC1000LowPowerListening.h" + +configuration CC1000LowPowerListeningC { + provides { + interface Send; + interface Receive; + interface CsmaBackoff[am_id_t amId]; + } +} + +implementation { + components MainC, + CC1000ActiveMessageC, + CC1000LowPowerListeningP, + CC1000CsmaRadioC, + RandomC, + new StateC() as SendStateC, + new StateC() as RadioPowerStateC, + new TimerMilliC() as SendDoneTimerC; + + Send = CC1000LowPowerListeningP; + Receive = CC1000LowPowerListeningP; + CsmaBackoff = CC1000LowPowerListeningP; + + MainC.SoftwareInit -> CC1000LowPowerListeningP; + + CC1000LowPowerListeningP.AMPacket -> CC1000ActiveMessageC; + CC1000LowPowerListeningP.Random -> RandomC; + CC1000LowPowerListeningP.SendState -> SendStateC; + CC1000LowPowerListeningP.RadioPowerState -> RadioPowerStateC; + CC1000LowPowerListeningP.SendDoneTimer -> SendDoneTimerC; + CC1000LowPowerListeningP.SubSend -> CC1000CsmaRadioC; + CC1000LowPowerListeningP.SubReceive -> CC1000CsmaRadioC; + CC1000LowPowerListeningP.SubControl -> CC1000CsmaRadioC; + CC1000LowPowerListeningP.PacketAcknowledgements -> CC1000CsmaRadioC; + CC1000LowPowerListeningP.SubBackoff -> CC1000CsmaRadioC; + CC1000LowPowerListeningP.CsmaControl -> CC1000CsmaRadioC; + CC1000LowPowerListeningP.LowPowerListening -> CC1000CsmaRadioC; + +} + diff --git a/tos/chips/cc1000_lpl/CC1000LowPowerListeningP.nc b/tos/chips/cc1000_lpl/CC1000LowPowerListeningP.nc new file mode 100644 index 00000000..8622da47 --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000LowPowerListeningP.nc @@ -0,0 +1,338 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Low Power Listening for the CC1000 + * + * @author David Moss + */ + +#include "CC1000LowPowerListening.h" + +module CC1000LowPowerListeningP { + provides { + interface Init; + interface Send; + interface Receive; + interface CsmaBackoff[am_id_t amId]; + } + + uses { + interface LowPowerListening; + interface CsmaBackoff as SubBackoff; + interface CsmaControl; + interface Leds; + interface Send as SubSend; + interface Receive as SubReceive; + interface AMPacket; + interface SplitControl as SubControl; + interface PacketAcknowledgements; + interface State as SendState; + interface State as RadioPowerState; + interface Random; + interface Timer as SendDoneTimer; + } +} + +implementation { + + /** The message currently being sent */ + message_t *currentSendMsg; + + /** The length of the current send message */ + uint8_t currentSendLen; + + /** Tx DSN to ensure multiple transmitted messages get across only once */ + uint8_t txDsn; + + /** The last received broadcast DSN. TODO is this the best way? */ + uint8_t lastRxDsn; + + /** TRUE if the first message of the current LPL delivery has been sent */ + norace bool firstMessageSent; + + /** + * Radio State + */ + enum { + S_OFF, + S_ON, + }; + + /** + * Send States + */ + enum { + S_IDLE, + S_SENDING, + }; + + + /***************** Prototypes ***************/ + task void send(); + task void startRadio(); + task void stopRadio(); + + cc1000_header_t *getHeader(message_t *msg); + cc1000_metadata_t *getMetadata(message_t* msg); + uint16_t getActualDutyCycle(uint16_t dutyCycle); + void signalDone(error_t error); + + /***************** Init Commands ***************/ + command error_t Init.init() { + txDsn = call Random.rand16(); + return SUCCESS; + } + + + /***************** SubBackoff Events ****************/ + async event uint16_t SubBackoff.initial(message_t* m) { + if(call SendState.getState() == S_SENDING + && getMetadata(m)->strength_or_preamble > ONE_MESSAGE + && firstMessageSent) { + call CsmaControl.disableCca(); + return 1; + + } else { + return signal CsmaBackoff.initial[getHeader(m)->type](m); + } + } + + async event uint16_t SubBackoff.congestion(message_t* m) { + if(call SendState.getState() == S_SENDING + && getMetadata(m)->strength_or_preamble > ONE_MESSAGE + && firstMessageSent) { + call CsmaControl.disableCca(); + return 1; + + } else { + return signal CsmaBackoff.congestion[getHeader(m)->type](m); + } + } + + /***************** Send Commands ***************/ + /** + * Each call to this send command gives the message a single + * DSN that does not change for every copy of the message + * sent out. For messages that are not acknowledged, such as + * a broadcast address message, the receiving end does not + * signal receive() more than once for that message. + */ + command error_t Send.send(message_t *msg, uint8_t len) { + if(call RadioPowerState.getState() == S_OFF) { + // Everything is off right now, start SplitControl and try again + return EOFF; + } + + if(call SendState.requestState(S_SENDING) == SUCCESS) { + currentSendMsg = msg; + currentSendLen = len; + (getHeader(msg))->dsn = ++txDsn; + + firstMessageSent = FALSE; + if(call LowPowerListening.getRxSleepInterval(currentSendMsg) + > ONE_MESSAGE) { + + // Send it repetitively within our transmit window + call PacketAcknowledgements.requestAck(currentSendMsg); + call SendDoneTimer.startOneShot( + call LowPowerListening.getRxSleepInterval(currentSendMsg) * 2); + } + + // If the radio is off, the CC1000Csma will automatically turn it on + post send(); + return SUCCESS; + } + + return FAIL; + } + + command error_t Send.cancel(message_t *msg) { + if(currentSendMsg == msg) { + call SendState.toIdle(); + return SUCCESS; + } + + return FAIL; + } + + + command uint8_t Send.maxPayloadLength() { + return call SubSend.maxPayloadLength(); + } + + command void *Send.getPayload(message_t* msg) { + return call SubSend.getPayload(msg); + } + + /***************** Receive Commands ***************/ + command void *Receive.getPayload(message_t* msg, uint8_t* len) { + return call SubReceive.getPayload(msg, len); + } + + command uint8_t Receive.payloadLength(message_t* msg) { + return call SubReceive.payloadLength(msg); + } + + + /***************** SubControl Events ***************/ + event void SubControl.startDone(error_t error) { + if(!error) { + call RadioPowerState.forceState(S_ON); + } + } + + event void SubControl.stopDone(error_t error) { + if(!error) { + call RadioPowerState.forceState(S_OFF); + } + } + + /***************** SubSend Events ***************/ + event void SubSend.sendDone(message_t* msg, error_t error) { + if(call SendState.getState() == S_SENDING + && call SendDoneTimer.isRunning()) { + if(call PacketAcknowledgements.wasAcked(msg)) { + signalDone(error); + + } else { + post send(); + } + + return; + } + + signalDone(error); + } + + /***************** SubReceive Events ***************/ + /** + * If the received message is new, we signal the receive event and + * start the off timer. If the last message we received had the same + * DSN as this message, then the chances are pretty good + * that this message should be ignored, especially if the destination address + * as the broadcast address + * + * TODO + * What happens if a unicast Tx doesn't get Rx's ack, and resends that + * message? + */ + event message_t *SubReceive.receive(message_t* msg, void* payload, + uint8_t len) { + + if((getHeader(msg))->dsn == lastRxDsn + && call AMPacket.destination(msg) == AM_BROADCAST_ADDR) { + // Already got this broadcast message. + // TODO should we do something similar with unicast messages? + return msg; + + } else { + lastRxDsn = (getHeader(msg))->dsn; + return signal Receive.receive(msg, payload, len); + } + } + + /***************** Timer Events ****************/ + /** + * When this timer is running, that means we're sending repeating messages + * to a node that is receive check duty cycling. + */ + event void SendDoneTimer.fired() { + if(call SendState.getState() == S_SENDING) { + // The next time SubSend.sendDone is signaled, send is complete. + call SendState.toIdle(); + } + } + + /***************** Tasks ***************/ + task void send() { + if(call SubSend.send(currentSendMsg, currentSendLen) != SUCCESS) { + post send(); + } + } + + task void startRadio() { + if(call SubControl.start() != SUCCESS) { + post startRadio(); + } + } + + task void stopRadio() { + if(call SubControl.stop() != SUCCESS) { + post stopRadio(); + } + } + + /***************** Functions ***************/ + /** + * Check the bounds on a given duty cycle + * We're never over 100%, and we're never at 0% + */ + uint16_t getActualDutyCycle(uint16_t dutyCycle) { + if(dutyCycle > 10000) { + return 10000; + } else if(dutyCycle == 0) { + return 1; + } + + return dutyCycle; + } + + cc1000_header_t *getHeader(message_t *msg) { + return (cc1000_header_t *)(msg->data - sizeof( cc1000_header_t )); + } + + cc1000_metadata_t *getMetadata(message_t* msg) { + return (cc1000_metadata_t*)msg->metadata; + } + + void signalDone(error_t error) { + call CsmaControl.enableCca(); + call SendState.toIdle(); + // TODO check for broadcast destination + signal Send.sendDone(currentSendMsg, error); + currentSendMsg = NULL; + } + + + + /***************** Defaults ****************/ + default async event uint16_t CsmaBackoff.initial[am_id_t amId](message_t *m) { + return ( call Random.rand16() % (0x1F * CC1000_BACKOFF_PERIOD) + + CC1000_MIN_BACKOFF); + } + + default async event uint16_t CsmaBackoff.congestion[am_id_t amId](message_t *m) { + return ( call Random.rand16() % (0x7 * CC1000_BACKOFF_PERIOD) + + CC1000_MIN_BACKOFF); + } +} + diff --git a/tos/chips/cc1000_lpl/CC1000Msg.h b/tos/chips/cc1000_lpl/CC1000Msg.h new file mode 100644 index 00000000..b8061d00 --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000Msg.h @@ -0,0 +1,27 @@ +#ifndef CC1K_RADIO_MSG_H +#define CC1K_RADIO_MSG_H + +#include "AM.h" + +typedef nx_struct CC1KHeader { + nx_am_addr_t dest; + nx_am_addr_t source; + nx_uint8_t length; + nx_am_group_t group; + nx_uint8_t dsn; + nx_am_id_t type; +} cc1000_header_t; + +typedef nx_struct CC1KFooter { + nxle_uint16_t crc; +} cc1000_footer_t; + +typedef nx_struct CC1KMetadata { + nx_int16_t strength_or_preamble; /* negative when used for preamble length */ + nx_uint8_t ack; + nx_uint16_t time; + nx_uint8_t sendSecurityMode; + nx_uint8_t receiveSecurityMode; +} cc1000_metadata_t; + +#endif diff --git a/tos/chips/cc1000_lpl/CC1000RssiP.nc b/tos/chips/cc1000_lpl/CC1000RssiP.nc new file mode 100644 index 00000000..01126abd --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000RssiP.nc @@ -0,0 +1,111 @@ +/* $Id$ + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/** + * RSSI fun. It's used for lots of things, and a request to read it + * for one purpose may have to be discarded if conditions change. For + * example, if we've initiated a noise-floor measure, but start + * receiving a packet, we have to:

      + *
    • cancel the noise-floor measure (we don't know if the value will + * reflect the received packet or the previous idle state) + *
    • start an RSSI measurement so that we can report signal strength + * to the application + *

    + * This module hides the complexities of cancellation from the rest of + * the stack. + */ + +module CC1000RssiP +{ + provides { + interface ReadNow as Rssi[uint8_t reason]; + async command void cancel(); + } + uses { + interface Resource; + interface ReadNow as ActualRssi; + } +} +implementation +{ + enum { + IDLE = unique(UQ_CC1000_RSSI), + CANCELLED = unique(UQ_CC1000_RSSI) + }; + + /* All commands are called within atomic sections */ + uint8_t currentOp = IDLE; + uint8_t nextOp; + + async command void cancel() { + if (currentOp != IDLE) + currentOp = CANCELLED; + } + + event void Resource.granted() { + call ActualRssi.read(); + } + + async command error_t Rssi.read[uint8_t reason]() { + if (currentOp == IDLE) + { + currentOp = reason; + if (call Resource.immediateRequest() == SUCCESS) + call ActualRssi.read(); + else + call Resource.request(); + } + else + nextOp = reason; + return SUCCESS; + } + + void startNextOp() { + currentOp = nextOp; + if (nextOp != IDLE) + { + nextOp = IDLE; + call ActualRssi.read(); + } + else + call Resource.release(); + } + + async event void ActualRssi.readDone(error_t result, uint16_t data) { + atomic + { + /* The code assumes that RSSI measurements are 10-bits + (legacy effect) */ + signal Rssi.readDone[currentOp](result, data >> 6); + startNextOp(); + } + } + + default async event void Rssi.readDone[uint8_t reason](error_t result, uint16_t data) { } +} diff --git a/tos/chips/cc1000_lpl/CC1000SendReceiveP.nc b/tos/chips/cc1000_lpl/CC1000SendReceiveP.nc new file mode 100644 index 00000000..a45ae182 --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000SendReceiveP.nc @@ -0,0 +1,675 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ +#include "message.h" +#include "crc.h" +#include "CC1000Const.h" +#include "Timer.h" + +/** + * A rewrite of the low-power-listening CC1000 radio stack. + * This file contains the send and receive logic for the CC1000 radio. + * It does not do any media-access control. It requests the channel + * via the ready-to-send event (rts) and starts transmission on reception + * of the clear-to-send command (cts). It listens for packets if the + * listen() command is called, and stops listening when off() is called. + *

    + * This code has some degree of platform-independence, via the + * CC1000Control, RSSIADC and SpiByteFifo interfaces which must be provided + * by the platform. However, these interfaces may still reflect some + * particularities of the mica2 hardware implementation. + * + * @author Philip Buonadonna + * @author Jaein Jeong + * @author Joe Polastre + * @author David Gay + */ + +module CC1000SendReceiveP { + provides { + interface Init; + interface StdControl; + interface Send; + interface Receive; + interface RadioTimeStamping; + interface Packet; + interface ByteRadio; + interface PacketAcknowledgements; + } + uses { + //interface PowerManagement; + interface CC1000Control; + interface HplCC1000Spi; + + interface ReadNow as RssiRx; + async command am_addr_t amAddress(); + } +} +implementation +{ + enum { + OFF_STATE, + + INACTIVE_STATE, /* Not listening, but will accept sends */ + + LISTEN_STATE, /* Listening for packets */ + + /* Reception states */ + SYNC_STATE, + RX_STATE, + RECEIVED_STATE, + SENDING_ACK, + + /* Transmission states */ + TXPREAMBLE_STATE, + TXSYNC_STATE, + TXDATA_STATE, + TXCRC_STATE, + TXFLUSH_STATE, + TXWAITFORACK_STATE, + TXREADACK_STATE, + TXDONE_STATE, + }; + + enum { + SYNC_BYTE1 = 0x33, + SYNC_BYTE2 = 0xcc, + SYNC_WORD = SYNC_BYTE1 << 8 | SYNC_BYTE2, + ACK_BYTE1 = 0xba, + ACK_BYTE2 = 0x83, + ACK_WORD = ACK_BYTE1 << 8 | ACK_BYTE2, + ACK_LENGTH = 16, + MAX_ACK_WAIT = 18 + }; + + uint8_t radioState; + struct { + uint8_t ack : 1; /* acks enabled? */ + uint8_t txBusy : 1; /* send pending? */ + uint8_t invert : 1; /* data inverted? (see cc1000 datasheet) */ + uint8_t rxBitOffset : 3; /* bit-offset of received bytes */ + } f; // f for flags + uint16_t count; + uint16_t runningCrc; + + uint16_t rxShiftBuf; + message_t rxBuf; + message_t *rxBufPtr = &rxBuf; + + uint16_t preambleLength; + message_t *txBufPtr; + uint8_t nextTxByte; + + const_uint8_t ackCode[5] = { 0xab, ACK_BYTE1, ACK_BYTE2, 0xaa, 0xaa }; + + /* Packet structure accessor functions. Note that everything is + * relative to the data field. */ + cc1000_header_t *getHeader(message_t *amsg) { + return (cc1000_header_t *)(amsg->data - sizeof(cc1000_header_t)); + } + + cc1000_footer_t *getFooter(message_t *amsg) { + return (cc1000_footer_t *)(amsg->footer); + } + + cc1000_metadata_t *getMetadata(message_t *amsg) { + return (cc1000_metadata_t *)((uint8_t *)amsg->footer + sizeof(cc1000_footer_t)); + } + + /* State transition functions */ + /*----------------------------*/ + + void enterOffState() { + radioState = OFF_STATE; + } + + void enterInactiveState() { + radioState = INACTIVE_STATE; + } + + void enterListenState() { + radioState = LISTEN_STATE; + count = 0; + } + + void enterSyncState() { + radioState = SYNC_STATE; + count = 0; + rxShiftBuf = 0; + } + + void enterRxState() { + cc1000_header_t *header = getHeader(rxBufPtr); + radioState = RX_STATE; + header->length = sizeof rxBufPtr->data; + count = sizeof(message_header_t) - sizeof(cc1000_header_t); + runningCrc = 0; + } + + void enterReceivedState() { + radioState = RECEIVED_STATE; + } + + void enterAckState() { + radioState = SENDING_ACK; + count = 0; + } + + void enterTxPreambleState() { + radioState = TXPREAMBLE_STATE; + count = 0; + runningCrc = 0; + nextTxByte = 0xaa; + } + + void enterTxSyncState() { + radioState = TXSYNC_STATE; + } + + void enterTxDataState() { + radioState = TXDATA_STATE; + // The count increment happens before the first byte is read from the + // packet, so we subtract one from the real packet start point to + // compensate. + count = (sizeof(message_header_t) - sizeof(cc1000_header_t)) -1; + } + + void enterTxCrcState() { + radioState = TXCRC_STATE; + } + + void enterTxFlushState() { + radioState = TXFLUSH_STATE; + count = 0; + } + + void enterTxWaitForAckState() { + radioState = TXWAITFORACK_STATE; + count = 0; + } + + void enterTxReadAckState() { + radioState = TXREADACK_STATE; + rxShiftBuf = 0; + count = 0; + } + + void enterTxDoneState() { + radioState = TXDONE_STATE; + } + + command error_t Init.init() { + f.ack = TRUE; /* We always ack, for now at least */ + call HplCC1000Spi.initSlave(); + return SUCCESS; + } + + command error_t StdControl.start() { + atomic + { + enterInactiveState(); + f.txBusy = FALSE; + f.invert = call CC1000Control.getLOStatus(); + } + return SUCCESS; + } + + command error_t StdControl.stop() { + atomic enterOffState(); + return SUCCESS; + } + + /* Send side. Outside requests, SPI handlers for each state */ + /*----------------------------------------------------------*/ + + command error_t Send.send(message_t *msg, uint8_t len) { + atomic + { + if (f.txBusy || radioState == OFF_STATE) + return FAIL; + else { + cc1000_header_t *header = getHeader(msg); + + f.txBusy = TRUE; + header->length = len; + txBufPtr = msg; + } + } + signal ByteRadio.rts(msg); + + return SUCCESS; + } + + async command void ByteRadio.cts() { + /* We're set to go! Start with our exciting preamble... */ + enterTxPreambleState(); + call HplCC1000Spi.writeByte(0xaa); + call CC1000Control.txMode(); + call HplCC1000Spi.txMode(); + } + + command error_t Send.cancel(message_t *msg) { + /* We simply ignore cancellations. */ + return FAIL; + } + + void sendNextByte() { + call HplCC1000Spi.writeByte(nextTxByte); + count++; + } + + void txPreamble() { + sendNextByte(); + if (count >= preambleLength) + { + nextTxByte = SYNC_BYTE1; + enterTxSyncState(); + } + } + + void txSync() { + sendNextByte(); + nextTxByte = SYNC_BYTE2; + enterTxDataState(); + signal RadioTimeStamping.transmittedSFD(0, txBufPtr); + } + + void txData() { + cc1000_header_t *txHeader = getHeader(txBufPtr); + sendNextByte(); + + if (count < txHeader->length + sizeof(message_header_t)) + { + nextTxByte = ((uint8_t *)txBufPtr)[count]; + runningCrc = crcByte(runningCrc, nextTxByte); + } + else + { + nextTxByte = runningCrc; + enterTxCrcState(); + } + } + + void txCrc() { + sendNextByte(); + nextTxByte = runningCrc >> 8; + enterTxFlushState(); + } + + void txFlush() { + sendNextByte(); + if (count > 3) + if (f.ack) + enterTxWaitForAckState(); + else + { + call HplCC1000Spi.rxMode(); + call CC1000Control.rxMode(); + enterTxDoneState(); + } + } + + void txWaitForAck() { + sendNextByte(); + if (count == 1) + { + call HplCC1000Spi.rxMode(); + call CC1000Control.rxMode(); + } + else if (count > 3) + enterTxReadAckState(); + } + + void txReadAck(uint8_t in) { + uint8_t i; + + sendNextByte(); + + for (i = 0; i < 8; i ++) + { + rxShiftBuf <<= 1; + if (in & 0x80) + rxShiftBuf |= 0x1; + in <<= 1; + + if (rxShiftBuf == ACK_WORD) + { + getMetadata(txBufPtr)->ack = 1; + enterTxDoneState(); + return; + } + } + if (count >= MAX_ACK_WAIT) + { + getMetadata(txBufPtr)->ack = 0; + enterTxDoneState(); + } + } + + task void signalPacketSent() { + message_t *pBuf; + + atomic + { + pBuf = txBufPtr; + f.txBusy = FALSE; + enterListenState(); + } + signal Send.sendDone(pBuf, SUCCESS); + } + + void txDone() { + post signalPacketSent(); + signal ByteRadio.sendDone(); + } + + /* Receive */ + /*---------*/ + + void packetReceived(); + void packetReceiveDone(); + + async command void ByteRadio.listen() { + enterListenState(); + call CC1000Control.rxMode(); + call HplCC1000Spi.rxMode(); + call HplCC1000Spi.enableIntr(); + } + + async command void ByteRadio.off() { + enterInactiveState(); + call HplCC1000Spi.disableIntr(); + } + + void listenData(uint8_t in) { + bool preamble = in == 0xaa || in == 0x55; + + // Look for enough preamble bytes + if (preamble) + { + count++; + if (count > CC1K_ValidPrecursor) + enterSyncState(); + } + else + count = 0; + + signal ByteRadio.idleByte(preamble); + } + + void syncData(uint8_t in) { + // draw in the preamble bytes and look for a sync byte + // save the data in a short with last byte received as msbyte + // and current byte received as the lsbyte. + // use a bit shift compare to find the byte boundary for the sync byte + // retain the shift value and use it to collect all of the packet data + // check for data inversion, and restore proper polarity + // XXX-PB: Don't do this. + + if (in == 0xaa || in == 0x55) + // It is actually possible to have the LAST BIT of the incoming + // data be part of the Sync Byte. SO, we need to store that + // However, the next byte should definitely not have this pattern. + // XXX-PB: Do we need to check for excessive preamble? + rxShiftBuf = in << 8; + else if (count++ == 0) + rxShiftBuf |= in; + else if (count <= 6) + { + // TODO: Modify to be tolerant of bad bits in the preamble... + uint16_t tmp; + uint8_t i; + + // bit shift the data in with previous sample to find sync + tmp = rxShiftBuf; + rxShiftBuf = rxShiftBuf << 8 | in; + + for(i = 0; i < 8; i++) + { + tmp <<= 1; + if (in & 0x80) + tmp |= 0x1; + in <<= 1; + // check for sync bytes + if (tmp == SYNC_WORD) + { + enterRxState(); + signal ByteRadio.rx(); + f.rxBitOffset = 7 - i; + signal RadioTimeStamping.receivedSFD(0); + call RssiRx.read(); + } + } + } + else // We didn't find it after a reasonable number of tries, so.... + enterListenState(); + } + + async event void RssiRx.readDone(error_t result, uint16_t data) { + cc1000_metadata_t *rxMetadata = getMetadata(rxBufPtr); + + if (result != SUCCESS) + rxMetadata->strength_or_preamble = 0; + else + rxMetadata->strength_or_preamble = data; + } + + void rxData(uint8_t in) { + uint8_t nextByte; + cc1000_header_t *rxHeader = getHeader(rxBufPtr); + uint8_t rxLength = rxHeader->length; + + // Reject invalid length packets + if (rxLength > TOSH_DATA_LENGTH) + { + // The packet's screwed up, so just dump it + enterListenState(); + signal ByteRadio.rxDone(); + return; + } + + rxShiftBuf = rxShiftBuf << 8 | in; + nextByte = rxShiftBuf >> f.rxBitOffset; + ((uint8_t *)rxBufPtr)[count++] = nextByte; + + // Adjust rxLength to correspond to the corresponding offset in message_t + rxLength += offsetof(message_t, data); + if (count <= rxLength) + runningCrc = crcByte(runningCrc, nextByte); + + // Jump to CRC when we reach the end of data + if (count == rxLength) { + count = offsetof(message_t, footer) + offsetof(cc1000_footer_t, crc); + } + + if (count == (offsetof(message_t, footer) + sizeof(cc1000_footer_t))) + packetReceived(); + } + + void packetReceived() { + cc1000_footer_t *rxFooter = getFooter(rxBufPtr); + cc1000_header_t *rxHeader = getHeader(rxBufPtr); + // Packet filtering based on bad CRC's is done at higher layers. + // So sayeth the TOS weenies. + rxFooter->crc = (rxFooter->crc == runningCrc); + + if (f.ack && + rxFooter->crc && + rxHeader->dest == call amAddress()) + { + enterAckState(); + call CC1000Control.txMode(); + call HplCC1000Spi.txMode(); + call HplCC1000Spi.writeByte(0xaa); + } + else + packetReceiveDone(); + } + + void ackData(uint8_t in) { + if (++count >= ACK_LENGTH) + { + call CC1000Control.rxMode(); + call HplCC1000Spi.rxMode(); + packetReceiveDone(); + } + else if (count >= ACK_LENGTH - sizeof ackCode) + call HplCC1000Spi.writeByte(read_uint8_t(&ackCode[count + sizeof ackCode - ACK_LENGTH])); + } + + task void signalPacketReceived() { + message_t *pBuf; + cc1000_header_t *pHeader; + atomic + { + if (radioState != RECEIVED_STATE) + return; + + pBuf = rxBufPtr; + } + pHeader = getHeader(pBuf); + pBuf = signal Receive.receive(pBuf, pBuf->data, pHeader->length); + atomic + { + if (pBuf) + rxBufPtr = pBuf; + if (radioState == RECEIVED_STATE) // receiver might've done something + enterListenState(); + signal ByteRadio.rxDone(); + } + } + + void packetReceiveDone() { + post signalPacketReceived(); + enterReceivedState(); + } + + async event void HplCC1000Spi.dataReady(uint8_t data) { + if (f.invert) + data = ~data; + + switch (radioState) + { + default: break; + case TXPREAMBLE_STATE: txPreamble(); break; + case TXSYNC_STATE: txSync(); break; + case TXDATA_STATE: txData(); break; + case TXCRC_STATE: txCrc(); break; + case TXFLUSH_STATE: txFlush(); break; + case TXWAITFORACK_STATE: txWaitForAck(); break; + case TXREADACK_STATE: txReadAck(data); break; + case TXDONE_STATE: txDone(); break; + + case LISTEN_STATE: listenData(data); break; + case SYNC_STATE: syncData(data); break; + case RX_STATE: rxData(data); break; + case SENDING_ACK: ackData(data); break; + } + } + + /* Interaction with rest of stack */ + /*--------------------------------*/ + + async command void ByteRadio.setPreambleLength(uint16_t bytes) { + atomic preambleLength = bytes; + } + + async command uint16_t ByteRadio.getPreambleLength() { + atomic return preambleLength; + } + + async command message_t *ByteRadio.getTxMessage() { + return txBufPtr; + } + + async command bool ByteRadio.syncing() { + return radioState == SYNC_STATE; + } + + /* Abstract packet layout */ + + command void Packet.clear(message_t *msg) { + memset(msg, 0, sizeof(message_t)); + } + + command uint8_t Packet.payloadLength(message_t *msg) { + cc1000_header_t *header = getHeader(msg); + return header->length; + } + + command void Packet.setPayloadLength(message_t *msg, uint8_t len) { + getHeader(msg)->length = len; + } + + command uint8_t Packet.maxPayloadLength() { + return TOSH_DATA_LENGTH; + } + + command void* Packet.getPayload(message_t *msg, uint8_t *len) { + if (len != NULL) { + cc1000_header_t *header = getHeader(msg); + + *len = header->length; + } + return (void*)msg->data; + } + + async command error_t PacketAcknowledgements.requestAck(message_t *msg) { + return SUCCESS; /* We always ack. */ + } + + async command error_t PacketAcknowledgements.noAck(message_t *msg) { + return FAIL; /* We always ack */ + } + + command void* Receive.getPayload(message_t *m, uint8_t *len) { + return call Packet.getPayload(m, len); + } + + command uint8_t Receive.payloadLength(message_t *m) { + return call Packet.payloadLength(m); + } + + command uint8_t Send.maxPayloadLength() { + return call Packet.maxPayloadLength(); + } + + command void* Send.getPayload(message_t *m) { + return call Packet.getPayload(m, NULL); + } + + async command bool PacketAcknowledgements.wasAcked(message_t *msg) { + return getMetadata(msg)->ack; + } + // Default events for radio send/receive coordinators do nothing. + // Be very careful using these, or you'll break the stack. + default async event void RadioTimeStamping.transmittedSFD(uint16_t time, message_t *msgBuff) { } + default async event void RadioTimeStamping.receivedSFD(uint16_t time) { } +} diff --git a/tos/chips/cc1000_lpl/CC1000Squelch.nc b/tos/chips/cc1000_lpl/CC1000Squelch.nc new file mode 100644 index 00000000..97e48387 --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000Squelch.nc @@ -0,0 +1,54 @@ +/* $Id$ + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +/** + * CC1000 internal noise floor (aka squelch value) interface + * @author David Gay + */ +interface CC1000Squelch +{ + /** + * Adjust noise floor based on new noise measurement + * @param data noise measurement + */ + command void adjust(uint16_t data); + + /** + * Return current estimated noise floor + * @return Noise floor value + */ + async command uint16_t get(); + + /** + * Check if noise floor estimate is considered stable (typically after + * some number of measurements) + * @return TRUE if noise floor estimate considered stable, FALSE otherwise + */ + command bool settled(); +} diff --git a/tos/chips/cc1000_lpl/CC1000SquelchP.nc b/tos/chips/cc1000_lpl/CC1000SquelchP.nc new file mode 100644 index 00000000..8b8ec02a --- /dev/null +++ b/tos/chips/cc1000_lpl/CC1000SquelchP.nc @@ -0,0 +1,98 @@ +/* $Id$ + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2005 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ +#include "CC1000Const.h" + +/** + * Clear threshold estimation based on RSSI measurements. + * + * @author Philip Buonadonna + * @author Jaein Jeong + * @author Joe Polastre + * @author David Gay + */ + +module CC1000SquelchP +{ + provides { + interface Init; + interface CC1000Squelch; + } +} +implementation +{ + uint16_t clearThreshold = CC1K_SquelchInit; + uint16_t squelchTable[CC1K_SquelchTableSize]; + uint8_t squelchIndex, squelchCount; + + command error_t Init.init() { + uint8_t i; + + for (i = 0; i < CC1K_SquelchTableSize; i++) + squelchTable[i] = CC1K_SquelchInit; + + return SUCCESS; + } + + command void CC1000Squelch.adjust(uint16_t data) { + uint16_t squelchTab[CC1K_SquelchTableSize]; + uint8_t i, j, min; + uint32_t newThreshold; + + squelchTable[squelchIndex++] = data; + if (squelchIndex >= CC1K_SquelchTableSize) + squelchIndex = 0; + if (squelchCount <= CC1K_SquelchCount) + squelchCount++; + + // Find 3rd highest (aka lowest signal strength) value + memcpy(squelchTab, squelchTable, sizeof squelchTable); + for (j = 0; ; j++) + { + min = 0; + for (i = 1; i < CC1K_SquelchTableSize; i++) + if (squelchTab[i] > squelchTab[min]) + min = i; + if (j == 3) + break; + squelchTab[min] = 0; + } + + newThreshold = ((uint32_t)clearThreshold << 5) + + ((uint32_t)squelchTab[min] << 1); + atomic clearThreshold = newThreshold / 34; + } + + async command uint16_t CC1000Squelch.get() { + return clearThreshold; + } + + command bool CC1000Squelch.settled() { + return squelchCount > CC1K_SquelchCount; + } +} diff --git a/tos/chips/cc1000_lpl/CsmaControl.nc b/tos/chips/cc1000_lpl/CsmaControl.nc new file mode 100644 index 00000000..75c71344 --- /dev/null +++ b/tos/chips/cc1000_lpl/CsmaControl.nc @@ -0,0 +1,41 @@ +/* tab:4 + * "Copyright (c) 2000-2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ +/** + * Interface for activating/deactivating congestion control. + * + * @author Philip Levis + * @author Joe Polastre + * @date August 31 2005 + */ +interface CsmaControl { + /** + * Enable congestion control. + * @return SUCCESS if congestion control enabled, FAIL otherwise. + */ + async command error_t enableCca(); + + /** + * Disable congestion control. + * @return SUCCESS if congestion control disabled, FAIL otherwise. + */ + async command error_t disableCca(); +} diff --git a/tos/chips/cc1000_lpl/HplCC1000.nc b/tos/chips/cc1000_lpl/HplCC1000.nc new file mode 100644 index 00000000..390d7237 --- /dev/null +++ b/tos/chips/cc1000_lpl/HplCC1000.nc @@ -0,0 +1,73 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2003 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ +/* + * Authors: Jason Hill, David Gay, Philip Levis + * Date last modified: 6/25/02 + * + * + */ + +/** + * Low-level CC1000 radio-access operations that must be provided by a + * platform wishing to use this CC1000 implementation. + * + * @author Jason Hill + * @author David Gay + * @author Philip Levis + */ + + +interface HplCC1000 { + /** + * Initialize CC1K pins + */ + command void init(); + + /** + * Write a value to a CC1000 register. + * @param addr Which CC1000 register + * @param data Value to write + */ + async command void write(uint8_t addr, uint8_t data); + + /** + * Read a value from a CC1000 register. + * @param addr Which CC1000 register + * @return Value of register + */ + async command uint8_t read(uint8_t addr); + + /** + * Read the state of the CHP_OUT pin + * @return State of CHP_OUT as a boolean (TRUE for high) + */ + async command bool getLOCK(); +} diff --git a/tos/chips/cc1000_lpl/HplCC1000Spi.nc b/tos/chips/cc1000_lpl/HplCC1000Spi.nc new file mode 100644 index 00000000..42abf370 --- /dev/null +++ b/tos/chips/cc1000_lpl/HplCC1000Spi.nc @@ -0,0 +1,93 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2003 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ +/** + * Interface to the CC1000 chip's serial bus. This isn't really an SPI, + * but the mica2 interface was done using the Atmega128 SPI hardware. Hence + * the name. + * + * @author Jaein Jeong + * @author Philip buonadonna + */ +interface HplCC1000Spi +{ + /** + * Write a byte to the CC1000 bus. + * @param data Byte to write. + */ + async command void writeByte(uint8_t data); + + /** + * Is write buffer busy with the last transmission? + * @return TRUE if the buffer is busy, FALSE otherwise. + */ + async command bool isBufBusy(); + + /** + * Get the last byte received from the CC1000 bus. + * @return Last byte received. + */ + async command uint8_t readByte(); + + /** + * Enable dataReady events on every byte sent or received from the CC1000 + * bus. After this is called, dataReady events will be signaled every + * 8 CC1000 data clocks. + */ + async command void enableIntr(); + + /** + * Disable CC1000 bus interrupts. + */ + async command void disableIntr(); + + /** + * Initialise the interface to the CC1000 bus. + */ + async command void initSlave(); + + /** + * Switch the interface to the CC1000 bus "transmit" mode. + */ + async command void txMode(); + + /** + * Switch the interface to the CC1000 bus to "receive" mode. + */ + async command void rxMode(); + + /** + * If enableIntr() is called, this event will be signaled every 8 CC1000 + * data clocks. + * @param data In "receive" mode, the last value received from the CC1000 + * bus. + */ + async event void dataReady(uint8_t data); +} diff --git a/tos/chips/cc1000_lpl/LowPowerListening.nc b/tos/chips/cc1000_lpl/LowPowerListening.nc new file mode 100644 index 00000000..8bd970fe --- /dev/null +++ b/tos/chips/cc1000_lpl/LowPowerListening.nc @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Low Power Listening interface + * + * @author David Moss + * @author Jonathan Hui + */ + +interface LowPowerListening { + + /** + * Set this this node's radio sleep interval, in milliseconds. + * Once every interval, the node will sleep and perform an Rx check + * on the radio. Setting the sleep interval to 0 will keep the radio + * always on. + * + * This is the equivalent of setting the local duty cycle rate. + * + * @param sleepIntervalMs the length of this node's Rx check interval, in [ms] + */ + command void setLocalSleepInterval(uint16_t sleepIntervalMs); + + /** + * @return the local node's sleep interval, in [ms] + */ + command uint16_t getLocalSleepInterval(); + + /** + * Set this node's radio duty cycle rate, in units of [percentage*100]. + * For example, to get a 0.05% duty cycle, + * + * call LowPowerListening.setDutyCycle(5); // or equivalently... + * call LowPowerListening.setDutyCycle(00005); // for better readability? + * + * + * For a 100% duty cycle (always on), + * + * call LowPowerListening.setDutyCycle(10000); + * + * + * This is the equivalent of setting the local sleep interval explicitly. + * + * @param dutyCycle The duty cycle percentage, in units of [percentage*100] + */ + command void setLocalDutyCycle(uint16_t dutyCycle); + + /** + * @return this node's radio duty cycle rate, in units of [percentage*100] + */ + command uint16_t getLocalDutyCycle(); + + + /** + * Configure this outgoing message so it can be transmitted to a neighbor mote + * with the specified Rx sleep interval. + * @param msg Pointer to the message that will be sent + * @param sleepInterval The receiving node's sleep interval, in [ms] + */ + command void setRxSleepInterval(message_t *msg, uint16_t sleepIntervalMs); + + /** + * @return the destination node's sleep interval configured in this message + */ + command uint16_t getRxSleepInterval(message_t *msg); + + /** + * Configure this outgoing message so it can be transmitted to a neighbor mote + * with the specified Rx duty cycle rate. + * Duty cycle is in units of [percentage*100], i.e. 0.25% duty cycle = 25. + * + * @param msg Pointer to the message that will be sent + * @param dutyCycle The duty cycle of the receiving mote, in units of + * [percentage*100] + */ + command void setRxDutyCycle(message_t *msg, uint16_t dutyCycle); + + /** + * @return the destination node's duty cycle configured in this message + * in units of [percentage*100] + */ + command uint16_t getRxDutyCycle(message_t *msg); + + /** + * Convert a duty cycle, in units of [percentage*100], to + * the sleep interval of the mote in milliseconds + * @param dutyCycle The duty cycle in units of [percentage*100] + * @return The equivalent sleep interval, in units of [ms] + */ + command uint16_t dutyCycleToSleepInterval(uint16_t dutyCycle); + + /** + * Convert a sleep interval, in units of [ms], to a duty cycle + * in units of [percentage*100] + * @param sleepInterval The sleep interval in units of [ms] + * @return The duty cycle in units of [percentage*100] + */ + command uint16_t sleepIntervalToDutyCycle(uint16_t sleepInterval); + +} diff --git a/tos/chips/cc2420_lpl/AlarmMultiplexC.nc b/tos/chips/cc2420_lpl/AlarmMultiplexC.nc new file mode 100644 index 00000000..38a54b26 --- /dev/null +++ b/tos/chips/cc2420_lpl/AlarmMultiplexC.nc @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * A component that multiplexes the use of an alarm. The assumption is + * that its use is mutually exclusive and users check whether the + * events are for them. + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include + +configuration AlarmMultiplexC { + + provides interface Init; + provides interface Alarm as Alarm32khz32; + +} + +implementation { + + components new HplCC2420AlarmC() as Alarm; + + Init = Alarm; + Alarm32khz32 = Alarm; + +} diff --git a/tos/chips/cc2420_lpl/CC2420.h b/tos/chips/cc2420_lpl/CC2420.h new file mode 100644 index 00000000..6b0847ad --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420.h @@ -0,0 +1,321 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#ifndef __CC2420_H__ +#define __CC2420_H__ + +//#include "message.h" + +typedef uint8_t cc2420_status_t; + +typedef nx_struct cc2420_header_t { + nxle_uint8_t length; + nxle_uint16_t fcf; + nxle_uint8_t dsn; + nxle_uint16_t destpan; + nxle_uint16_t dest; + nxle_uint16_t src; + nxle_uint8_t type; +} cc2420_header_t; + +typedef nx_struct cc2420_footer_t { +} cc2420_footer_t; + +typedef nx_struct cc2420_metadata_t { + nx_uint8_t tx_power; + nx_uint8_t rssi; + nx_uint8_t lqi; + nx_bool crc; + nx_bool ack; + nx_uint16_t time; + nx_uint16_t rxInterval; +} cc2420_metadata_t; + +typedef nx_struct cc2420_packet_t { + cc2420_header_t packet; + nx_uint8_t data[]; +} cc2420_packet_t; + +#ifndef TOSH_DATA_LENGTH +#define TOSH_DATA_LENGTH 28 +#endif + +#ifndef CC2420_DEF_CHANNEL +#define CC2420_DEF_CHANNEL 26 +#endif + +#ifndef CC2420_DEF_RFPOWER +#define CC2420_DEF_RFPOWER 31 +#endif + +enum { + // size of the header not including the length byte + MAC_HEADER_SIZE = sizeof( cc2420_header_t ) - 1, + // size of the footer (FCS field) + MAC_FOOTER_SIZE = sizeof( uint16_t ), + // MDU + MAC_PACKET_SIZE = MAC_HEADER_SIZE + TOSH_DATA_LENGTH + MAC_FOOTER_SIZE, +}; + +enum cc2420_enums { + CC2420_TIME_ACK_TURNAROUND = 7, // jiffies + CC2420_TIME_VREN = 20, // jiffies + CC2420_TIME_SYMBOL = 2, // 2 symbols / jiffy + CC2420_BACKOFF_PERIOD = ( 20 / CC2420_TIME_SYMBOL ), // symbols + CC2420_MIN_BACKOFF = ( 20 / CC2420_TIME_SYMBOL ), // platform specific? + CC2420_ACK_WAIT_DELAY = 128, // jiffies +}; + +enum cc2420_status_enums { + CC2420_STATUS_RSSI_VALID = 1 << 1, + CC2420_STATUS_LOCK = 1 << 2, + CC2420_STATUS_TX_ACTIVE = 1 << 3, + CC2420_STATUS_ENC_BUSY = 1 << 4, + CC2420_STATUS_TX_UNDERFLOW = 1 << 5, + CC2420_STATUS_XOSC16M_STABLE = 1 << 6, +}; + +enum cc2420_config_reg_enums { + CC2420_SNOP = 0x00, + CC2420_SXOSCON = 0x01, + CC2420_STXCAL = 0x02, + CC2420_SRXON = 0x03, + CC2420_STXON = 0x04, + CC2420_STXONCCA = 0x05, + CC2420_SRFOFF = 0x06, + CC2420_SXOSCOFF = 0x07, + CC2420_SFLUSHRX = 0x08, + CC2420_SFLUSHTX = 0x09, + CC2420_SACK = 0x0a, + CC2420_SACKPEND = 0x0b, + CC2420_SRXDEC = 0x0c, + CC2420_SRXENC = 0x0d, + CC2420_SAES = 0x0e, + CC2420_MAIN = 0x10, + CC2420_MDMCTRL0 = 0x11, + CC2420_MDMCTRL1 = 0x12, + CC2420_RSSI = 0x13, + CC2420_SYNCWORD = 0x14, + CC2420_TXCTRL = 0x15, + CC2420_RXCTRL0 = 0x16, + CC2420_RXCTRL1 = 0x17, + CC2420_FSCTRL = 0x18, + CC2420_SECCTRL0 = 0x19, + CC2420_SECCTRL1 = 0x1a, + CC2420_BATTMON = 0x1b, + CC2420_IOCFG0 = 0x1c, + CC2420_IOCFG1 = 0x1d, + CC2420_MANFIDL = 0x1e, + CC2420_MANFIDH = 0x1f, + CC2420_FSMTC = 0x20, + CC2420_MANAND = 0x21, + CC2420_MANOR = 0x22, + CC2420_AGCCTRL = 0x23, + CC2420_AGCTST0 = 0x24, + CC2420_AGCTST1 = 0x25, + CC2420_AGCTST2 = 0x26, + CC2420_FSTST0 = 0x27, + CC2420_FSTST1 = 0x28, + CC2420_FSTST2 = 0x29, + CC2420_FSTST3 = 0x2a, + CC2420_RXBPFTST = 0x2b, + CC2420_FMSTATE = 0x2c, + CC2420_ADCTST = 0x2d, + CC2420_DACTST = 0x2e, + CC2420_TOPTST = 0x2f, + CC2420_TXFIFO = 0x3e, + CC2420_RXFIFO = 0x3f, +}; + +enum cc2420_ram_addr_enums { + CC2420_RAM_TXFIFO = 0x000, + CC2420_RAM_RXFIFO = 0x080, + CC2420_RAM_KEY0 = 0x100, + CC2420_RAM_RXNONCE = 0x110, + CC2420_RAM_SABUF = 0x120, + CC2420_RAM_KEY1 = 0x130, + CC2420_RAM_TXNONCE = 0x140, + CC2420_RAM_CBCSTATE = 0x150, + CC2420_RAM_IEEEADR = 0x160, + CC2420_RAM_PANID = 0x168, + CC2420_RAM_SHORTADR = 0x16a, +}; + +enum cc2420_nonce_enums { + CC2420_NONCE_BLOCK_COUNTER = 0, + CC2420_NONCE_KEY_SEQ_COUNTER = 2, + CC2420_NONCE_FRAME_COUNTER = 3, + CC2420_NONCE_SOURCE_ADDRESS = 7, + CC2420_NONCE_FLAGS = 15, +}; + +enum cc2420_main_enums { + CC2420_MAIN_RESETn = 15, + CC2420_MAIN_ENC_RESETn = 14, + CC2420_MAIN_DEMOD_RESETn = 13, + CC2420_MAIN_MOD_RESETn = 12, + CC2420_MAIN_FS_RESETn = 11, + CC2420_MAIN_XOSC16M_BYPASS = 0, +}; + +enum cc2420_mdmctrl0_enums { + CC2420_MDMCTRL0_RESERVED_FRAME_MODE = 13, + CC2420_MDMCTRL0_PAN_COORDINATOR = 12, + CC2420_MDMCTRL0_ADR_DECODE = 11, + CC2420_MDMCTRL0_CCA_HYST = 8, + CC2420_MDMCTRL0_CCA_MOD = 6, + CC2420_MDMCTRL0_AUTOCRC = 5, + CC2420_MDMCTRL0_AUTOACK = 4, + CC2420_MDMCTRL0_PREAMBLE_LENGTH = 0, +}; + +enum cc2420_mdmctrl1_enums { + CC2420_MDMCTRL1_CORR_THR = 6, + CC2420_MDMCTRL1_DEMOD_AVG_MODE = 5, + CC2420_MDMCTRL1_MODULATION_MODE = 4, + CC2420_MDMCTRL1_TX_MODE = 2, + CC2420_MDMCTRL1_RX_MODE = 0, +}; + +enum cc2420_rssi_enums { + CC2420_RSSI_CCA_THR = 8, + CC2420_RSSI_RSSI_VAL = 0, +}; + +enum cc2420_syncword_enums { + CC2420_SYNCWORD_SYNCWORD = 0, +}; + +enum cc2420_txctrl_enums { + CC2420_TXCTRL_TXMIXBUF_CUR = 14, + CC2420_TXCTRL_TX_TURNAROUND = 13, + CC2420_TXCTRL_TXMIX_CAP_ARRAY = 11, + CC2420_TXCTRL_TXMIX_CURRENT = 9, + CC2420_TXCTRL_PA_CURRENT = 6, + CC2420_TXCTRL_RESERVED = 5, + CC2420_TXCTRL_PA_LEVEL = 0, +}; + +enum cc2420_rxctrl0_enums { + CC2420_RXCTRL0_RXMIXBUF_CUR = 12, + CC2420_RXCTRL0_HIGH_LNA_GAIN = 10, + CC2420_RXCTRL0_MED_LNA_GAIN = 8, + CC2420_RXCTRL0_LOW_LNA_GAIN = 6, + CC2420_RXCTRL0_HIGH_LNA_CURRENT = 4, + CC2420_RXCTRL0_MED_LNA_CURRENT = 2, + CC2420_RXCTRL0_LOW_LNA_CURRENT = 0, +}; + +enum cc2420_rxctrl1_enums { + CC2420_RXCTRL1_RXBPF_LOCUR = 13, + CC2420_RXCTRL1_RXBPF_MIDCUR = 12, + CC2420_RXCTRL1_LOW_LOWGAIN = 11, + CC2420_RXCTRL1_MED_LOWGAIN = 10, + CC2420_RXCTRL1_HIGH_HGM = 9, + CC2420_RXCTRL1_MED_HGM = 8, + CC2420_RXCTRL1_LNA_CAP_ARRAY = 6, + CC2420_RXCTRL1_RXMIX_TAIL = 4, + CC2420_RXCTRL1_RXMIX_VCM = 2, + CC2420_RXCTRL1_RXMIX_CURRENT = 0, +}; + +enum cc2420_rsctrl_enums { + CC2420_FSCTRL_LOCK_THR = 14, + CC2420_FSCTRL_CAL_DONE = 13, + CC2420_FSCTRL_CAL_RUNNING = 12, + CC2420_FSCTRL_LOCK_LENGTH = 11, + CC2420_FSCTRL_LOCK_STATUS = 10, + CC2420_FSCTRL_FREQ = 0, +}; + +enum cc2420_secctrl0_enums { + CC2420_SECCTRL0_RXFIFO_PROTECTION = 9, + CC2420_SECCTRL0_SEC_CBC_HEAD = 8, + CC2420_SECCTRL0_SEC_SAKEYSEL = 7, + CC2420_SECCTRL0_SEC_TXKEYSEL = 6, + CC2420_SECCTRL0_SEC_RXKEYSEL = 5, + CC2420_SECCTRL0_SEC_M = 2, + CC2420_SECCTRL0_SEC_MODE = 0, +}; + +enum cc2420_secctrl1_enums { + CC2420_SECCTRL1_SEC_TXL = 8, + CC2420_SECCTRL1_SEC_RXL = 0, +}; + +enum cc2420_battmon_enums { + CC2420_BATTMON_BATT_OK = 6, + CC2420_BATTMON_BATTMON_EN = 5, + CC2420_BATTMON_BATTMON_VOLTAGE = 0, +}; + +enum cc2420_iocfg0_enums { + CC2420_IOCFG0_BCN_ACCEPT = 11, + CC2420_IOCFG0_FIFO_POLARITY = 10, + CC2420_IOCFG0_FIFOP_POLARITY = 9, + CC2420_IOCFG0_SFD_POLARITY = 8, + CC2420_IOCFG0_CCA_POLARITY = 7, + CC2420_IOCFG0_FIFOP_THR = 0, +}; + +enum cc2420_iocfg1_enums { + CC2420_IOCFG1_HSSD_SRC = 10, + CC2420_IOCFG1_SFDMUX = 5, + CC2420_IOCFG1_CCAMUX = 0, +}; + +enum cc2420_manfidl_enums { + CC2420_MANFIDL_PARTNUM = 12, + CC2420_MANFIDL_MANFID = 0, +}; + +enum cc2420_manfidh_enums { + CC2420_MANFIDH_VERSION = 12, + CC2420_MANFIDH_PARTNUM = 0, +}; + +enum cc2420_fsmtc_enums { + CC2420_FSMTC_TC_RXCHAIN2RX = 13, + CC2420_FSMTC_TC_SWITCH2TX = 10, + CC2420_FSMTC_TC_PAON2TX = 6, + CC2420_FSMTC_TC_TXEND2SWITCH = 3, + CC2420_FSMTC_TC_TXEND2PAOFF = 0, +}; + +enum cc2420_sfdmux_enums { + CC2420_SFDMUX_SFD = 0, + CC2420_SFDMUX_XOSC16M_STABLE = 24, +}; + +#endif diff --git a/tos/chips/cc2420_lpl/CC2420ActiveMessageC.nc b/tos/chips/cc2420_lpl/CC2420ActiveMessageC.nc new file mode 100644 index 00000000..ec264f19 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420ActiveMessageC.nc @@ -0,0 +1,88 @@ +/* tab:4 + * "Copyright (c) 2005 Stanford University. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose, without fee, and without written + * agreement is hereby granted, provided that the above copyright + * notice, the following two paragraphs and the author appear in all + * copies of this software. + * + * IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF STANFORD UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * STANFORD UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE + * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND STANFORD UNIVERSITY + * HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + * ENHANCEMENTS, OR MODIFICATIONS." + */ + +/** + * The Active Message layer for the CC2420 radio. This configuration + * just layers the AM dispatch (CC2420ActiveMessageM) on top of the + * underlying CC2420 radio packet (CC2420CsmaRadioC), which is + * inherently an AM packet (acknowledgements based on AM destination + * addr and group). Note that snooping may not work, due to CC2420 + * early packet rejection if acknowledgements are enabled. + * + * @author Philip Levis + * @version $Revision$ $Date$ + */ + +#include "CC2420.h" + +configuration CC2420ActiveMessageC { + provides { + interface SplitControl; + interface AMSend[am_id_t id]; + interface Receive[am_id_t id]; + interface Receive as Snoop[am_id_t id]; + interface AMPacket; + interface Packet; + interface CC2420Packet; + interface PacketAcknowledgements; + interface CsmaBackoff[am_id_t amId]; + interface LowPowerListening; + } +} +implementation { + + components CC2420ActiveMessageP as AM; + components CC2420CsmaC as Radio; + components ActiveMessageAddressC as Address; + + CsmaBackoff = Radio; + Packet = AM; + AMSend = AM; + Receive = AM.Receive; + Snoop = AM.Snoop; + AMPacket = AM; + +#ifdef LOW_POWER_LISTENING + components CC2420LowPowerListeningC as Lpl; + LowPowerListening = Lpl; + AM.SubSend -> Lpl.Send; + AM.SubReceive -> Lpl.Receive; + SplitControl = Lpl; + +#else + components CC2420LplDummyP; + LowPowerListening = CC2420LplDummyP; + AM.SubSend -> Radio.Send; + AM.SubReceive -> Radio.Receive; + SplitControl = Radio; +#endif + + AM.amAddress -> Address; + Radio.AMPacket -> AM; + + components CC2420PacketC; + CC2420Packet = CC2420PacketC; + PacketAcknowledgements = CC2420PacketC; + + +} diff --git a/tos/chips/cc2420_lpl/CC2420ActiveMessageP.nc b/tos/chips/cc2420_lpl/CC2420ActiveMessageP.nc new file mode 100644 index 00000000..7cae4499 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420ActiveMessageP.nc @@ -0,0 +1,188 @@ +/* tab:4 + * "Copyright (c) 2005 Stanford University. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose, without fee, and without written + * agreement is hereby granted, provided that the above copyright + * notice, the following two paragraphs and the author appear in all + * copies of this software. + * + * IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF STANFORD UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * STANFORD UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE + * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND STANFORD UNIVERSITY + * HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + * ENHANCEMENTS, OR MODIFICATIONS." + */ + + +/** + * Active message implementation on top of the CC2420 radio. This + * implementation uses the 16-bit addressing mode of 802.15.4: the + * only additional byte it adds is the AM id byte, as the first byte + * of the data payload. + * + * @author Philip Levis + * @version $Revision$ $Date$ + */ + +module CC2420ActiveMessageP { + provides { + interface AMSend[am_id_t id]; + interface Receive[am_id_t id]; + interface Receive as Snoop[am_id_t id]; + interface AMPacket; + interface Packet; + } + uses { + interface Send as SubSend; + interface Receive as SubReceive; + command am_addr_t amAddress(); + } +} +implementation { + + enum { + CC2420_SIZE = MAC_HEADER_SIZE + MAC_FOOTER_SIZE, + }; + + cc2420_header_t* getHeader( message_t* msg ) { + return (cc2420_header_t*)( msg->data - sizeof(cc2420_header_t) ); + } + + command error_t AMSend.send[am_id_t id](am_addr_t addr, + message_t* msg, + uint8_t len) { + cc2420_header_t* header = getHeader( msg ); + header->type = id; + header->dest = addr; + header->destpan = TOS_AM_GROUP; + + return call SubSend.send( msg, len + CC2420_SIZE ); + } + + command error_t AMSend.cancel[am_id_t id](message_t* msg) { + return call SubSend.cancel(msg); + } + + command uint8_t AMSend.maxPayloadLength[am_id_t id]() { + return call Packet.maxPayloadLength(); + } + + command void* AMSend.getPayload[am_id_t id](message_t* m) { + return call Packet.getPayload(m, NULL); + } + + command void* Receive.getPayload[am_id_t id](message_t* m, uint8_t* len) { + return call Packet.getPayload(m, len); + } + + command uint8_t Receive.payloadLength[am_id_t id](message_t* m) { + return call Packet.payloadLength(m); + } + + command void* Snoop.getPayload[am_id_t id](message_t* m, uint8_t* len) { + return call Packet.getPayload(m, len); + } + + command uint8_t Snoop.payloadLength[am_id_t id](message_t* m) { + return call Packet.payloadLength(m); + } + + event void SubSend.sendDone(message_t* msg, error_t result) { + signal AMSend.sendDone[call AMPacket.type(msg)](msg, result); + } + + /* Receiving a packet */ + + event message_t* SubReceive.receive(message_t* msg, void* payload, uint8_t len) { + if (call AMPacket.isForMe(msg)) { + return signal Receive.receive[call AMPacket.type(msg)](msg, payload, len - CC2420_SIZE); + } + else { + return signal Snoop.receive[call AMPacket.type(msg)](msg, payload, len - CC2420_SIZE); + } + } + + command am_addr_t AMPacket.address() { + return call amAddress(); + } + + command am_addr_t AMPacket.destination(message_t* amsg) { + cc2420_header_t* header = getHeader(amsg); + return header->dest; + } + + command am_addr_t AMPacket.source(message_t* amsg) { + cc2420_header_t* header = getHeader(amsg); + return header->src; + } + + command void AMPacket.setDestination(message_t* amsg, am_addr_t addr) { + cc2420_header_t* header = getHeader(amsg); + header->dest = addr; + } + + command void AMPacket.setSource(message_t* amsg, am_addr_t addr) { + cc2420_header_t* header = getHeader(amsg); + header->src = addr; + } + + command bool AMPacket.isForMe(message_t* amsg) { + return (call AMPacket.destination(amsg) == call AMPacket.address() || + call AMPacket.destination(amsg) == AM_BROADCAST_ADDR); + } + + command am_id_t AMPacket.type(message_t* amsg) { + cc2420_header_t* header = getHeader(amsg); + return header->type; + } + + command void AMPacket.setType(message_t* amsg, am_id_t type) { + cc2420_header_t* header = getHeader(amsg); + header->type = type; + } + + default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { + return msg; + } + + default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { + return msg; + } + + default event void AMSend.sendDone[uint8_t id](message_t* msg, error_t err) { + return; + } + + + command void Packet.clear(message_t* msg) {} + + command uint8_t Packet.payloadLength(message_t* msg) { + return getHeader(msg)->length - CC2420_SIZE; + } + + + command void Packet.setPayloadLength(message_t* msg, uint8_t len) { + getHeader(msg)->length = len + CC2420_SIZE; + } + + command uint8_t Packet.maxPayloadLength() { + return TOSH_DATA_LENGTH; + } + + command void* Packet.getPayload(message_t* msg, uint8_t* len) { + if (len != NULL) { + *len = call Packet.payloadLength(msg); + } + return msg->data; + } + + +} diff --git a/tos/chips/cc2420_lpl/CC2420Cca.nc b/tos/chips/cc2420_lpl/CC2420Cca.nc new file mode 100644 index 00000000..58e75f35 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420Cca.nc @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Interface to obtain a CCA reading from the CC2420 radio + * to determine if a neighbor is transmitting + * @author David Moss + */ + +interface CC2420Cca { + + /** + * @return TRUE if the CCA pin shows a clear channel + */ + command bool isChannelClear(); + +} + diff --git a/tos/chips/cc2420_lpl/CC2420Config.nc b/tos/chips/cc2420_lpl/CC2420Config.nc new file mode 100644 index 00000000..f9bd2e7e --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420Config.nc @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * An HAL abstraction of the ChipCon CC2420 radio. This abstraction + * deals specifically with radio configurations. All get() and set() + * commands are single-phase. After setting some values, a call to + * sync() is required for the changes to propagate to the cc2420 + * hardware chip. This interface allows setting multiple parameters + * before calling sync(). + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +interface CC2420Config { + + /** + * Sync configuration changes with the radio hardware. This only + * applies to set commands below. + * + * @return SUCCESS if the request was accepted, FAIL otherwise. + */ + command error_t sync(); + event void syncDone( error_t error ); + + /** + * Change the channel of the radio. + */ + command uint8_t getChannel(); + command void setChannel( uint8_t channel ); + + /** + * Change the short address of the radio. + */ + command uint16_t getShortAddr(); + command void setShortAddr( uint16_t address ); + + /** + * Change the PAN address of the radio. + */ + command uint16_t getPanAddr(); + command void setPanAddr( uint16_t address ); + +} diff --git a/tos/chips/cc2420_lpl/CC2420ControlC.nc b/tos/chips/cc2420_lpl/CC2420ControlC.nc new file mode 100644 index 00000000..8457c80e --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420ControlC.nc @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Implementation for configuring a ChipCon CC2420 radio. + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include "CC2420.h" +#include "IEEE802154.h" + +configuration CC2420ControlC { + + provides interface Init; + provides interface Resource; + provides interface CC2420Config; + provides interface CC2420Power; + + uses interface AMPacket; + +} + +implementation { + + components CC2420ControlP; + Init = CC2420ControlP; + Resource = CC2420ControlP; + CC2420Config = CC2420ControlP; + CC2420Power = CC2420ControlP; + AMPacket = CC2420ControlP; + + components AlarmMultiplexC as Alarm; + CC2420ControlP.StartupTimer -> Alarm; + + components HplCC2420PinsC as Pins; + CC2420ControlP.CSN -> Pins.CSN; + CC2420ControlP.RSTN -> Pins.RSTN; + CC2420ControlP.VREN -> Pins.VREN; + + components HplCC2420InterruptsC as Interrupts; + CC2420ControlP.InterruptCCA -> Interrupts.InterruptCCA; + + components new CC2420SpiC() as Spi; + CC2420ControlP.SpiResource -> Spi; + CC2420ControlP.SRXON -> Spi.SRXON; + CC2420ControlP.SRFOFF -> Spi.SRFOFF; + CC2420ControlP.SXOSCON -> Spi.SXOSCON; + CC2420ControlP.SXOSCOFF -> Spi.SXOSCOFF; + CC2420ControlP.FSCTRL -> Spi.FSCTRL; + CC2420ControlP.IOCFG0 -> Spi.IOCFG0; + CC2420ControlP.IOCFG1 -> Spi.IOCFG1; + CC2420ControlP.MDMCTRL0 -> Spi.MDMCTRL0; + CC2420ControlP.MDMCTRL1 -> Spi.MDMCTRL1; + CC2420ControlP.PANID -> Spi.PANID; + + components new CC2420SpiC() as SyncSpiC; + CC2420ControlP.SyncResource -> SyncSpiC; + + components LedsC as Leds; + CC2420ControlP.Leds -> Leds; + +} + diff --git a/tos/chips/cc2420_lpl/CC2420ControlP.nc b/tos/chips/cc2420_lpl/CC2420ControlP.nc new file mode 100644 index 00000000..ca1084a4 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420ControlP.nc @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include "Timer.h" + +module CC2420ControlP { + + provides interface Init; + provides interface Resource; + provides interface CC2420Config; + provides interface CC2420Power; + + uses interface Alarm as StartupTimer; + uses interface GeneralIO as CSN; + uses interface GeneralIO as RSTN; + uses interface GeneralIO as VREN; + uses interface GpioInterrupt as InterruptCCA; + + uses interface Resource as SpiResource; + uses interface CC2420Ram as PANID; + uses interface CC2420Register as FSCTRL; + uses interface CC2420Register as IOCFG0; + uses interface CC2420Register as IOCFG1; + uses interface CC2420Register as MDMCTRL0; + uses interface CC2420Register as MDMCTRL1; + uses interface CC2420Strobe as SRXON; + uses interface CC2420Strobe as SRFOFF; + uses interface CC2420Strobe as SXOSCOFF; + uses interface CC2420Strobe as SXOSCON; + uses interface AMPacket; + + uses interface Resource as SyncResource; + + uses interface Leds; + +} + +implementation { + + typedef enum { + S_VREG_STOPPED, + S_VREG_STARTING, + S_VREG_STARTED, + S_XOSC_STARTING, + S_XOSC_STARTED, + } cc2420_control_state_t; + + uint8_t m_channel = CC2420_DEF_CHANNEL; + uint8_t m_tx_power = CC2420_DEF_RFPOWER; + uint16_t m_pan = TOS_AM_GROUP; + uint16_t m_short_addr; + bool m_sync_busy; + task void syncDone_task(); + + norace cc2420_control_state_t m_state = S_VREG_STOPPED; + + command error_t Init.init() { + call CSN.makeOutput(); + call RSTN.makeOutput(); + call VREN.makeOutput(); + m_short_addr = call AMPacket.address(); + return SUCCESS; + } + + async command error_t Resource.immediateRequest() { + error_t error = call SpiResource.immediateRequest(); + if ( error == SUCCESS ) + call CSN.clr(); + return error; + } + + async command error_t Resource.request() { + return call SpiResource.request(); + } + + async command uint8_t Resource.isOwner() { + return call SpiResource.isOwner(); + } + + async command error_t Resource.release() { + atomic { + call CSN.set(); + return call SpiResource.release(); + } + } + + event void SpiResource.granted() { + call CSN.clr(); + signal Resource.granted(); + } + + async command error_t CC2420Power.startVReg() { + atomic { + if ( m_state != S_VREG_STOPPED ) + return FAIL; + m_state = S_VREG_STARTING; + } + call VREN.set(); + call StartupTimer.start( CC2420_TIME_VREN ); + return SUCCESS; + } + + async event void StartupTimer.fired() { + if ( m_state == S_VREG_STARTING ) { + m_state = S_VREG_STARTED; + call RSTN.clr(); + call RSTN.set(); + signal CC2420Power.startVRegDone(); + } + } + + async command error_t CC2420Power.stopVReg() { + m_state = S_VREG_STOPPED; + call RSTN.clr(); + call VREN.clr(); + call RSTN.set(); + return SUCCESS; + } + + async command error_t CC2420Power.startOscillator() { + atomic { + if ( m_state != S_VREG_STARTED ) + return FAIL; + + m_state = S_XOSC_STARTING; + call IOCFG1.write( CC2420_SFDMUX_XOSC16M_STABLE << + CC2420_IOCFG1_CCAMUX ); + call InterruptCCA.enableRisingEdge(); + call SXOSCON.strobe(); + call IOCFG0.write( ( 1 << CC2420_IOCFG0_FIFOP_POLARITY ) | + ( 127 << CC2420_IOCFG0_FIFOP_THR ) ); + call FSCTRL.write( ( 1 << CC2420_FSCTRL_LOCK_THR ) | + ( ( (m_channel - 11)*5+357 ) + << CC2420_FSCTRL_FREQ ) ); + call MDMCTRL0.write( ( 1 << CC2420_MDMCTRL0_RESERVED_FRAME_MODE ) | + ( 1 << CC2420_MDMCTRL0_ADR_DECODE ) | + ( 2 << CC2420_MDMCTRL0_CCA_HYST ) | + ( 3 << CC2420_MDMCTRL0_CCA_MOD ) | + ( 1 << CC2420_MDMCTRL0_AUTOCRC ) | + ( 1 << CC2420_MDMCTRL0_AUTOACK ) | + ( 2 << CC2420_MDMCTRL0_PREAMBLE_LENGTH ) ); + } + return SUCCESS; + } + + async event void InterruptCCA.fired() { + nxle_uint16_t id[ 2 ]; + m_state = S_XOSC_STARTED; + id[ 0 ] = m_pan; + id[ 1 ] = m_short_addr; + call InterruptCCA.disable(); + call IOCFG1.write( 0 ); + call PANID.write( 0, (uint8_t*)&id, 4 ); + call CSN.set(); + call CSN.clr(); + signal CC2420Power.startOscillatorDone(); + } + + async command error_t CC2420Power.stopOscillator() { + atomic { + if ( m_state != S_XOSC_STARTED ) + return FAIL; + m_state = S_VREG_STARTED; + call SXOSCOFF.strobe(); + } + return SUCCESS; + } + + async command error_t CC2420Power.rxOn() { + atomic { + if ( m_state != S_XOSC_STARTED ) + return FAIL; + call SRXON.strobe(); + } + return SUCCESS; + } + + async command error_t CC2420Power.rfOff() { + atomic { + if ( m_state != S_XOSC_STARTED ) + return FAIL; + call SRFOFF.strobe(); + } + return SUCCESS; + } + + command uint8_t CC2420Config.getChannel() { + atomic return m_channel; + } + + command void CC2420Config.setChannel( uint8_t channel ) { + atomic m_channel = channel; + } + + command uint16_t CC2420Config.getShortAddr() { + atomic return m_short_addr; + } + + command void CC2420Config.setShortAddr( uint16_t addr ) { + atomic m_short_addr = addr; + } + + command uint16_t CC2420Config.getPanAddr() { + return m_pan; + } + + command void CC2420Config.setPanAddr( uint16_t pan ) { + atomic m_pan = pan; + } + + command error_t CC2420Config.sync() { + atomic { + if ( m_sync_busy ) + return FAIL; + m_sync_busy = TRUE; + if ( m_state == S_XOSC_STARTED ) + call SyncResource.request(); + else + post syncDone_task(); + } + return SUCCESS; + } + + event void SyncResource.granted() { + + nxle_uint16_t id[ 2 ]; + uint8_t channel; + + atomic { + channel = m_channel; + id[ 0 ] = m_pan; + id[ 1 ] = m_short_addr; + } + + call CSN.clr(); + call FSCTRL.write( ( 1 << CC2420_FSCTRL_LOCK_THR ) | + ( ( (channel - 11)*5+357 ) << CC2420_FSCTRL_FREQ ) ); + call PANID.write( 0, (uint8_t*)id, sizeof( id ) ); + call CSN.set(); + call SyncResource.release(); + + post syncDone_task(); + + } + + task void syncDone_task() { + atomic m_sync_busy = FALSE; + signal CC2420Config.syncDone( SUCCESS ); + } + + default event void CC2420Config.syncDone( error_t error ) {} + +} diff --git a/tos/chips/cc2420_lpl/CC2420CsmaC.nc b/tos/chips/cc2420_lpl/CC2420CsmaC.nc new file mode 100644 index 00000000..8743b4c8 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420CsmaC.nc @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Basic implementation of a CSMA MAC for the ChipCon CC2420 radio. + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include "CC2420.h" +#include "IEEE802154.h" + +configuration CC2420CsmaC { + + provides interface SplitControl; + provides interface Send; + provides interface Receive; + provides interface CsmaBackoff[am_id_t amId]; + + uses interface AMPacket; + +} + +implementation { + + components CC2420CsmaP as CsmaP; + + CsmaBackoff = CsmaP; + SplitControl = CsmaP; + Send = CsmaP; + AMPacket = CsmaP; + + components CC2420ControlC; + AMPacket = CC2420ControlC; + CsmaP.Resource -> CC2420ControlC; + CsmaP.CC2420Power -> CC2420ControlC; + + components CC2420TransmitC; + + CsmaP.SubControl -> CC2420TransmitC; + CsmaP.CC2420Transmit -> CC2420TransmitC; + CsmaP.SubBackoff -> CC2420TransmitC; + + components CC2420ReceiveC; + Receive = CC2420ReceiveC; + CsmaP.SubControl -> CC2420ReceiveC; + + components RandomC; + CsmaP.Random -> RandomC; + + components LedsC as Leds; + CsmaP.Leds -> Leds; + + components MainC; + MainC.SoftwareInit -> CsmaP; + MainC.SoftwareInit -> CC2420ControlC; + MainC.SoftwareInit -> CC2420TransmitC; + MainC.SoftwareInit -> CC2420ReceiveC; +} diff --git a/tos/chips/cc2420_lpl/CC2420CsmaP.nc b/tos/chips/cc2420_lpl/CC2420CsmaP.nc new file mode 100644 index 00000000..9911f5a0 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420CsmaP.nc @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +module CC2420CsmaP { + + provides interface Init; + provides interface SplitControl; + provides interface Send; + provides interface CsmaBackoff[am_id_t amId]; + + uses interface Resource; + uses interface CC2420Power; + uses interface AsyncStdControl as SubControl; + uses interface CC2420Transmit; + uses interface CsmaBackoff as SubBackoff; + uses interface Random; + uses interface AMPacket; + uses interface Leds; + +} + +implementation { + + enum { + S_PREINIT, + S_STOPPED, + S_STARTING, + S_STARTED, + S_STOPPING, + S_TRANSMIT, + }; + + message_t* m_msg; + uint8_t m_state = S_PREINIT; + uint8_t m_dsn; + error_t sendErr = SUCCESS; + + task void startDone_task(); + task void stopDone_task(); + task void sendDone_task(); + + cc2420_header_t* getHeader( message_t* msg ) { + return (cc2420_header_t*)( msg->data - sizeof( cc2420_header_t ) ); + } + + cc2420_metadata_t* getMetadata( message_t* msg ) { + return (cc2420_metadata_t*)msg->metadata; + } + + command error_t Init.init() { + + if ( m_state != S_PREINIT ) + return FAIL; + + m_state = S_STOPPED; + + return SUCCESS; + + } + + command error_t SplitControl.start() { + + if ( m_state != S_STOPPED ) + return FAIL; + + m_state = S_STARTING; + + m_dsn = call Random.rand16(); + call CC2420Power.startVReg(); + + return SUCCESS; + + } + + async event void CC2420Power.startVRegDone() { + call Resource.request(); + } + + event void Resource.granted() { + call CC2420Power.startOscillator(); + } + + async event void CC2420Power.startOscillatorDone() { + call SubControl.start(); + call CC2420Power.rxOn(); + call Resource.release(); + post startDone_task(); + } + + task void startDone_task() { + m_state = S_STARTED; + signal SplitControl.startDone( SUCCESS ); + } + + command error_t SplitControl.stop() { + + if ( m_state != S_STARTED ) + return FAIL; + + m_state = S_STOPPING; + + call SubControl.stop(); + call CC2420Power.stopVReg(); + post stopDone_task(); + + return SUCCESS; + + } + + task void stopDone_task() { + m_state = S_STOPPED; + signal SplitControl.stopDone( SUCCESS ); + } + + command error_t Send.cancel( message_t* p_msg ) { + return FAIL; + } + + command error_t Send.send( message_t* p_msg, uint8_t len ) { + + cc2420_header_t* header = getHeader( p_msg ); + cc2420_metadata_t* metadata = getMetadata( p_msg ); + + atomic { + if ( m_state != S_STARTED ) + return FAIL; + m_state = S_TRANSMIT; + m_msg = p_msg; + header->dsn = ++m_dsn; + } + + header->length = len; + header->fcf &= 1 << IEEE154_FCF_ACK_REQ; + header->fcf |= ( ( IEEE154_TYPE_DATA << IEEE154_FCF_FRAME_TYPE ) | + ( 1 << IEEE154_FCF_INTRAPAN ) | + ( IEEE154_ADDR_SHORT << IEEE154_FCF_DEST_ADDR_MODE ) | + ( IEEE154_ADDR_SHORT << IEEE154_FCF_SRC_ADDR_MODE ) ); + header->src = call AMPacket.address(); + metadata->ack = FALSE; + metadata->rssi = 0; + metadata->lqi = 0; + metadata->time = 0; + + call CC2420Transmit.sendCCA( m_msg ); + + return SUCCESS; + + } + + command void* Send.getPayload(message_t* m) { + return m->data; + } + + command uint8_t Send.maxPayloadLength() { + return TOSH_DATA_LENGTH; + } + + async event uint16_t SubBackoff.initial( message_t* msg ) { + return signal CsmaBackoff.initial[((cc2420_header_t*)(msg->data - + sizeof(cc2420_header_t)))->type](msg); + } + + async event uint16_t SubBackoff.congestion( message_t* msg ) { + return signal CsmaBackoff.congestion[((cc2420_header_t*)(msg->data - + sizeof(cc2420_header_t)))->type](msg); + } + + async event void CC2420Transmit.sendDone( message_t* p_msg, error_t err ) { + atomic sendErr = err; + post sendDone_task(); + } + + task void sendDone_task() { + error_t packetErr; + atomic packetErr = sendErr; + m_state = S_STARTED; + signal Send.sendDone( m_msg, packetErr ); + } + + + /***************** Defaults ***************/ + default async event uint16_t CsmaBackoff.initial[am_id_t amId]( + message_t *m) { + return ( call Random.rand16() % (0x1F * CC2420_BACKOFF_PERIOD) + + CC2420_MIN_BACKOFF); + } + + default async event uint16_t CsmaBackoff.congestion[am_id_t amId]( + message_t *m) { + return ( call Random.rand16() % (0x7 * CC2420_BACKOFF_PERIOD) + + CC2420_MIN_BACKOFF); + } + + default event void SplitControl.startDone(error_t error) { + } + + default event void SplitControl.stopDone(error_t error) { + } +} + diff --git a/tos/chips/cc2420_lpl/CC2420DutyCycle.h b/tos/chips/cc2420_lpl/CC2420DutyCycle.h new file mode 100644 index 00000000..4d38e4a4 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420DutyCycle.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author David Moss + */ + +#ifndef CC2420DUTYCYCLE_H +#define CC2420DUTYCYCLE_H + +/** + * Default duty period is 0, which is "always on" + */ +#ifndef DEFAULT_DUTY_PERIOD +#define DEFAULT_DUTY_PERIOD 0 +#endif + +/** + * This is a measured value of the time the radio is actually on (5.8 ms) + * We round this up to 6 ms for erring on the side of better performance ratios + */ +#ifndef DUTY_ON_TIME +#define DUTY_ON_TIME 6 // TODO re-measure +#endif + +/** + * The maximum number of CCA checks performed on each wakeup. + * If there are too few, the receiver may wake up between messages + * and not detect the transmitter. + */ +#ifndef MAX_LPL_CCA_CHECKS +#define MAX_LPL_CCA_CHECKS 100 +#endif + +#endif diff --git a/tos/chips/cc2420_lpl/CC2420DutyCycle.nc b/tos/chips/cc2420_lpl/CC2420DutyCycle.nc new file mode 100644 index 00000000..785cf6d0 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420DutyCycle.nc @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Manage the CC2420's duty cycle and power + * @author David Moss + */ + +interface CC2420DutyCycle { + + /** + * Set the sleep interval, in binary milliseconds + * @param sleepIntervalMs the sleep interval in [ms] + */ + command void setSleepInterval(uint16_t sleepIntervalMs); + + /** + * @return the sleep interval in [ms] + */ + command uint16_t getSleepInterval(); + + /** + * A transmitter was detected. You must now take action to + * turn the radio off when the transaction is complete. + */ + event void detected(); + +} + diff --git a/tos/chips/cc2420_lpl/CC2420DutyCycleC.nc b/tos/chips/cc2420_lpl/CC2420DutyCycleC.nc new file mode 100644 index 00000000..c118bcdf --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420DutyCycleC.nc @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Use this component to duty cycle the radio. When a message is heard, + * disable DutyCycling. + * + * @author David Moss dmm@rincon.com + */ + +#include "CC2420DutyCycle.h" + +configuration CC2420DutyCycleC { + provides { + interface CC2420DutyCycle; + interface SplitControl; + interface State as SplitControlState; + } +} + +implementation { + components MainC, + CC2420DutyCycleP, + CC2420TransmitC, + CC2420CsmaC, + LedsC, + new StateC() as RadioPowerStateC, + new StateC() as DutyCycleStateC, + new StateC() as CheckStateC, + new StateC() as SplitControlStateC, + new TimerMilliC() as OnTimerC, + new TimerMilliC() as CheckTimerC, + RandomC; + + CC2420DutyCycle = CC2420DutyCycleP; + SplitControl = CC2420DutyCycleP; + SplitControlState = SplitControlStateC; + + MainC.SoftwareInit -> CC2420DutyCycleP; + + CC2420DutyCycleP.Random -> RandomC; + CC2420DutyCycleP.CC2420Cca -> CC2420TransmitC; + CC2420DutyCycleP.SubControl -> CC2420CsmaC; + CC2420DutyCycleP.RadioPowerState -> RadioPowerStateC; + CC2420DutyCycleP.DutyCycleState -> DutyCycleStateC; + CC2420DutyCycleP.SplitControlState -> SplitControlStateC; + CC2420DutyCycleP.CheckState -> CheckStateC; + CC2420DutyCycleP.OnTimer -> OnTimerC; + CC2420DutyCycleP.Leds -> LedsC; +} + + diff --git a/tos/chips/cc2420_lpl/CC2420DutyCycleP.nc b/tos/chips/cc2420_lpl/CC2420DutyCycleP.nc new file mode 100644 index 00000000..14891660 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420DutyCycleP.nc @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Module to duty cycle the radio on and off, performing CCA receive checks. + * When a carrier is sensed, this will leave the radio on. It is then up + * to higher layers to turn the radio off again. Once the radio is turned + * off, this module will automatically continue duty cycling and looking for + * a modulated signal. + * + * @author David Moss + */ + +#include "CC2420DutyCycle.h" + +module CC2420DutyCycleP { + provides { + interface CC2420DutyCycle; + interface Init; + interface SplitControl; + } + + uses { + interface Timer as OnTimer; + interface SplitControl as SubControl; + interface State as RadioPowerState; + interface State as DutyCycleState; + interface State as SplitControlState; + interface State as CheckState; + interface Leds; + interface CC2420Cca; + interface Random; + } +} + +implementation { + + /** The current period of the duty cycle, equivalent of wakeup interval */ + uint16_t sleepInterval; + + /** The number of times the CCA has been sampled in this wakeup period */ + uint8_t ccaChecks; + + /** + * Radio Power, Check State, and Duty Cycling State + */ + enum { + S_OFF, // off by default + S_ON, + }; + + + /***************** Prototypes ****************/ + task void stopRadio(); + task void startRadio(); + task void getCca(); + + /***************** Init Commands ****************/ + command error_t Init.init() { + sleepInterval = DEFAULT_DUTY_PERIOD; + return SUCCESS; + } + + /***************** CC2420DutyCycle Commands ****************/ + /** + * Set the sleep interval, in binary milliseconds + * @param sleepIntervalMs the sleep interval in [ms] + */ + command void CC2420DutyCycle.setSleepInterval(uint16_t sleepIntervalMs) { + sleepInterval = sleepIntervalMs; + + if(sleepInterval == 0 && call DutyCycleState.getState() == S_ON) { + call DutyCycleState.forceState(S_OFF); + call CheckState.toIdle(); + + /* + * Leave the radio on permanently if sleepInterval == 0 and the radio is + * supposed to be enabled + */ + if(call RadioPowerState.getState() == S_OFF) { + call SubControl.start(); + } + } + } + + /** + * @return the sleep interval in [ms] + */ + command uint16_t CC2420DutyCycle.getSleepInterval() { + return sleepInterval; + } + + /***************** SplitControl Commands ****************/ + command error_t SplitControl.start() { + call SplitControlState.forceState(S_ON); + + if(sleepInterval > 0) { + // Begin duty cycling + call DutyCycleState.forceState(S_ON); + call CheckState.toIdle(); + post stopRadio(); + signal SplitControl.startDone(SUCCESS); + + } else { + call DutyCycleState.forceState(S_OFF); + call CheckState.toIdle(); + + /* + * Leave the radio on permanently if sleepInterval == 0 and the radio is + * supposed to be enabled + */ + if(call RadioPowerState.getState() == S_OFF) { + call SubControl.start(); + // Here, SplitControl.startDone is signaled on SubControl.startDone + + } else { + // Radio is already on + signal SplitControl.startDone(SUCCESS); + } + } + + return SUCCESS; + } + + command error_t SplitControl.stop() { + call SplitControlState.forceState(S_OFF); + call DutyCycleState.forceState(S_OFF); + call CheckState.toIdle(); + return call SubControl.stop(); + + /* + * SubControl.stopDone signals SplitControl.stopDone when + * DutyCycleState is S_OFF + */ + } + + /***************** Timer Events ****************/ + event void OnTimer.fired() { + if(call DutyCycleState.getState() == S_ON) { + if(call RadioPowerState.getState() == S_OFF) { + call CheckState.forceState(S_ON); + ccaChecks = 0; + + /* + * The MicaZ, running on an external oscillator I think, and + * returning the microcontroller out of a sleep state to immediately + * perform an ADC conversion, sucks. The first ADC conversion out + * of a sleep state lasts about a second. We don't want the radio + * on that long. Like the CC1000 RSSI pulse check implementation + * done in the Rincon CC1000Radio stack, we will perform + * a single ADC conversion and then flip on the radio to check + * the channel. + */ + post getCca(); + + } else { + // Someone else turned on the radio, try again in awhile + call OnTimer.startOneShot(sleepInterval); + } + } + } + + /***************** SubControl Events ****************/ + event void SubControl.startDone(error_t error) { + if(call DutyCycleState.getState() == S_ON && error) { + // My responsibility to try again + post startRadio(); + return; + } + + call RadioPowerState.forceState(S_ON); + //call Leds.led2On(); + + if(call DutyCycleState.getState() == S_ON) { + if(call CheckState.getState() == S_ON) { + post getCca(); + } + + } else { + // Must have turned the radio on manually + signal SplitControl.startDone(SUCCESS); + } + } + + event void SubControl.stopDone(error_t error) { + if(error && call DutyCycleState.getState() == S_ON) { + // My responsibility to try again + post stopRadio(); + return; + } + + call RadioPowerState.forceState(S_OFF); + //call Leds.led2Off(); + + if(call DutyCycleState.getState() == S_ON) { + call OnTimer.startOneShot(sleepInterval); + + } else { + // Must have turned off the radio manually + signal SplitControl.stopDone(error); + } + + } + + + /***************** Tasks ****************/ + task void stopRadio() { + if(call DutyCycleState.getState() == S_ON) { + if(call SubControl.stop() != SUCCESS) { + // Already stopped? + call OnTimer.startOneShot(sleepInterval); + } + } + } + + task void startRadio() { + if(call DutyCycleState.getState() == S_ON) { + if(call SubControl.start() != SUCCESS) { + post startRadio(); + } + } + } + + + task void getCca() { + if(call DutyCycleState.getState() == S_ON) { + + ccaChecks++; + if(ccaChecks == 1) { + // Microcontroller is ready, turn on the radio and sample a few times + post startRadio(); + return; + } + + if(!call CC2420Cca.isChannelClear()) { + signal CC2420DutyCycle.detected(); + // Leave the radio on for upper layers to perform some transaction + + } else { + if(ccaChecks <= MAX_LPL_CCA_CHECKS) { + post getCca(); + return; + + } else { + call CheckState.toIdle(); + post stopRadio(); + } + } + } + } + + /**************** Defaults ****************/ + default event void CC2420DutyCycle.detected() { + } + +} + + diff --git a/tos/chips/cc2420_lpl/CC2420Fifo.nc b/tos/chips/cc2420_lpl/CC2420Fifo.nc new file mode 100644 index 00000000..ba4d6538 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420Fifo.nc @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * HAL abstraction for accessing the FIFO registers of a ChipCon + * CC2420 radio. + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +interface CC2420Fifo { + + /** + * Start reading from the FIFO. The readDone event will + * be signalled upon completion. + * + * @param data a pointer to the receive buffer. + * @param length number of bytes to read. + * @return status byte returned when sending the last address byte + * of the SPI transaction. + */ + async command cc2420_status_t beginRead( uint8_t* data, uint8_t length ); + + /** + * Continue reading from the FIFO without having to send the address + * byte again. The readDone event will be signalled + * upon completion. + * + * @param data a pointer to the receive buffer. + * @param length number of bytes to read. + * @return SUCCESS always. + */ + async command error_t continueRead( uint8_t* data, uint8_t length ); + + /** + * Signals the completion of a read operation. + * + * @param data a pointer to the receive buffer. + * @param length number of bytes read. + * @param error notification of how the operation went + */ + async event void readDone( uint8_t* data, uint8_t length, error_t error ); + + /** + * Start writing the FIFO. The writeDone event will be + * signalled upon completion. + * + * @param data a pointer to the send buffer. + * @param length number of bytes to write. + * @return status byte returned when sending the last address byte + * of the SPI transaction. + */ + async command cc2420_status_t write( uint8_t* data, uint8_t length ); + + /** + * Signals the completion of a write operation. + * + * @param data a pointer to the send buffer. + * @param length number of bytes written. + * @param error notification of how the operation went + */ + async event void writeDone( uint8_t* data, uint8_t length, error_t error ); + +} diff --git a/tos/chips/cc2420_lpl/CC2420LowPowerListening.h b/tos/chips/cc2420_lpl/CC2420LowPowerListening.h new file mode 100644 index 00000000..ae6d0e70 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420LowPowerListening.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + + /** + * @author David Moss + */ +#ifndef CC2420LOWPOWERLISTENING_H +#define CC2420LOWPOWERLISTENING_H + +#include "CC2420DutyCycle.h" + +/** + * The default duty period is usually 0, which is the equivalent of + * ONE_MESSAGE (below), which tells the node to transmit the message + * one time without expecting receiver duty cycling. + */ +#ifndef DEFAULT_TRANSMIT_PERIOD +#define DEFAULT_TRANSMIT_PERIOD DEFAULT_DUTY_PERIOD +#endif + +/** + * Amount of time, in milliseconds, to keep the radio on after + * a successful receive addressed to this node + */ +#ifndef DELAY_AFTER_RECEIVE +#define DELAY_AFTER_RECEIVE 50 +#endif + +/** + * Value used to indicate the message being sent should be transmitted + * one time + */ +#ifndef ONE_MESSAGE +#define ONE_MESSAGE 0 +#endif + +#endif + diff --git a/tos/chips/cc2420_lpl/CC2420LowPowerListeningC.nc b/tos/chips/cc2420_lpl/CC2420LowPowerListeningC.nc new file mode 100644 index 00000000..1bdfa379 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420LowPowerListeningC.nc @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Low Power Listening for the CC2420 + * @author David Moss + */ + +#include "CC2420LowPowerListening.h" + +configuration CC2420LowPowerListeningC { + provides { + interface LowPowerListening; + interface Send; + interface Receive; + interface SplitControl; + } +} + +implementation { + components MainC, + CC2420LowPowerListeningP, + CC2420DutyCycleC, + CC2420ActiveMessageC, + CC2420CsmaC, + CC2420TransmitC, + RandomC, + new StateC() as SendStateC, + new StateC() as RadioStateC, + new TimerMilliC() as OffTimerC, + new TimerMilliC() as SendDoneTimerC; + + LowPowerListening = CC2420LowPowerListeningP; + Send = CC2420LowPowerListeningP; + Receive = CC2420LowPowerListeningP; + SplitControl = CC2420DutyCycleC; + + MainC.SoftwareInit -> CC2420LowPowerListeningP; + + CC2420LowPowerListeningP.Random -> RandomC; + CC2420LowPowerListeningP.SendState -> SendStateC; + CC2420LowPowerListeningP.RadioState -> RadioStateC; + CC2420LowPowerListeningP.SplitControlState -> CC2420DutyCycleC; + CC2420LowPowerListeningP.OffTimer -> OffTimerC; + CC2420LowPowerListeningP.SendDoneTimer -> SendDoneTimerC; + CC2420LowPowerListeningP.CC2420DutyCycle -> CC2420DutyCycleC; + CC2420LowPowerListeningP.SubSend -> CC2420CsmaC; + CC2420LowPowerListeningP.Resend -> CC2420TransmitC; + CC2420LowPowerListeningP.SubReceive -> CC2420CsmaC; + CC2420LowPowerListeningP.SubControl -> CC2420CsmaC; + CC2420LowPowerListeningP.PacketAcknowledgements -> CC2420ActiveMessageC; + CC2420LowPowerListeningP.AMPacket -> CC2420ActiveMessageC; + +} + diff --git a/tos/chips/cc2420_lpl/CC2420LowPowerListeningP.nc b/tos/chips/cc2420_lpl/CC2420LowPowerListeningP.nc new file mode 100644 index 00000000..51b405ef --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420LowPowerListeningP.nc @@ -0,0 +1,505 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Low Power Listening for the CC2420 + * + * @author David Moss + */ + +#include "CC2420LowPowerListening.h" + +module CC2420LowPowerListeningP { + provides { + interface Init; + interface LowPowerListening; + interface Send; + interface Receive; + } + + uses { + interface Leds; + interface Send as SubSend; + interface CC2420Transmit as Resend; + interface Receive as SubReceive; + interface AMPacket; + interface SplitControl as SubControl; + interface CC2420DutyCycle; + interface PacketAcknowledgements; + interface State as SendState; + interface State as RadioState; + interface State as SplitControlState; + interface Random; + interface Timer as OffTimer; + interface Timer as SendDoneTimer; + } +} + +implementation { + + /** The message currently being sent */ + message_t *currentSendMsg; + + /** The length of the current send message */ + uint8_t currentSendLen; + + /** TRUE if the radio is duty cycling and not always on */ + bool dutyCycling; + + /** Tx DSN to ensure multiple transmitted messages get across only once */ + uint8_t txDsn; + + /** The last received broadcast DSN. TODO is this the best way? */ + uint8_t lastRxDsn; + + /** + * Radio State + */ + enum { + S_OFF, + S_ON, + }; + + /** + * Send States + */ + enum { + S_IDLE, + S_SENDING, + }; + + + /***************** Prototypes ***************/ + task void send(); + task void resend(); + task void startRadio(); + task void stopRadio(); + + void startOffTimer(); + cc2420_header_t *getHeader(message_t *msg); + cc2420_metadata_t *getMetadata(message_t* msg); + uint16_t getActualDutyCycle(uint16_t dutyCycle); + void signalDone(error_t error); + + /***************** Init Commands ***************/ + command error_t Init.init() { + txDsn = call Random.rand16(); + dutyCycling = FALSE; + return SUCCESS; + } + + /***************** LowPowerListening Commands ***************/ + /** + * Set this this node's radio sleep interval, in milliseconds. + * Once every interval, the node will sleep and perform an Rx check + * on the radio. Setting the sleep interval to 0 will keep the radio + * always on. + * + * This is the equivalent of setting the local duty cycle rate. + * + * @param sleepIntervalMs the length of this node's Rx check interval, in [ms] + */ + command void LowPowerListening.setLocalSleepInterval( + uint16_t sleepIntervalMs) { + call CC2420DutyCycle.setSleepInterval(sleepIntervalMs); + } + + /** + * @return the local node's sleep interval, in [ms] + */ + command uint16_t LowPowerListening.getLocalSleepInterval() { + return call CC2420DutyCycle.getSleepInterval(); + } + + /** + * Set this node's radio duty cycle rate, in units of [percentage*100]. + * For example, to get a 0.05% duty cycle, + * + * call LowPowerListening.setDutyCycle(5); // or equivalently... + * call LowPowerListening.setDutyCycle(00005); // for better readability? + * + * + * For a 100% duty cycle (always on), + * + * call LowPowerListening.setDutyCycle(10000); + * + * + * This is the equivalent of setting the local sleep interval explicitly. + * + * @param dutyCycle The duty cycle percentage, in units of [percentage*100] + */ + command void LowPowerListening.setLocalDutyCycle(uint16_t dutyCycle) { + call CC2420DutyCycle.setSleepInterval( + call LowPowerListening.dutyCycleToSleepInterval(dutyCycle)); + } + + /** + * @return this node's radio duty cycle rate, in units of [percentage*100] + */ + command uint16_t LowPowerListening.getLocalDutyCycle() { + return call LowPowerListening.sleepIntervalToDutyCycle( + call CC2420DutyCycle.getSleepInterval()); + } + + + /** + * Configure this outgoing message so it can be transmitted to a neighbor mote + * with the specified Rx sleep interval. + * @param msg Pointer to the message that will be sent + * @param sleepInterval The receiving node's sleep interval, in [ms] + */ + command void LowPowerListening.setRxSleepInterval(message_t *msg, + uint16_t sleepIntervalMs) { + getMetadata(msg)->rxInterval = sleepIntervalMs; + } + + /** + * @return the destination node's sleep interval configured in this message + */ + command uint16_t LowPowerListening.getRxSleepInterval(message_t *msg) { + return getMetadata(msg)->rxInterval; + } + + /** + * Configure this outgoing message so it can be transmitted to a neighbor mote + * with the specified Rx duty cycle rate. + * Duty cycle is in units of [percentage*100], i.e. 0.25% duty cycle = 25. + * + * @param msg Pointer to the message that will be sent + * @param dutyCycle The duty cycle of the receiving mote, in units of + * [percentage*100] + */ + command void LowPowerListening.setRxDutyCycle(message_t *msg, + uint16_t dutyCycle) { + getMetadata(msg)->rxInterval = + call LowPowerListening.dutyCycleToSleepInterval(dutyCycle); + } + + + /** + * @return the destination node's duty cycle configured in this message + * in units of [percentage*100] + */ + command uint16_t LowPowerListening.getRxDutyCycle(message_t *msg) { + return call LowPowerListening.sleepIntervalToDutyCycle( + getMetadata(msg)->rxInterval); + } + + /** + * Convert a duty cycle, in units of [percentage*100], to + * the sleep interval of the mote in milliseconds + * @param dutyCycle The duty cycle in units of [percentage*100] + * @return The equivalent sleep interval, in units of [ms] + */ + command uint16_t LowPowerListening.dutyCycleToSleepInterval( + uint16_t dutyCycle) { + dutyCycle = getActualDutyCycle(dutyCycle); + + if(dutyCycle == 10000) { + return 0; + } + + return (DUTY_ON_TIME * (10000 - dutyCycle)) / dutyCycle; + } + + /** + * Convert a sleep interval, in units of [ms], to a duty cycle + * in units of [percentage*100] + * @param sleepInterval The sleep interval in units of [ms] + * @return The duty cycle in units of [percentage*100] + */ + command uint16_t LowPowerListening.sleepIntervalToDutyCycle( + uint16_t sleepInterval) { + if(sleepInterval == 0) { + return 10000; + } + + return getActualDutyCycle((DUTY_ON_TIME * 10000) + / (sleepInterval + DUTY_ON_TIME)); + } + + + /***************** Send Commands ***************/ + /** + * Each call to this send command gives the message a single + * DSN that does not change for every copy of the message + * sent out. For messages that are not acknowledged, such as + * a broadcast address message, the receiving end does not + * signal receive() more than once for that message. + */ + command error_t Send.send(message_t *msg, uint8_t len) { + if(call SplitControlState.getState() == S_OFF) { + // Everything is off right now, start SplitControl and try again + return EOFF; + } + + if(call SendState.requestState(S_SENDING) == SUCCESS) { + currentSendMsg = msg; + currentSendLen = len; + (getHeader(msg))->dsn = ++txDsn; + + // In case our off timer is running... + call OffTimer.stop(); + + if(call RadioState.getState() == S_ON) { + if(call LowPowerListening.getRxSleepInterval(currentSendMsg) + > ONE_MESSAGE) { + // Send it repetitively within our transmit window + call PacketAcknowledgements.requestAck(currentSendMsg); + call SendDoneTimer.startOneShot( + call LowPowerListening.getRxSleepInterval(currentSendMsg) * 2); + } + + post send(); + + } else { + post startRadio(); + } + + return SUCCESS; + } + + return FAIL; + } + + command error_t Send.cancel(message_t *msg) { + if(currentSendMsg == msg) { + call SendState.toIdle(); + return SUCCESS; + } + + return FAIL; + } + + + command uint8_t Send.maxPayloadLength() { + return call SubSend.maxPayloadLength(); + } + + command void *Send.getPayload(message_t* msg) { + return call SubSend.getPayload(msg); + } + + /***************** Receive Commands ***************/ + command void *Receive.getPayload(message_t* msg, uint8_t* len) { + return call SubReceive.getPayload(msg, len); + } + + command uint8_t Receive.payloadLength(message_t* msg) { + return call SubReceive.payloadLength(msg); + } + + + /***************** DutyCycle Events ***************/ + /** + * A transmitter was detected. You must now take action to + * turn the radio off when the transaction is complete. + */ + event void CC2420DutyCycle.detected() { + // At this point, the duty cycling has been disabled temporary + // and it will be this component's job to turn the radio back off + + startOffTimer(); + } + + + /***************** SubControl Events ***************/ + event void SubControl.startDone(error_t error) { + if(!error) { + call RadioState.forceState(S_ON); + + if(call SendState.getState() == S_SENDING) { + if(call LowPowerListening.getRxSleepInterval(currentSendMsg) + > ONE_MESSAGE) { + // Send it repetitively within our transmit window + call PacketAcknowledgements.requestAck(currentSendMsg); + call SendDoneTimer.startOneShot( + call LowPowerListening.getRxSleepInterval(currentSendMsg) * 2); + } + + post send(); + } + } + } + + event void SubControl.stopDone(error_t error) { + if(!error) { + call RadioState.forceState(S_OFF); + + if(call SendState.getState() == S_SENDING) { + // We're in the middle of sending a message; start the radio back up + post startRadio(); + } + } + } + + /***************** SubSend Events ***************/ + event void SubSend.sendDone(message_t* msg, error_t error) { + if(call SendState.getState() == S_SENDING + && call SendDoneTimer.isRunning()) { + if(call PacketAcknowledgements.wasAcked(msg)) { + signalDone(error); + + } else { + post resend(); + } + + return; + } + + signalDone(error); + } + + /***************** SubReceive Events ***************/ + /** + * If the received message is new, we signal the receive event and + * start the off timer. If the last message we received had the same + * DSN as this message, then the chances are pretty good + * that this message should be ignored, especially if the destination address + * as the broadcast address + * + * TODO + * What happens if a unicast Tx doesn't get Rx's ack, and resends that + * message? + */ + event message_t *SubReceive.receive(message_t* msg, void* payload, + uint8_t len) { + + if((getHeader(msg))->dsn == lastRxDsn + && call AMPacket.destination(msg) == AM_BROADCAST_ADDR) { + // Already got this broadcast message. + // TODO should we do something similar with unicast messages? + return msg; + + } else { + lastRxDsn = (getHeader(msg))->dsn; + startOffTimer(); + return signal Receive.receive(msg, payload, len); + } + } + + /***************** Timer Events ****************/ + event void OffTimer.fired() { + /* + * Only stop the radio if the radio is supposed to be off permanently + * or if the duty cycle is on and our sleep interval is not 0 + */ + if(call SplitControlState.getState() == S_OFF + || (call CC2420DutyCycle.getSleepInterval() > 0 + && call SplitControlState.getState() == S_ON)) { + post stopRadio(); + } + } + + /** + * When this timer is running, that means we're sending repeating messages + * to a node that is receive check duty cycling. + */ + event void SendDoneTimer.fired() { + if(call SendState.getState() == S_SENDING) { + // The next time SubSend.sendDone is signaled, send is complete. + call SendState.toIdle(); + } + } + + /***************** Resend Events ****************/ + /** + * Signal that a message has been sent + * + * @param p_msg message to send. + * @param error notifaction of how the operation went. + */ + async event void Resend.sendDone( message_t* p_msg, error_t error ) { + // This is actually caught by SubSend.sendDone + } + + + /***************** Tasks ***************/ + task void send() { + if(call SubSend.send(currentSendMsg, currentSendLen) != SUCCESS) { + post send(); + } + } + + task void resend() { + // Resend the last message without CCA checks. + if(call Resend.resend() != SUCCESS) { + post resend(); + } + } + + task void startRadio() { + if(call SubControl.start() != SUCCESS) { + post startRadio(); + } + } + + task void stopRadio() { + if(call SubControl.stop() != SUCCESS) { + post stopRadio(); + } + } + + /***************** Functions ***************/ + void startOffTimer() { + call OffTimer.startOneShot(DELAY_AFTER_RECEIVE); + } + + /** + * Check the bounds on a given duty cycle + * We're never over 100%, and we're never at 0% + */ + uint16_t getActualDutyCycle(uint16_t dutyCycle) { + if(dutyCycle > 10000) { + return 10000; + } else if(dutyCycle == 0) { + return 1; + } + + return dutyCycle; + } + + cc2420_header_t *getHeader(message_t *msg) { + return (cc2420_header_t *)(msg->data - sizeof( cc2420_header_t )); + } + + cc2420_metadata_t *getMetadata(message_t* msg) { + return (cc2420_metadata_t*)msg->metadata; + } + + void signalDone(error_t error) { + call SendState.toIdle(); + startOffTimer(); + signal Send.sendDone(currentSendMsg, error); + currentSendMsg = NULL; + } +} + diff --git a/tos/chips/cc2420_lpl/CC2420LplDummyP.nc b/tos/chips/cc2420_lpl/CC2420LplDummyP.nc new file mode 100644 index 00000000..63f5c26f --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420LplDummyP.nc @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Dummy low power listening interface used when LowPowerListening is not + * compiled in with the application. + * Sleep interval is always 0, and duty cycle is always 100% + * @author David Moss + */ + +module CC2420LplDummyP { + provides { + interface LowPowerListening; + } +} + +implementation { + + command void LowPowerListening.setLocalSleepInterval(uint16_t sleepIntervalMs) { + } + + command uint16_t LowPowerListening.getLocalSleepInterval() { + return 0; + } + + command void LowPowerListening.setLocalDutyCycle(uint16_t dutyCycle) { + } + + command uint16_t LowPowerListening.getLocalDutyCycle() { + return 10000; + } + + command void LowPowerListening.setRxSleepInterval(message_t *msg, uint16_t sleepIntervalMs) { + } + + command uint16_t LowPowerListening.getRxSleepInterval(message_t *msg) { + return 0; + } + + command void LowPowerListening.setRxDutyCycle(message_t *msg, uint16_t dutyCycle) { + } + + command uint16_t LowPowerListening.getRxDutyCycle(message_t *msg) { + return 10000; + } + + command uint16_t LowPowerListening.dutyCycleToSleepInterval(uint16_t dutyCycle) { + return 0; + } + + command uint16_t LowPowerListening.sleepIntervalToDutyCycle(uint16_t sleepInterval) { + return 10000; + } + +} + diff --git a/tos/chips/cc2420_lpl/CC2420Packet.nc b/tos/chips/cc2420_lpl/CC2420Packet.nc new file mode 100644 index 00000000..5eee2aef --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420Packet.nc @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +interface CC2420Packet { + + /** + * Get transmission power setting for current packet. + * + * @param the message + */ + async command uint8_t getPower( message_t* p_msg ); + + /** + * Set transmission power for a given packet. Valid ranges are + * between 0 and 31. + * + * @param p_msg the message. + * @param power transmission power. + */ + async command void setPower( message_t* p_msg, uint8_t power ); + + /** + * Get rssi value for a given packet. For received packets, it is + * the received signal strength when receiving that packet. For sent + * packets, it is the received signal strength of the ack if an ack + * was received. + */ + async command int8_t getRssi( message_t* p_msg ); + + /** + * Get lqi value for a given packet. For received packets, it is the + * link quality indicator value when receiving that packet. For sent + * packets, it is the link quality indicator value of the ack if an + * ack was received. + */ + async command uint8_t getLqi( message_t* p_msg ); + +} diff --git a/tos/chips/cc2420_lpl/CC2420PacketC.nc b/tos/chips/cc2420_lpl/CC2420PacketC.nc new file mode 100644 index 00000000..84c5ceb2 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420PacketC.nc @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +module CC2420PacketC { + + provides interface CC2420Packet; + provides interface PacketAcknowledgements as Acks; + +} + +implementation { + + cc2420_header_t* getHeader( message_t* msg ) { + return (cc2420_header_t*)( msg->data - sizeof( cc2420_header_t ) ); + } + + cc2420_metadata_t* getMetadata( message_t* msg ) { + return (cc2420_metadata_t*)msg->metadata; + } + + async command error_t Acks.requestAck( message_t* p_msg ) { + getHeader( p_msg )->fcf |= 1 << IEEE154_FCF_ACK_REQ; + return SUCCESS; + } + + async command error_t Acks.noAck( message_t* p_msg ) { + getHeader( p_msg )->fcf &= ~(1 << IEEE154_FCF_ACK_REQ); + return SUCCESS; + } + + async command bool Acks.wasAcked( message_t* p_msg ) { + return getMetadata( p_msg )->ack; + } + + async command void CC2420Packet.setPower( message_t* p_msg, uint8_t power ) { + if ( power > 31 ) + power = 31; + getMetadata( p_msg )->tx_power = power; + } + + async command uint8_t CC2420Packet.getPower( message_t* p_msg ) { + return getMetadata( p_msg )->tx_power; + } + + async command int8_t CC2420Packet.getRssi( message_t* p_msg ) { + return getMetadata( p_msg )->rssi; + } + + async command error_t CC2420Packet.getLqi( message_t* p_msg ) { + return getMetadata( p_msg )->lqi; + } + +} diff --git a/tos/chips/cc2420_lpl/CC2420Power.nc b/tos/chips/cc2420_lpl/CC2420Power.nc new file mode 100644 index 00000000..0fcfedf9 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420Power.nc @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * An HAL abstraction of the ChipCon CC2420 radio. This abstraction + * deals specifically with radio power operations (e.g. voltage + * regulator, oscillator, etc). However, it does not include + * transmission power, see the CC2420Config interface. + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +interface CC2420Power { + + /** + * Start the voltage regulator on the CC2420. On SUCCESS, + * startVReg() will be signalled when the voltage + * regulator is fully on. + * + * @return SUCCESS if the request was accepted, FAIL otherwise. + */ + async command error_t startVReg(); + + /** + * Signals that the voltage regulator has been started. + */ + async event void startVRegDone(); + + /** + * Stop the voltage regulator immediately. + * + * @return SUCCESS always + */ + async command error_t stopVReg(); + + /** + * Start the oscillator. On SUCCESS, startOscillator + * will be signalled when the oscillator has been started. + * + * @return SUCCESS if the request was accepted, FAIL otherwise. + */ + async command error_t startOscillator(); + + /** + * Signals that the oscillator has been started. + */ + async event void startOscillatorDone(); + + /** + * Stop the oscillator. + * + * @return SUCCESS if the oscillator was stopped, FAIL otherwise. + */ + async command error_t stopOscillator(); + + /** + * Enable RX. + * + * @return SUCCESS if receive mode has been enabled, FAIL otherwise. + */ + async command error_t rxOn(); + + /** + * Disable RX. + * + * @return SUCCESS if receive mode has been disabled, FAIL otherwise. + */ + async command error_t rfOff(); + +} diff --git a/tos/chips/cc2420_lpl/CC2420Ram.nc b/tos/chips/cc2420_lpl/CC2420Ram.nc new file mode 100644 index 00000000..fce50282 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420Ram.nc @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * HAL abstraction for accessing theRAM of a ChipCon CC2420 radio. + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include "CC2420.h" + +interface CC2420Ram { + + /** + * Read data from a RAM. This operation is sychronous. + * + * @param offset within the field. + * @param data a pointer to the receive buffer. + * @param length number of bytes to read. + * @return status byte returned when sending the last byte + * of the SPI transaction. + */ + async command cc2420_status_t read( uint8_t offset, uint8_t* data, uint8_t length ); + + /** + * Write data to RAM. This operation is sychronous. + * + * @param offset within the field. + * @param data a pointer to the send buffer. + * @param length number of bytes to write. + * @return status byte returned when sending the last address byte + * of the SPI transaction. + */ + async command cc2420_status_t write( uint8_t offset, uint8_t* data, uint8_t length ); + +} diff --git a/tos/chips/cc2420_lpl/CC2420Receive.nc b/tos/chips/cc2420_lpl/CC2420Receive.nc new file mode 100644 index 00000000..47cb15dc --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420Receive.nc @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Low-level abstraction of the receive path implementation for the + * ChipCon CC2420 radio. + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +interface CC2420Receive { + + /** + * Notification that an SFD capture has occured. + * + * @param time at which the capture happened. + */ + async command void sfd( uint16_t time ); + + /** + * Notification that the packet has been dropped by the radio + * (e.g. due to address rejection). + */ + async command void sfd_dropped(); + + /** + * Signals that a message has been received. + * + * @param type of the message received. + * @param message pointer to message received. + */ + async event void receive( uint8_t type, message_t* message ); + +} + diff --git a/tos/chips/cc2420_lpl/CC2420ReceiveC.nc b/tos/chips/cc2420_lpl/CC2420ReceiveC.nc new file mode 100644 index 00000000..f9b1b715 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420ReceiveC.nc @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Implementation of the receive path for the ChipCon CC2420 radio. + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +configuration CC2420ReceiveC { + + provides interface Init; + provides interface AsyncStdControl; + provides interface CC2420Receive; + provides interface Receive; + +} + +implementation { + + components CC2420ReceiveP; + components new CC2420SpiC() as Spi; + + components HplCC2420PinsC as Pins; + components HplCC2420InterruptsC as InterruptsC; + + components LedsC as Leds; + CC2420ReceiveP.Leds -> Leds; + + Init = CC2420ReceiveP; + AsyncStdControl = CC2420ReceiveP; + CC2420Receive = CC2420ReceiveP; + Receive = CC2420ReceiveP; + + CC2420ReceiveP.CSN -> Pins.CSN; + CC2420ReceiveP.FIFO -> Pins.FIFO; + CC2420ReceiveP.FIFOP -> Pins.FIFOP; + CC2420ReceiveP.InterruptFIFOP -> InterruptsC.InterruptFIFOP; + + CC2420ReceiveP.SpiResource -> Spi; + CC2420ReceiveP.RXFIFO -> Spi.RXFIFO; + CC2420ReceiveP.SFLUSHRX -> Spi.SFLUSHRX; + +} diff --git a/tos/chips/cc2420_lpl/CC2420ReceiveP.nc b/tos/chips/cc2420_lpl/CC2420ReceiveP.nc new file mode 100644 index 00000000..f7f59aa5 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420ReceiveP.nc @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +module CC2420ReceiveP { + + provides interface Init; + provides interface AsyncStdControl; + provides interface CC2420Receive; + provides interface Receive; + + uses interface GeneralIO as CSN; + uses interface GeneralIO as FIFO; + uses interface GeneralIO as FIFOP; + uses interface GpioInterrupt as InterruptFIFOP; + + uses interface Resource as SpiResource; + uses interface CC2420Fifo as RXFIFO; + uses interface CC2420Strobe as SACK; + uses interface CC2420Strobe as SFLUSHRX; + + uses interface Leds; + +} + +implementation { + + typedef enum { + S_STOPPED, + S_STARTED, + S_RX_HEADER, + S_RX_PAYLOAD, + } cc2420_receive_state_t; + + enum { + RXFIFO_SIZE = 128, + TIMESTAMP_QUEUE_SIZE = 8, + }; + + uint16_t m_timestamp_queue[ TIMESTAMP_QUEUE_SIZE ]; + uint8_t m_timestamp_head, m_timestamp_size; + uint8_t m_missed_packets; + + bool fallingEdgeEnabled; + + norace uint8_t m_bytes_left; + norace message_t* m_p_rx_buf; + + message_t m_rx_buf; + cc2420_receive_state_t m_state; + + void beginReceive(); + void receive(); + void waitForNextPacket(); + task void receiveDone_task(); + + cc2420_header_t* getHeader( message_t* msg ) { + return (cc2420_header_t*)( msg->data - sizeof( cc2420_header_t ) ); + } + + cc2420_metadata_t* getMetadata( message_t* msg ) { + return (cc2420_metadata_t*)msg->metadata; + } + + command error_t Init.init() { + fallingEdgeEnabled = FALSE; + m_p_rx_buf = &m_rx_buf; + return SUCCESS; + } + + void reset_state() { + m_bytes_left = RXFIFO_SIZE; + m_timestamp_head = m_timestamp_size = 0; + m_missed_packets = 0; + } + + async command error_t AsyncStdControl.start() { + atomic { + reset_state(); + m_state = S_STARTED; + + // MicaZ's don't like to re-enable the falling edge + if(!fallingEdgeEnabled) { + call InterruptFIFOP.enableFallingEdge(); + fallingEdgeEnabled = TRUE; + } + } + return SUCCESS; + } + + async command error_t AsyncStdControl.stop() { + atomic { + m_state = S_STOPPED; + // MicaZ's don't like to re-enable the falling edge + //call InterruptFIFOP.disable(); + } + return SUCCESS; + } + + async command void CC2420Receive.sfd( uint16_t time ) { + if ( m_timestamp_size < TIMESTAMP_QUEUE_SIZE ) { + uint8_t tail = ( ( m_timestamp_head + m_timestamp_size ) % + TIMESTAMP_QUEUE_SIZE ); + m_timestamp_queue[ tail ] = time; + m_timestamp_size++; + } + } + + async command void CC2420Receive.sfd_dropped() { + if ( m_timestamp_size ) + m_timestamp_size--; + } + + async event void InterruptFIFOP.fired() { + if ( m_state == S_STARTED ) + beginReceive(); + else + m_missed_packets++; + } + + void beginReceive() { + m_state = S_RX_HEADER; + if ( call SpiResource.immediateRequest() == SUCCESS ) + receive(); + else + call SpiResource.request(); + } + + event void SpiResource.granted() { + receive(); + } + + void receive() { + call CSN.clr(); + call RXFIFO.beginRead( (uint8_t*)getHeader( m_p_rx_buf ), 1 ); + } + + async event void RXFIFO.readDone( uint8_t* rx_buf, uint8_t rx_len, + error_t error ) { + + cc2420_header_t* header = getHeader( m_p_rx_buf ); + cc2420_metadata_t* metadata = getMetadata( m_p_rx_buf ); + uint8_t* buf = (uint8_t*)header; + uint8_t length = buf[ 0 ]; + + switch( m_state ) { + + case S_RX_HEADER: + m_state = S_RX_PAYLOAD; + if ( length + 1 > m_bytes_left ) { + reset_state(); + call CSN.set(); + call CSN.clr(); + call SFLUSHRX.strobe(); + call SFLUSHRX.strobe(); + call CSN.set(); + call SpiResource.release(); + waitForNextPacket(); + } + else { + if ( !call FIFO.get() && !call FIFOP.get() ) + m_bytes_left -= length + 1; + call RXFIFO.continueRead( (length <= MAC_PACKET_SIZE) ? buf + 1 : NULL, + length ); + } + break; + + case S_RX_PAYLOAD: + + call CSN.set(); + call SpiResource.release(); + + if ( m_timestamp_size ) { + if ( length > 10 ) { + metadata->time = m_timestamp_queue[ m_timestamp_head ]; + m_timestamp_head = ( m_timestamp_head + 1 ) % TIMESTAMP_QUEUE_SIZE; + m_timestamp_size--; + } + } + else { + metadata->time = 0xffff; + } + + // pass packet up if crc is good + if ( ( buf[ length ] >> 7 ) && rx_buf ) { + uint8_t type = ( header->fcf >> IEEE154_FCF_FRAME_TYPE ) & 7; + signal CC2420Receive.receive( type, m_p_rx_buf ); + if ( type == IEEE154_TYPE_DATA ) { + post receiveDone_task(); + return; + } + } + + waitForNextPacket(); + break; + + default: + call CSN.set(); + call SpiResource.release(); + break; + + } + + } + + task void receiveDone_task() { + + cc2420_header_t* header = getHeader( m_p_rx_buf ); + cc2420_metadata_t* metadata = getMetadata( m_p_rx_buf ); + uint8_t* buf = (uint8_t*)header; + uint8_t length = buf[ 0 ]; + + metadata->crc = buf[ length ] >> 7; + metadata->rssi = buf[ length - 1 ]; + metadata->lqi = buf[ length ] & 0x7f; + m_p_rx_buf = signal Receive.receive( m_p_rx_buf, m_p_rx_buf->data, + length ); + + waitForNextPacket(); + + } + + void waitForNextPacket() { + + atomic { + if ( m_state == S_STOPPED ) + return; + + if ( ( m_missed_packets && call FIFO.get() ) || !call FIFOP.get() ) { + if ( m_missed_packets ) + m_missed_packets--; + beginReceive(); + } + else { + m_state = S_STARTED; + m_missed_packets = 0; + } + } + + } + + command void* Receive.getPayload(message_t* m, uint8_t* len) { + if (len != NULL) { + *len = TOSH_DATA_LENGTH; + } + return m->data; + } + + command uint8_t Receive.payloadLength(message_t* m) { + uint8_t* buf = (uint8_t*)getHeader( m_p_rx_buf ); + return buf[0]; + } + + async event void RXFIFO.writeDone( uint8_t* tx_buf, uint8_t tx_len, error_t error ) {} +} diff --git a/tos/chips/cc2420_lpl/CC2420Register.nc b/tos/chips/cc2420_lpl/CC2420Register.nc new file mode 100644 index 00000000..5a95aee0 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420Register.nc @@ -0,0 +1,57 @@ +/* tab:4 + * "Copyright (c) 2005 Stanford University. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose, without fee, and without written + * agreement is hereby granted, provided that the above copyright + * notice, the following two paragraphs and the author appear in all + * copies of this software. + * + * IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF STANFORD UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * STANFORD UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE + * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND STANFORD UNIVERSITY + * HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + * ENHANCEMENTS, OR MODIFICATIONS." + * + */ + +/** + * Interface representing one of the Read/Write registers on the + * CC2420 radio. The return values (when appropriate) refer to the + * status byte returned on the CC2420 SO pin. A full list of RW + * registers can be found on page 61 of the CC2420 datasheet (rev + * 1.2). Page 25 of the same document describes the protocol for + * interacting with these registers over the CC2420 SPI bus. + * + * @author Philip Levis + * @version $Revision$ $Date$ + */ + +#include "CC2420.h" + +interface CC2420Register { + + /** + * Read a 16-bit data word from the register. + * + * @param data pointer to place the register value. + * @return status byte from the read. + */ + async command cc2420_status_t read(uint16_t* data); + + /** + * Write a 16-bit data word to the register. + * + * @param data value to write to register. + * @return status byte from the write. + */ + async command cc2420_status_t write(uint16_t data); + +} diff --git a/tos/chips/cc2420_lpl/CC2420SpiC.nc b/tos/chips/cc2420_lpl/CC2420SpiC.nc new file mode 100644 index 00000000..7e35a93b --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420SpiC.nc @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Implementation of basic SPI primitives for the ChipCon CC2420 radio. + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +generic configuration CC2420SpiC() { + + provides interface Resource; + + // commands + provides interface CC2420Strobe as SFLUSHRX; + provides interface CC2420Strobe as SFLUSHTX; + provides interface CC2420Strobe as SNOP; + provides interface CC2420Strobe as SRXON; + provides interface CC2420Strobe as SRFOFF; + provides interface CC2420Strobe as STXON; + provides interface CC2420Strobe as STXONCCA; + provides interface CC2420Strobe as SXOSCON; + provides interface CC2420Strobe as SXOSCOFF; + + // registers + provides interface CC2420Register as FSCTRL; + provides interface CC2420Register as IOCFG0; + provides interface CC2420Register as IOCFG1; + provides interface CC2420Register as MDMCTRL0; + provides interface CC2420Register as MDMCTRL1; + provides interface CC2420Register as TXCTRL; + + // ram + provides interface CC2420Ram as IEEEADR; + provides interface CC2420Ram as PANID; + provides interface CC2420Ram as SHORTADR; + provides interface CC2420Ram as TXFIFO_RAM; + + // fifos + provides interface CC2420Fifo as RXFIFO; + provides interface CC2420Fifo as TXFIFO; + +} + +implementation { + + enum { + CLIENT_ID = unique( "CC2420Spi.Resource" ), + }; + + components HplCC2420PinsC as Pins; + components CC2420SpiP as Spi; + + Resource = Spi.Resource[ CLIENT_ID ]; + + // commands + SFLUSHRX = Spi.Strobe[ CC2420_SFLUSHRX ]; + SFLUSHTX = Spi.Strobe[ CC2420_SFLUSHTX ]; + SNOP = Spi.Strobe[ CC2420_SNOP ]; + SRXON = Spi.Strobe[ CC2420_SRXON ]; + SRFOFF = Spi.Strobe[ CC2420_SRFOFF ]; + STXON = Spi.Strobe[ CC2420_STXON ]; + STXONCCA = Spi.Strobe[ CC2420_STXONCCA ]; + SXOSCON = Spi.Strobe[ CC2420_SXOSCON ]; + SXOSCOFF = Spi.Strobe[ CC2420_SXOSCOFF ]; + + // registers + FSCTRL = Spi.Reg[ CC2420_FSCTRL ]; + IOCFG0 = Spi.Reg[ CC2420_IOCFG0 ]; + IOCFG1 = Spi.Reg[ CC2420_IOCFG1 ]; + MDMCTRL0 = Spi.Reg[ CC2420_MDMCTRL0 ]; + MDMCTRL1 = Spi.Reg[ CC2420_MDMCTRL1 ]; + TXCTRL = Spi.Reg[ CC2420_TXCTRL ]; + + // ram + IEEEADR = Spi.Ram[ CC2420_RAM_IEEEADR ]; + PANID = Spi.Ram[ CC2420_RAM_PANID ]; + SHORTADR = Spi.Ram[ CC2420_RAM_SHORTADR ]; + TXFIFO_RAM = Spi.Ram[ CC2420_RAM_TXFIFO ]; + + // fifos + RXFIFO = Spi.Fifo[ CC2420_RXFIFO ]; + TXFIFO = Spi.Fifo[ CC2420_TXFIFO ]; + +} + diff --git a/tos/chips/cc2420_lpl/CC2420SpiImplP.nc b/tos/chips/cc2420_lpl/CC2420SpiImplP.nc new file mode 100644 index 00000000..75adec49 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420SpiImplP.nc @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +module CC2420SpiImplP { + + provides interface Resource[ uint8_t id ]; + provides interface CC2420Fifo as Fifo[ uint8_t id ]; + provides interface CC2420Ram as Ram[ uint16_t id ]; + provides interface CC2420Register as Reg[ uint8_t id ]; + provides interface CC2420Strobe as Strobe[ uint8_t id ]; + + uses interface Resource as SpiResource; + uses interface SpiByte; + uses interface SpiPacket; + uses interface Leds; + +} + +implementation { + + enum { + RESOURCE_COUNT = uniqueCount( "CC2420Spi.Resource" ), + NO_HOLDER = 0xff, + }; + + norace uint16_t m_addr; + bool m_resource_busy = FALSE; + uint8_t m_requests = 0; + uint8_t m_holder = NO_HOLDER; + + default event void Resource.granted[ uint8_t id ]() { + } + + async command error_t Resource.request[ uint8_t id ]() { + atomic { + if ( m_resource_busy ) + m_requests |= 1 << id; + else { + m_holder = id; + m_resource_busy = TRUE; + call SpiResource.request(); + } + } + return SUCCESS; + } + + async command error_t Resource.immediateRequest[ uint8_t id ]() { + error_t error; + atomic { + if ( m_resource_busy ) + return EBUSY; + error = call SpiResource.immediateRequest(); + if ( error == SUCCESS ) { + m_holder = id; + m_resource_busy = TRUE; + } + } + return error; + } + + async command error_t Resource.release[ uint8_t id ]() { + uint8_t i; + atomic { + if ( m_holder != id ) + return FAIL; + m_holder = NO_HOLDER; + call SpiResource.release(); + if ( !m_requests ) { + m_resource_busy = FALSE; + } + else { + for ( i = m_holder + 1; ; i++ ) { + if ( i >= RESOURCE_COUNT ) + i = 0; + if ( m_requests & ( 1 << i ) ) { + m_holder = i; + m_requests &= ~( 1 << i ); + call SpiResource.request(); + return SUCCESS; + } + } + } + return SUCCESS; + } + } + + async command uint8_t Resource.isOwner[ uint8_t id ]() { + atomic return m_holder == id; + } + + event void SpiResource.granted() { + uint8_t holder; + atomic holder = m_holder; + signal Resource.granted[ holder ](); + } + + async command cc2420_status_t Fifo.beginRead[ uint8_t addr ]( uint8_t* data, + uint8_t len ) { + + cc2420_status_t status; + + m_addr = addr | 0x40; + + status = call SpiByte.write( m_addr ); + call Fifo.continueRead[ addr ]( data, len ); + + return status; + + } + + async command error_t Fifo.continueRead[ uint8_t addr ]( uint8_t* data, + uint8_t len ) { + call SpiPacket.send( NULL, data, len ); + return SUCCESS; + } + + async command cc2420_status_t Fifo.write[ uint8_t addr ]( uint8_t* data, + uint8_t len ) { + + uint8_t status; + + m_addr = addr; + + status = call SpiByte.write( m_addr ); + call SpiPacket.send( data, NULL, len ); + + return status; + + } + + async command cc2420_status_t Ram.read[ uint16_t addr ]( uint8_t offset, + uint8_t* data, + uint8_t len ) { + + cc2420_status_t status; + + addr += offset; + + call SpiByte.write( addr | 0x80 ); + status = call SpiByte.write( ( ( addr >> 1 ) & 0xc0 ) | 0x20 ); + for ( ; len; len-- ) + *data++ = call SpiByte.write( 0 ); + + return status; + + } + + async event void SpiPacket.sendDone( uint8_t* tx_buf, uint8_t* rx_buf, + uint16_t len, error_t error ) { + if ( m_addr & 0x40 ) + signal Fifo.readDone[ m_addr & ~0x40 ]( rx_buf, len, error ); + else + signal Fifo.writeDone[ m_addr ]( tx_buf, len, error ); + } + + async command cc2420_status_t Ram.write[ uint16_t addr ]( uint8_t offset, + uint8_t* data, + uint8_t len ) { + + cc2420_status_t status = 0; + + addr += offset; + + call SpiByte.write( addr | 0x80 ); + call SpiByte.write( ( addr >> 1 ) & 0xc0 ); + for ( ; len; len-- ) + status = call SpiByte.write( *data++ ); + + return status; + + } + + async command cc2420_status_t Reg.read[ uint8_t addr ]( uint16_t* data ) { + + cc2420_status_t status; + + status = call SpiByte.write( addr | 0x40 ); + *data = (uint16_t)call SpiByte.write( 0 ) << 8; + *data |= call SpiByte.write( 0 ); + + return status; + + } + + async command cc2420_status_t Reg.write[ uint8_t addr ]( uint16_t data ) { + + call SpiByte.write( addr ); + call SpiByte.write( data >> 8 ); + return call SpiByte.write( data & 0xff ); + + } + + async command cc2420_status_t Strobe.strobe[ uint8_t addr ]() { + return call SpiByte.write( addr ); + } + + default async event void Fifo.readDone[ uint8_t addr ]( uint8_t* rx_buf, uint8_t rx_len, error_t error ) {} + default async event void Fifo.writeDone[ uint8_t addr ]( uint8_t* tx_buf, uint8_t tx_len, error_t error ) {} + +} diff --git a/tos/chips/cc2420_lpl/CC2420SpiP.nc b/tos/chips/cc2420_lpl/CC2420SpiP.nc new file mode 100644 index 00000000..dd7d4d46 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420SpiP.nc @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +configuration CC2420SpiP { + + provides interface Resource[ uint8_t id ]; + provides interface CC2420Fifo as Fifo[ uint8_t id ]; + provides interface CC2420Ram as Ram[ uint16_t id ]; + provides interface CC2420Register as Reg[ uint8_t id ]; + provides interface CC2420Strobe as Strobe[ uint8_t id ]; + +} + +implementation { + + components CC2420SpiImplP as SpiP; + Resource = SpiP; + Fifo = SpiP; + Ram = SpiP; + Reg = SpiP; + Strobe = SpiP; + + components new HplCC2420SpiC(); + SpiP.SpiResource -> HplCC2420SpiC; + SpiP.SpiByte -> HplCC2420SpiC; + SpiP.SpiPacket -> HplCC2420SpiC; + + components LedsC; + SpiP.Leds -> LedsC; + +} diff --git a/tos/chips/cc2420_lpl/CC2420Strobe.nc b/tos/chips/cc2420_lpl/CC2420Strobe.nc new file mode 100644 index 00000000..ae7ae757 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420Strobe.nc @@ -0,0 +1,47 @@ +/* tab:4 + * "Copyright (c) 2005 Stanford University. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose, without fee, and without written + * agreement is hereby granted, provided that the above copyright + * notice, the following two paragraphs and the author appear in all + * copies of this software. + * + * IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF STANFORD UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * STANFORD UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE + * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND STANFORD UNIVERSITY + * HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + * ENHANCEMENTS, OR MODIFICATIONS." + * + */ + +/** + * Interface representing one of the CC2420 command strobe registers. + * Writing to one of these registers enacts a command on the CC2420, + * such as power-up, transmission, or clear a FIFO. + * + * @author Philip Levis + * @version $Revision$ $Date$ + */ + +#include "CC2420.h" + +interface CC2420Strobe { + + /** + * Send a command strobe to the register. The return value is the + * CC2420 status register. Table 5 on page 27 of the CC2420 + * datasheet (v1.2) describes the contents of this register. + * + * @return Status byte from the CC2420. + */ + async command cc2420_status_t strobe(); + +} diff --git a/tos/chips/cc2420_lpl/CC2420Transmit.nc b/tos/chips/cc2420_lpl/CC2420Transmit.nc new file mode 100644 index 00000000..0f887b25 --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420Transmit.nc @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Low-level abstraction for the transmit path implementaiton of the + * ChipCon CC2420 radio. + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +interface CC2420Transmit { + + /** + * Send a message with CCA enabled. + * + * @param p_msg message to send. + * @return SUCCESS if the request was accepted, FAIL otherwise. + */ + async command error_t sendCCA( message_t* p_msg ); + + /** + * Send a message with CCA disabled. + * + * @param p_msg message to send. + * @return SUCCESS if the request was accepted, FAIL otherwise. + */ + async command error_t send( message_t* p_msg ); + + /** + * Send the previous message again with CCA enabled. + * + * @return SUCCESS if the request was accepted, FAIL otherwise. + */ + async command error_t resendCCA(); + + /** + * Send the previous message again with CCA disabled. + * + * @return SUCCESS if the request was accepted, FAIL otherwise. + */ + async command error_t resend(); + + /** + * Cancel sending of the message. + * + * @return SUCCESS if the request was accepted, FAIL otherwise. + */ + async command error_t cancel(); + + /** + * Signal that a message has been sent + * + * @param p_msg message to send. + * @param error notifaction of how the operation went. + */ + async event void sendDone( message_t* p_msg, error_t error ); + + /** + * Modify the contents of a packet. This command can only be used + * when an SFD capture event for the sending packet is signalled. + * + * @param offset in the message to start modifying. + * @param buf to data to write + * @param len of bytes to write + * @return SUCCESS if the request was accepted, FAIL otherwise. + */ + async command error_t modify( uint8_t offset, uint8_t* buf, uint8_t len ); + +} + diff --git a/tos/chips/cc2420_lpl/CC2420TransmitC.nc b/tos/chips/cc2420_lpl/CC2420TransmitC.nc new file mode 100644 index 00000000..442d282b --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420TransmitC.nc @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Implementation of the transmit path for the ChipCon CC2420 radio. + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include "IEEE802154.h" + +configuration CC2420TransmitC { + + provides { + interface Init; + interface AsyncStdControl; + interface CC2420Transmit; + interface CsmaBackoff; + interface RadioTimeStamping; + interface CC2420Cca; + } +} + +implementation { + + components CC2420TransmitP; + Init = Alarm; + Init = CC2420TransmitP; + AsyncStdControl = CC2420TransmitP; + CC2420Transmit = CC2420TransmitP; + CsmaBackoff = CC2420TransmitP; + RadioTimeStamping = CC2420TransmitP; + CC2420Cca = CC2420TransmitP; + + components AlarmMultiplexC as Alarm; + CC2420TransmitP.BackoffTimer -> Alarm; + +#ifdef PLATFORM_MICAZ + components new TimerMilliC() as WatchdogTimerC; + CC2420TransmitP.WatchdogTimer -> WatchdogTimerC; +#endif + + components HplCC2420PinsC as Pins; + CC2420TransmitP.CCA -> Pins.CCA; + CC2420TransmitP.CSN -> Pins.CSN; + CC2420TransmitP.SFD -> Pins.SFD; + + components HplCC2420InterruptsC as Interrupts; + CC2420TransmitP.CaptureSFD -> Interrupts.CaptureSFD; + + components new CC2420SpiC() as Spi; + CC2420TransmitP.SpiResource -> Spi; + CC2420TransmitP.SNOP -> Spi.SNOP; + CC2420TransmitP.STXON -> Spi.STXON; + CC2420TransmitP.STXONCCA -> Spi.STXONCCA; + CC2420TransmitP.SFLUSHTX -> Spi.SFLUSHTX; + CC2420TransmitP.TXCTRL -> Spi.TXCTRL; + CC2420TransmitP.TXFIFO -> Spi.TXFIFO; + CC2420TransmitP.TXFIFO_RAM -> Spi.TXFIFO_RAM; + + components CC2420ReceiveC; + CC2420TransmitP.CC2420Receive -> CC2420ReceiveC; + + components LedsC as Leds; + CC2420TransmitP.Leds -> Leds; + +} diff --git a/tos/chips/cc2420_lpl/CC2420TransmitP.nc b/tos/chips/cc2420_lpl/CC2420TransmitP.nc new file mode 100644 index 00000000..9aa7c13a --- /dev/null +++ b/tos/chips/cc2420_lpl/CC2420TransmitP.nc @@ -0,0 +1,575 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include "IEEE802154.h" + +module CC2420TransmitP { + + provides interface Init; + provides interface AsyncStdControl; + provides interface CC2420Transmit as Send; + provides interface CsmaBackoff; + provides interface RadioTimeStamping as TimeStamp; + provides interface CC2420Cca; + + uses interface Alarm as BackoffTimer; + +#ifdef PLATFORM_MICAZ + uses interface Timer as WatchdogTimer; +#endif + + uses interface GpioCapture as CaptureSFD; + uses interface GeneralIO as CCA; + uses interface GeneralIO as CSN; + uses interface GeneralIO as SFD; + + uses interface Resource as SpiResource; + uses interface CC2420Fifo as TXFIFO; + uses interface CC2420Ram as TXFIFO_RAM; + uses interface CC2420Register as TXCTRL; + uses interface CC2420Strobe as SNOP; + uses interface CC2420Strobe as STXON; + uses interface CC2420Strobe as STXONCCA; + uses interface CC2420Strobe as SFLUSHTX; + + uses interface CC2420Receive; + uses interface Leds; + +} + +implementation { + + typedef enum { + S_STOPPED, + S_STARTED, + S_LOAD, + S_SAMPLE_CCA, + S_SAMPLE_CCA_ONLY, + S_BEGIN_TRANSMIT, + S_SFD, + S_EFD, + S_ACK_WAIT, + S_CANCEL, + } cc2420_transmit_state_t; + + // This specifies how many jiffies the stack should wait after a + // TXACTIVE to receive an SFD interrupt before assuming something is + // wrong and aborting the send. There seems to be a condition + // on the micaZ where the SFD interrupt is never handled. + enum { + CC2420_ABORT_PERIOD = 320 + }; + + norace message_t* m_msg; + + norace bool m_cca; + + norace uint8_t m_tx_power; + + cc2420_transmit_state_t m_state = S_STOPPED; + + bool m_receiving = FALSE; + + uint16_t m_prev_time; + + + /***************** Prototypes ****************/ + void loadTXFIFO(); + void attemptSend(); + cc2420_header_t* getHeader( message_t* msg ); + cc2420_metadata_t* getMetadata( message_t* msg ); + void startBackoffTimer(uint16_t time); + void stopBackoffTimer(); + error_t acquireSpiResource(); + void releaseSpiResource(); + void signalDone(error_t err); + void congestionBackoff(); + error_t send( message_t* p_msg, bool cca ); + error_t resend( bool cca ); + +#ifdef PLATFORM_MICAZ + task void startWatchdogTimer(); + task void stopWatchdogTimer(); +#endif + + + /***************** Init Commands ****************/ + command error_t Init.init() { + call CCA.makeInput(); + call CSN.makeOutput(); + call SFD.makeInput(); + return SUCCESS; + } + + /***************** AsyncStdControl Commands ****************/ + async command error_t AsyncStdControl.start() { + atomic { + call CaptureSFD.captureRisingEdge(); + m_state = S_STARTED; + m_receiving = FALSE; + m_tx_power = 0; + } + return SUCCESS; + } + + async command error_t AsyncStdControl.stop() { + atomic { + m_state = S_STOPPED; + stopBackoffTimer(); + call CaptureSFD.disable(); + } + return SUCCESS; + } + + /***************** Send Commands ****************/ + async command error_t Send.sendCCA( message_t* p_msg ) { + return send( p_msg, TRUE ); + } + + async command error_t Send.send( message_t* p_msg ) { + return send( p_msg, FALSE ); + } + + async command error_t Send.resendCCA() { + return resend( TRUE ); + } + + async command error_t Send.resend() { + return resend( FALSE ); + } + + async command error_t Send.cancel() { + stopBackoffTimer(); + + atomic { + switch( m_state ) { + case S_LOAD: + m_state = S_CANCEL; + break; + + case S_SAMPLE_CCA: + case S_BEGIN_TRANSMIT: + m_state = S_STARTED; + break; + + default: + // cancel not allowed while radio is busy transmitting + return FAIL; + } + } + + return SUCCESS; + } + + async command error_t Send.modify( uint8_t offset, uint8_t* buf, + uint8_t len ) { + call CSN.clr(); + call TXFIFO_RAM.write( offset, buf, len ); + call CSN.set(); + return SUCCESS; + } + + /***************** CC2420Cca Commands ****************/ + /** + * @return TRUE if the CCA pin shows a clear channel + */ + command bool CC2420Cca.isChannelClear() { + return call CCA.get(); + } + + /***************** CaptureSFD Events ****************/ + async event void CaptureSFD.captured( uint16_t time ) { + + atomic { + switch( m_state ) { + + case S_SFD: + call CaptureSFD.captureFallingEdge(); + signal TimeStamp.transmittedSFD( time, m_msg ); + releaseSpiResource(); + stopBackoffTimer(); + m_state = S_EFD; + if ( ( ( getHeader( m_msg )->fcf >> IEEE154_FCF_FRAME_TYPE ) & 7 ) == + IEEE154_TYPE_DATA ) + getMetadata( m_msg )->time = time; + if ( call SFD.get() ) + break; + + case S_EFD: + call CaptureSFD.captureRisingEdge(); + if ( getHeader( m_msg )->fcf & ( 1 << IEEE154_FCF_ACK_REQ ) ) { + m_state = S_ACK_WAIT; + startBackoffTimer( CC2420_ACK_WAIT_DELAY ); + } + else { + signalDone(SUCCESS); + } + if ( !call SFD.get() ) + break; + + default: + if ( !m_receiving ) { + call CaptureSFD.captureFallingEdge(); + signal TimeStamp.receivedSFD( time ); + call CC2420Receive.sfd( time ); + m_receiving = TRUE; + m_prev_time = time; + if ( call SFD.get() ) + return; + } + if ( m_receiving ) { + call CaptureSFD.captureRisingEdge(); + m_receiving = FALSE; + if ( time - m_prev_time < 10 ) + call CC2420Receive.sfd_dropped(); + } + break; + + } + } + } + + /***************** CC2420Receive Events ****************/ + async event void CC2420Receive.receive( uint8_t type, message_t* ack_msg ) { + + if ( type == IEEE154_TYPE_ACK ) { + cc2420_header_t* ack_header = getHeader( ack_msg ); + cc2420_header_t* msg_header = getHeader( m_msg ); + cc2420_metadata_t* msg_metadata = getMetadata( m_msg ); + uint8_t* ack_buf = (uint8_t*)ack_header; + uint8_t length = ack_header->length; + + if ( m_state == S_ACK_WAIT && + msg_header->dsn == ack_header->dsn ) { + stopBackoffTimer(); + msg_metadata->ack = TRUE; + msg_metadata->rssi = ack_buf[ length - 1 ]; + msg_metadata->lqi = ack_buf[ length ] & 0x7f; + signalDone(SUCCESS); + } + } + } + + /***************** SpiResource Events ****************/ + event void SpiResource.granted() { + uint8_t cur_state; + + atomic { + cur_state = m_state; + } + + switch( cur_state ) { + case S_LOAD: + loadTXFIFO(); + break; + + case S_BEGIN_TRANSMIT: + attemptSend(); + break; + + default: + releaseSpiResource(); + break; + } + } + + /***************** TXFIFO Events ****************/ + async event void TXFIFO.readDone( uint8_t* tx_buf, uint8_t tx_len, + error_t error ) { + } + + + async event void TXFIFO.writeDone( uint8_t* tx_buf, uint8_t tx_len, + error_t error ) { + call CSN.set(); + + if ( m_state == S_CANCEL ) { + m_state = S_STARTED; + } + else if ( !m_cca ) { + m_state = S_BEGIN_TRANSMIT; + attemptSend(); + } + else { + releaseSpiResource(); + m_state = S_SAMPLE_CCA; + startBackoffTimer( signal CsmaBackoff.initial( m_msg ) + 1); + } + } + + /***************** Timer Events ****************/ + async event void BackoffTimer.fired() { + + atomic { + switch( m_state ) { + case S_SAMPLE_CCA : + // sample CCA and wait a little longer if free, just in case we + // sampled during the ack turn-around window + if ( call CCA.get() ) { + m_state = S_BEGIN_TRANSMIT; + startBackoffTimer( CC2420_TIME_ACK_TURNAROUND ); + } + else { + congestionBackoff(); + } + break; + + case S_BEGIN_TRANSMIT : + if ( acquireSpiResource() == SUCCESS ) + attemptSend(); + break; + + case S_ACK_WAIT : + signalDone( SUCCESS ); + break; + +#ifdef PLATFORM_MICAZ + case S_SFD: + // We didn't receive an SFD interrupt within CC2420_ABORT_PERIOD + // jiffies. Assume something is wrong. + call SFLUSHTX.strobe(); + call CaptureSFD.disable(); + call CaptureSFD.captureRisingEdge(); + signalDone( ERETRY ); + break; +#endif + default: + break; + } + } + } + + +#ifdef PLATFORM_MICAZ + event void WatchdogTimer.fired() { + atomic m_state = S_STARTED; + releaseSpiResource(); + signalDone(ERETRY); + } +#endif + + + /***************** Functions ****************/ + /** + * Send a message with or without CCA + */ + error_t send( message_t* p_msg, bool cca ) { + atomic { + if ( m_state != S_STARTED ) { + return FAIL; + } + + m_state = S_LOAD; + m_cca = cca; + m_msg = p_msg; + } + +#ifdef PLATFORM_MICAZ + post startWatchdogTimer(); +#endif + + if ( acquireSpiResource() == SUCCESS ) { + loadTXFIFO(); + } + // Else, we wait for the SpiResource.granted event.. + + return SUCCESS; + } + + /** + * Resend a message with or without CCA + */ + error_t resend( bool cca ) { + atomic { + if ( m_state != S_STARTED ) + return FAIL; + m_cca = cca; + m_state = cca ? S_SAMPLE_CCA : S_BEGIN_TRANSMIT; + } + +#ifdef PLATFORM_MICAZ + post startWatchdogTimer(); +#endif + + if ( m_cca ) { + startBackoffTimer( signal CsmaBackoff.initial( m_msg ) ); + } + else if ( acquireSpiResource() == SUCCESS ) { + attemptSend(); + } + + return SUCCESS; + } + + /** + * Attempt to send a message + */ + void attemptSend() { + uint8_t status; + bool congestion = TRUE; + + call CSN.clr(); + + status = m_cca ? call STXONCCA.strobe() : call STXON.strobe(); + if ( !( status & CC2420_STATUS_TX_ACTIVE ) ) { + status = call SNOP.strobe(); + if ( status & CC2420_STATUS_TX_ACTIVE ) + congestion = FALSE; + } + atomic m_state = congestion ? S_SAMPLE_CCA : S_SFD; + + call CSN.set(); + + if ( congestion ) { + releaseSpiResource(); + congestionBackoff(); + } +#ifdef PLATFORM_MICAZ + else { + startBackoffTimer(CC2420_ABORT_PERIOD); + } +#endif + } + + + /** + * Get the CC2420 message header + */ + cc2420_header_t* getHeader( message_t* msg ) { + return (cc2420_header_t*)( msg->data - sizeof( cc2420_header_t ) ); + } + + /** + * Get the CC2420 message metadata + */ + cc2420_metadata_t* getMetadata( message_t* msg ) { + return (cc2420_metadata_t*)msg->metadata; + } + +#ifdef PLATFORM_MICAZ + /** + * Start the watchdog timer + */ + task void startWatchdogTimer() { + call WatchdogTimer.startOneShot(50); + } + + /** + * Stop the watchdog timer + */ + task void stopWatchdogTimer() { + call WatchdogTimer.stop(); + } +#endif + + /** + * Start the backoff timer + */ + void startBackoffTimer(uint16_t time) { + call BackoffTimer.start(time); + } + + /** + * Stop the backoff timer + */ + void stopBackoffTimer() { + call BackoffTimer.stop(); + } + + /** + * Acquire the SPI bus resource immediately, or defer it till later + */ + error_t acquireSpiResource() { + error_t error = call SpiResource.immediateRequest(); + if ( error != SUCCESS ) { + call SpiResource.request(); + } + return error; + } + + /** + * Release the SPI resource + */ + void releaseSpiResource() { + call SpiResource.release(); + } + + /** + * Signal done + */ + void signalDone( error_t err ) { + atomic m_state = S_STARTED; + +#ifdef PLATFORM_MICAZ + post stopWatchdogTimer(); +#endif + + signal Send.sendDone( m_msg, err ); + } + + /** + * Congestion Backoff + */ + void congestionBackoff() { + atomic { + startBackoffTimer(signal CsmaBackoff.congestion( m_msg ) + 1); + } + } + + /** + * Load TX FIFO + */ + void loadTXFIFO() { + cc2420_header_t* header = getHeader( m_msg ); + uint8_t tx_power = getMetadata( m_msg )->tx_power; + + if ( !tx_power ) + tx_power = CC2420_DEF_RFPOWER; + call CSN.clr(); + if ( m_tx_power != tx_power ) + call TXCTRL.write( ( 2 << CC2420_TXCTRL_TXMIXBUF_CUR ) | + ( 3 << CC2420_TXCTRL_PA_CURRENT ) | + ( 1 << CC2420_TXCTRL_RESERVED ) | + ( tx_power << CC2420_TXCTRL_PA_LEVEL ) ); + m_tx_power = tx_power; + call TXFIFO.write( (uint8_t*)header, header->length - 1 ); + } + + /***************** Defaults ****************/ + default async event void TimeStamp.transmittedSFD( uint16_t time, message_t* p_msg ) {} + default async event void TimeStamp.receivedSFD( uint16_t time ) {} + +} diff --git a/tos/chips/cc2420_lpl/IEEE802154.h b/tos/chips/cc2420_lpl/IEEE802154.h new file mode 100644 index 00000000..65aab6f0 --- /dev/null +++ b/tos/chips/cc2420_lpl/IEEE802154.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#ifndef __IEEE802154_H__ +#define __IEEE802154_H__ + +enum ieee154_fcf_enums { + IEEE154_FCF_FRAME_TYPE = 0, + IEEE154_FCF_SECURITY_ENABLED = 3, + IEEE154_FCF_FRAME_PENDING = 4, + IEEE154_FCF_ACK_REQ = 5, + IEEE154_FCF_INTRAPAN = 6, + IEEE154_FCF_DEST_ADDR_MODE = 10, + IEEE154_FCF_SRC_ADDR_MODE = 14, +}; + +enum ieee154_fcf_type_enums { + IEEE154_TYPE_BEACON = 0, + IEEE154_TYPE_DATA = 1, + IEEE154_TYPE_ACK = 2, + IEEE154_TYPE_MAC_CMD = 3, +}; + +enum iee154_fcf_addr_mode_enums { + IEEE154_ADDR_NONE = 0, + IEEE154_ADDR_SHORT = 2, + IEEE154_ADDR_EXT = 3, +}; + +#endif diff --git a/tos/chips/cc2420_lpl/LowPowerListening.nc b/tos/chips/cc2420_lpl/LowPowerListening.nc new file mode 100644 index 00000000..c8649c85 --- /dev/null +++ b/tos/chips/cc2420_lpl/LowPowerListening.nc @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Low Power Listening interface + * + * @author David Moss + * @author Jonathan Hui + */ + +interface LowPowerListening { + + /** + * Set this this node's radio sleep interval, in milliseconds. + * Once every interval, the node will sleep and perform an Rx check + * on the radio. Setting the sleep interval to 0 will keep the radio + * always on. + * + * This is the equivalent of setting the local duty cycle rate. + * + * @param sleepIntervalMs the length of this node's Rx check interval, in [ms] + */ + command void setLocalSleepInterval(uint16_t sleepIntervalMs); + + /** + * @return the local node's sleep interval, in [ms] + */ + command uint16_t getLocalSleepInterval(); + + /** + * Set this node's radio duty cycle rate, in units of [percentage*100]. + * For example, to get a 0.05% duty cycle, + * + * call LowPowerListening.setDutyCycle(5); // or equivalently... + * call LowPowerListening.setDutyCycle(00005); // for better readability? + * + * + * For a 100% duty cycle (always on), + * + * call LowPowerListening.setDutyCycle(10000); + * + * + * This is the equivalent of setting the local sleep interval explicitly. + * + * @param dutyCycle The duty cycle percentage, in units of [percentage*100] + */ + command void setLocalDutyCycle(uint16_t dutyCycle); + + /** + * @return this node's radio duty cycle rate, in units of [percentage*100] + */ + command uint16_t getLocalDutyCycle(); + + + /** + * Configure this outgoing message so it can be transmitted to a neighbor mote + * with the specified Rx sleep interval. + * @param msg Pointer to the message that will be sent + * @param sleepInterval The receiving node's sleep interval, in [ms] + */ + command void setRxSleepInterval(message_t *msg, uint16_t sleepIntervalMs); + + /** + * @return the destination node's sleep interval configured in this message + */ + command uint16_t getRxSleepInterval(message_t *msg); + + /** + * Configure this outgoing message so it can be transmitted to a neighbor mote + * with the specified Rx duty cycle rate. + * Duty cycle is in units of [percentage*100], i.e. 0.25% duty cycle = 25. + * + * @param msg Pointer to the message that will be sent + * @param dutyCycle The duty cycle of the receiving mote, in units of + * [percentage*100] + */ + command void setRxDutyCycle(message_t *msg, uint16_t dutyCycle); + + /** + * @return the destination node's duty cycle configured in this message + * in units of [percentage*100] + */ + command uint16_t getRxDutyCycle(message_t *msg); + + /** + * Convert a duty cycle, in units of [percentage*100], to + * the sleep interval of the mote in milliseconds + * @param dutyCycle The duty cycle in units of [percentage*100] + * @return The equivalent sleep interval, in units of [ms] + */ + command uint16_t dutyCycleToSleepInterval(uint16_t dutyCycle); + + /** + * Convert a sleep interval, in units of [ms], to a duty cycle + * in units of [percentage*100] + * @param sleepInterval The sleep interval in units of [ms] + * @return The duty cycle in units of [percentage*100] + */ + command uint16_t sleepIntervalToDutyCycle(uint16_t sleepInterval); + +} diff --git a/tos/chips/ds2745/DS2745.h b/tos/chips/ds2745/DS2745.h new file mode 100644 index 00000000..0c36b82d --- /dev/null +++ b/tos/chips/ds2745/DS2745.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Types and definitions for the Dallas DS2745 I2C Battery Monitor + * + * @author Phil Buonadonna + * @version $Revision$ $Date$ + */ + +#ifndef _DS2745_H +#define _DS2745_H + +#define DS2745_PTR_SC (0x01) +#define DS2745_PTR_TEMPMSB (0x0A) +#define DS2745_PTR_TEMPLSB (0x0B) +#define DS2745_PTR_VOLTMSB (0x0C) +#define DS2745_PTR_VOLTLSB (0x0D) +#define DS2745_PTR_CURRMSB (0x0E) +#define DS2745_PTR_CURRLSB (0x0F) +#define DS2745_PTR_ACCURMSB (0x10) +#define DS2745_PTR_ACCURLSB (0x11) +#define DS2745_PTR_OFFSETBIAS (0x61) +#define DS2745_PTR_ACCBIAS (0x62) + +#define DS2745_SC_PORF (1 << 6) +#define DS2745_SC_SMOD (1 << 5) +#define DS2745_SC_NBEN (1 << 4) +#define DS2745_SC_PIO (1 << 3) +#define DS2745_SC_FQ(_x) (((_x) & 0x3)) + +#endif /* _DS2745_H */ diff --git a/tos/chips/ds2745/HplDS2745.nc b/tos/chips/ds2745/HplDS2745.nc new file mode 100644 index 00000000..3966400b --- /dev/null +++ b/tos/chips/ds2745/HplDS2745.nc @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * HplDS2745 is the HPL inteface to the Dallas DS2745 I2C Battery + * Monitor. + * + * @author Phil Buonadonna + * @version $Revision$ $Date$ + */ + +interface HplDS2745 { + + /** + * Sets a new value to the DS2745 configuration register. + * + * @param val the new value to be written + * + * @return SUCCESS if the set will be performed + */ + command error_t setConfig( uint8_t val ); + + /** + * Signals the completion of the configuration register set. + * + * @param error SUCCESS if the set was successful + */ + async event void setConfigDone( error_t error ); + + + /** + * Starts a temperature measurement. + * + * @return SUCCESS if the measurement will be made + */ + command error_t measureTemperature(); + + /** + * Presents the result of a temperature measurement. + * + * @param error SUCCESS if the measurement was successful + * @param val the temperature reading + */ + async event void measureTemperatureDone( error_t error, uint16_t val ); + + + /** + * Starts a voltage measurement. + * + * @return SUCCESS if the measurement will be made + */ + command error_t measureVoltage(); + + /** + * Presents the result of a voltage measurement. + * + * @param error SUCCESS if the measurement was successful + * @param val the voltage reading + */ + async event void measureVoltageDone( error_t error, uint16_t val); + + + /** + * Starts a current measurement. + * + * @return SUCCESS if the measurement will be made + */ + command error_t measureCurrent(); + + /** + * Presents the result of a current measurement. + * + * @param error SUCCESS if the measurement was successful + * @param val the current reading + */ + async event void measureCurrentDone( error_t error, uint16_t val); + + + /** + * Starts an accumulated current measurement. + * + * @return SUCCESS if the measurement will be made + */ + command error_t measureAccCurrent(); + + /** + * Presents the result of a accumulated current measurement. + * + * @param error SUCCESS if the measurement was successful + * @param val the accumulated current reading + */ + async event void measureAccCurrentDone( error_t error, uint16_t val); + + + /** + * Initiates setting of the current offset bias value + * + * @param The signed two's complement bias value. + * + * @return SUCCESS if the setting will be made + */ + command error_t setOffsetBias(int8_t val); + + /** + * Signals completion and error, if any, in setting the current + * offset bias value. + * + * @param error SUCCESS if the setting was successful + */ + async event void setOffsetBiasDone( error_t error ); + + + /** + * Initiates setting of the accumulated current offset bias value + * + * @param The signed two's complement bias value. + * + * @return SUCCESS if the setting will be made + */ + command error_t setAccOffsetBias(int8_t val); + + /** + * Signals completion and error, if any, in setting the accumulated + * current offset bias value. + * + * @param error SUCCESS if the setting was successful + */ + async event void setAccOffsetBiasDone( error_t error ); + + +} diff --git a/tos/chips/ds2745/HplDS2745LogicP.nc b/tos/chips/ds2745/HplDS2745LogicP.nc new file mode 100644 index 00000000..df4d11c1 --- /dev/null +++ b/tos/chips/ds2745/HplDS2745LogicP.nc @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * HplDS2745LogicP is the driver for the Dallas DS2745. It requires an + * I2C packet interface and provides the HplTMP175 HPL interface. + * + * @author Phil Buonadonna + * @version $Revision$ $Date$ + */ + +#include "DS2745.h" +#include "I2C.h" + +generic module HplDS2745LogicP(uint16_t devAddr) +{ + provides interface Init; + provides interface SplitControl; + provides interface HplDS2745; + + uses interface I2CPacket; + +} + +implementation { + + enum { + STATE_IDLE, + STATE_STARTING, + STATE_STOPPING, + STATE_STOPPED, + STATE_SETCONFIG, + STATE_READTEMP, + STATE_READVOLTAGE, + STATE_READCURRENT, + STATE_READACCCURRENT, + STATE_SETBIAS, + STATE_SETACCBIAS + }; + + uint8_t mI2CBuffer[4]; + uint8_t mState; + norace error_t mSSError = SUCCESS; + + static error_t doReadReg(uint8_t nextState, uint8_t reg) { + error_t error = SUCCESS; + + atomic { + if (mState == STATE_IDLE) { + mState = nextState; + } + else { + error = EBUSY; + } + } + if (error) + return error; + + mI2CBuffer[0] = reg; + + error = call I2CPacket.write(I2C_START,devAddr,1,mI2CBuffer); + + if (error) + atomic mState = STATE_IDLE; + + return error; + + } + + static error_t doSetReg(uint8_t nextState, uint8_t reg, uint16_t val) { + error_t error = SUCCESS; + + atomic { + if (mState == STATE_IDLE) { + mState = nextState; + } + else { + error = EBUSY; + } + } + if (error) + return error; + + mI2CBuffer[0] = reg; + mI2CBuffer[1] = val; + + error = call I2CPacket.write((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); + + if (error) + atomic mState = STATE_IDLE; + + return error; + } + + task void StartDone() { + atomic mState = STATE_IDLE; + signal SplitControl.startDone(mSSError); + return; + } + + task void StopDone() { + atomic mState = STATE_STOPPED; + signal SplitControl.stopDone(mSSError); + return; + } + + command error_t Init.init() { + mState = STATE_STOPPED; + return SUCCESS; + } + + command error_t SplitControl.start() { + error_t error = SUCCESS; + atomic { + if (mState == STATE_STOPPED) { + mState = STATE_STARTING; + } + else { + error = EBUSY; + } + } + if (!error) + post StartDone(); + + return error; + } + + command error_t SplitControl.stop() { + error_t error = SUCCESS; + atomic { + if (mState == STATE_IDLE) { + mState = STATE_STOPPING; + } + else { + error = EBUSY; + } + } + if (!error) + post StopDone(); + + return error; + } + + command error_t HplDS2745.setConfig(uint8_t val) { + return doSetReg(STATE_SETCONFIG,DS2745_PTR_SC,val); + } + + command error_t HplDS2745.measureTemperature() { + return doReadReg(STATE_READTEMP,DS2745_PTR_TEMPMSB); + } + + command error_t HplDS2745.measureVoltage() { + return doReadReg(STATE_READVOLTAGE,DS2745_PTR_VOLTMSB); + } + + command error_t HplDS2745.measureCurrent() { + return doReadReg(STATE_READCURRENT,DS2745_PTR_CURRMSB); + } + + command error_t HplDS2745.measureAccCurrent() { + return doReadReg(STATE_READTEMP,DS2745_PTR_ACCURMSB); + } + + command error_t HplDS2745.setOffsetBias(int8_t val) { + return doSetReg(STATE_SETBIAS,DS2745_PTR_OFFSETBIAS,val); + } + + command error_t HplDS2745.setAccOffsetBias(int8_t val) { + return doSetReg(STATE_SETACCBIAS,DS2745_PTR_ACCBIAS,val); + } + + async event void I2CPacket.readDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { + uint16_t tempVal; + tempVal = buf[0]; + tempVal = ((tempVal << 8) | buf[1]); + + switch (mState) { + case STATE_READTEMP: + signal HplDS2745.measureTemperatureDone(i2c_error,tempVal); + break; + case STATE_READVOLTAGE: + signal HplDS2745.measureVoltageDone(i2c_error,tempVal); + break; + case STATE_READCURRENT: + signal HplDS2745.measureCurrentDone(i2c_error,tempVal); + break; + case STATE_READACCCURRENT: + signal HplDS2745.measureAccCurrentDone(i2c_error,tempVal); + break; + default: + break; + } + atomic mState = STATE_IDLE; + return; + } + + async event void I2CPacket.writeDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) { + error_t error = i2c_error; + + switch (mState) { + case STATE_SETCONFIG: + atomic mState = STATE_IDLE; + signal HplDS2745.setConfigDone(error); + break; + case STATE_READTEMP: + if (error) + signal HplDS2745.measureTemperatureDone(error,0); + else + error = call I2CPacket.read((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); + break; + case STATE_READVOLTAGE: + if (error) + signal HplDS2745.measureVoltageDone(error,0); + else + error = call I2CPacket.read((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); + break; + case STATE_READCURRENT: + if (error) + signal HplDS2745.measureCurrentDone(error,0); + else + error = call I2CPacket.read((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); + break; + case STATE_READACCCURRENT: + if (error) + signal HplDS2745.measureAccCurrentDone(error,0); + else + error = call I2CPacket.read((I2C_START | I2C_STOP),devAddr,2,mI2CBuffer); + break; + case STATE_SETBIAS: + atomic mState = STATE_IDLE; + signal HplDS2745.setOffsetBiasDone(error); + break; + case STATE_SETACCBIAS: + atomic mState = STATE_IDLE; + signal HplDS2745.setAccOffsetBiasDone(error); + break; + default: + atomic mState = STATE_IDLE; + break; + } + if (error) + atomic mState = STATE_IDLE; + return; + } + + default event void SplitControl.startDone( error_t error ) { return; } + default event void SplitControl.stopDone( error_t error ) { return; } + default async event void HplDS2745.setConfigDone(error_t error) {return; } + default async event void HplDS2745.measureTemperatureDone( error_t error, uint16_t val ){ return; } + default async event void HplDS2745.measureVoltageDone( error_t error, uint16_t val ){ return; } + default async event void HplDS2745.measureCurrentDone( error_t error, uint16_t val ){ return; } + default async event void HplDS2745.measureAccCurrentDone( error_t error, uint16_t val ){ return; } + default async event void HplDS2745.setOffsetBiasDone( error_t error ){ return; } + default async event void HplDS2745.setAccOffsetBiasDone(error_t error){ return; } +} diff --git a/tos/chips/msp430/adc12/AdcP.nc b/tos/chips/msp430/adc12/AdcP.nc new file mode 100644 index 00000000..654807ad --- /dev/null +++ b/tos/chips/msp430/adc12/AdcP.nc @@ -0,0 +1,383 @@ +/* + * Copyright (c) 2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * - Revision ------------------------------------------------------------- + * $Revision$ + * $Date$ + * @author: Jan Hauer + * ======================================================================== + */ + +module AdcP { + provides { + interface Read as Read[uint8_t client]; + interface ReadNow as ReadNow[uint8_t client]; + interface Resource as ResourceReadNow[uint8_t client]; + interface ReadStream as ReadStream[uint8_t streamClient]; + } + uses { + // for Read only: + interface Resource as ResourceRead[uint8_t client]; + // for ReadNow only: + interface Resource as SubResourceReadNow[uint8_t client]; + // for Read and ReadNow: + interface AdcConfigure as Config[uint8_t client]; + interface Msp430Adc12SingleChannel as SingleChannel[uint8_t client]; + // for ReadStream only: + interface AdcConfigure as ConfigReadStream[uint8_t streamClient]; + interface Msp430Adc12SingleChannel as SingleChannelReadStream[uint8_t streamClient]; + interface Resource as ResourceReadStream[uint8_t streamClient]; + + } +} +implementation +{ + enum { + STATE_READ, + STATE_READNOW, + STATE_READNOW_INVALID_CONFIG, + STATE_READSTREAM, + }; + + struct stream_entry_t { + uint16_t count; + struct stream_entry_t *next; + }; + + // Resource interface / arbiter makes norace declaration safe + norace uint8_t state; + norace uint8_t owner; + norace uint16_t value; + norace uint16_t *resultBuf; + + // atomic section in postBuffer() makes norace safe + norace struct stream_entry_t *streamBuf[uniqueCount(ADCC_READ_STREAM_SERVICE)]; + norace uint32_t usPeriod[uniqueCount(ADCC_READ_STREAM_SERVICE)]; + msp430adc12_channel_config_t streamConfig; + + void task finishStreamRequest(); + void task signalBufferDone(); + void nextReadStreamRequest(uint8_t streamClient); + + error_t configure(uint8_t client) + { + error_t result = EINVAL; + const msp430adc12_channel_config_t *config; + config = call Config.getConfiguration[client](); + if (config->inch != INPUT_CHANNEL_NONE) + result = call SingleChannel.configureSingle[client](config); + return result; + } + + command error_t Read.read[uint8_t client]() + { + if (call ResourceRead.isOwner[client]()) + return EBUSY; + return call ResourceRead.request[client](); + } + + event void ResourceRead.granted[uint8_t client]() + { + // signalled only for Read.read() + error_t result = configure(client); + if (result == SUCCESS){ + state = STATE_READ; + result = call SingleChannel.getData[client](); + } + if (result != SUCCESS){ + call ResourceRead.release[client](); + signal Read.readDone[client](result, 0); + } + } + + async command error_t ResourceReadNow.request[uint8_t nowClient]() + { + return call SubResourceReadNow.request[nowClient](); + } + + event void SubResourceReadNow.granted[uint8_t nowClient]() + { + if (configure(nowClient) == SUCCESS) + state = STATE_READNOW; + else + state = STATE_READNOW_INVALID_CONFIG; + signal ResourceReadNow.granted[nowClient](); + } + + async command error_t ResourceReadNow.immediateRequest[uint8_t nowClient]() + { + error_t result = call SubResourceReadNow.immediateRequest[nowClient](); + if (result == SUCCESS){ + result = configure(nowClient); + if (result == SUCCESS) + state = STATE_READNOW; + } + return result; + } + + async command error_t ResourceReadNow.release[uint8_t nowClient]() + { + return call SubResourceReadNow.release[nowClient](); + } + + async command bool ResourceReadNow.isOwner[uint8_t nowClient]() + { + return call SubResourceReadNow.isOwner[nowClient](); + } + + async command error_t ReadNow.read[uint8_t nowClient]() + { + if (state == STATE_READNOW_INVALID_CONFIG) + return EINVAL; + else + return call SingleChannel.getData[nowClient](); + } + + void task readDone() + { + call ResourceRead.release[owner](); + signal Read.readDone[owner](SUCCESS, value); + } + + async event error_t SingleChannel.singleDataReady[uint8_t client](uint16_t data) + { + switch (state) + { + case STATE_READ: + owner = client; + value = data; + post readDone(); + break; + case STATE_READNOW: + signal ReadNow.readDone[client](SUCCESS, data); + break; + default: + // error ! + break; + } + return SUCCESS; + } + + async event uint16_t* SingleChannel.multipleDataReady[uint8_t client]( + uint16_t *buf, uint16_t length) + { + // error ! + return 0; + } + + command error_t ReadStream.postBuffer[uint8_t streamClient]( uint16_t* buf, uint16_t count ) + { + struct stream_entry_t *newEntry = (struct stream_entry_t *) buf; + + newEntry->count = count; + newEntry->next = 0; + atomic { + if (!streamBuf[streamClient]) + streamBuf[streamClient] = newEntry; + else { + struct stream_entry_t *tmp = streamBuf[streamClient]; + while (tmp->next) + tmp = tmp->next; + tmp->next = newEntry; + } + } + return SUCCESS; + } + + command error_t ReadStream.read[uint8_t streamClient]( uint32_t _usPeriod ) + { + if (!streamBuf[streamClient]) + return EINVAL; + if (call ResourceReadStream.isOwner[streamClient]()) + return EBUSY; + usPeriod[streamClient] = _usPeriod; + return call ResourceReadStream.request[streamClient](); + } + + void task finishStreamRequest() + { + call ResourceReadStream.release[owner](); + if (!streamBuf[owner]) + // all posted buffers were filled + signal ReadStream.readDone[owner]( SUCCESS, usPeriod[owner] ); + else { + // the commented code below makes gcc throw + // "internal error: unsupported relocation error" !?! + /* + do { + signal ReadStream.bufferDone[owner]( FAIL, (uint16_t *) streamBuf[owner], 0); + streamBuf[owner] = streamBuf[owner]->next; + } while (streamBuf[owner]); + */ + signal ReadStream.readDone[owner]( FAIL, 0 ); + } + } + + event void ResourceReadStream.granted[uint8_t streamClient]() + { + error_t result; + const msp430adc12_channel_config_t *config; + struct stream_entry_t *entry = streamBuf[streamClient]; + + if (!entry) + result = EINVAL; + else { + config = call ConfigReadStream.getConfiguration[streamClient](); + if (config->inch == INPUT_CHANNEL_NONE) + result = EINVAL; + else { + owner = streamClient; + streamConfig = *config; + streamConfig.sampcon_ssel = SAMPCON_SOURCE_SMCLK; // assumption: SMCLK runs at 1 MHz + streamConfig.sampcon_id = SAMPCON_CLOCK_DIV_1; + streamBuf[streamClient] = entry->next; + result = call SingleChannelReadStream.configureMultiple[streamClient]( + &streamConfig, (uint16_t *) entry, entry->count, usPeriod[streamClient]); + if (result == SUCCESS) + result = call SingleChannelReadStream.getData[streamClient](); + else { + streamBuf[streamClient] = entry; + post finishStreamRequest(); + return; + } + } + } + if (result != SUCCESS){ + call ResourceReadStream.release[streamClient](); + signal ReadStream.readDone[streamClient]( FAIL, 0 ); + } + return; + } + + + async event uint16_t* SingleChannelReadStream.multipleDataReady[uint8_t streamClient]( + uint16_t *buf, uint16_t length) + { + error_t nextRequest; + + if (!resultBuf){ + value = length; + resultBuf = buf; + post signalBufferDone(); + if (!streamBuf[streamClient]) + post finishStreamRequest(); + else { + // fill next buffer (this is the only async code dealing with buffers) + struct stream_entry_t *entry = streamBuf[streamClient]; + streamBuf[streamClient] = streamBuf[streamClient]->next; + nextRequest = call SingleChannelReadStream.configureMultiple[streamClient]( + &streamConfig, (uint16_t *) entry, entry->count, usPeriod[streamClient]); + if (nextRequest == SUCCESS) + nextRequest = call SingleChannelReadStream.getData[streamClient](); + if (nextRequest != SUCCESS){ + streamBuf[owner] = entry; + post finishStreamRequest(); + } + } + } else { + // overflow: can't signal data fast enough + struct stream_entry_t *entry = (struct stream_entry_t *) buf; + entry->next = streamBuf[streamClient]; + streamBuf[streamClient] = entry; // what a waste + post finishStreamRequest(); + } + return 0; + } + + void task signalBufferDone() + { + signal ReadStream.bufferDone[owner]( SUCCESS, resultBuf, value); + resultBuf = 0; + } + + async event error_t SingleChannelReadStream.singleDataReady[uint8_t streamClient](uint16_t data) + { + // won't happen + return SUCCESS; + } + + default async command error_t ResourceRead.request[uint8_t client]() { return FAIL; } + default async command error_t ResourceRead.immediateRequest[uint8_t client]() { return FAIL; } + default async command error_t ResourceRead.release[uint8_t client]() { return FAIL; } + default async command bool ResourceRead.isOwner[uint8_t client]() { return FALSE; } + default event void Read.readDone[uint8_t client]( error_t result, uint16_t val ){} + + default async command error_t SubResourceReadNow.release[uint8_t nowClient](){ return FAIL;} + default async command error_t SubResourceReadNow.request[uint8_t nowClient](){ return FAIL; } + default async command bool SubResourceReadNow.isOwner[uint8_t client]() { return FALSE; } + default event void ResourceReadNow.granted[uint8_t nowClient](){} + default async event void ReadNow.readDone[uint8_t client]( error_t result, uint16_t val ){} + default async command error_t SubResourceReadNow.immediateRequest[uint8_t nowClient]() + { + return FAIL; + } + + default async command error_t ResourceReadStream.request[uint8_t streamClient]() { return FAIL; } + default async command error_t ResourceReadStream.release[uint8_t streamClient]() { return FAIL; } + default async command bool ResourceReadStream.isOwner[uint8_t streamClient]() { return FALSE; } + default event void ReadStream.bufferDone[uint8_t streamClient]( error_t result, + uint16_t* buf, uint16_t count ){} + default event void ReadStream.readDone[uint8_t streamClient]( error_t result, uint32_t actualPeriod ){ } + + default async command error_t SingleChannel.getData[uint8_t client]() + { + return EINVAL; + } + + // will be placed in flash + const msp430adc12_channel_config_t defaultConfig = {INPUT_CHANNEL_NONE,0,0,0,0,0,0,0}; + default async command const msp430adc12_channel_config_t* + Config.getConfiguration[uint8_t client]() + { + return &defaultConfig; + } + + default async command const msp430adc12_channel_config_t* + ConfigReadStream.getConfiguration[uint8_t client]() + { + return &defaultConfig; + } + + default async command error_t SingleChannelReadStream.configureMultiple[uint8_t client]( + const msp430adc12_channel_config_t *config, uint16_t buffer[], + uint16_t numSamples, uint16_t jiffies) + { + return FAIL; + } + + default async command error_t SingleChannelReadStream.getData[uint8_t client]() + { + return FAIL; + } + + default async command error_t SingleChannel.configureSingle[uint8_t client]( + const msp430adc12_channel_config_t *config){ return FAIL; } + + +} + diff --git a/tos/chips/msp430/adc12/Msp430Adc12ClientAutoDMAC.nc b/tos/chips/msp430/adc12/Msp430Adc12ClientAutoDMAC.nc new file mode 100644 index 00000000..241627c8 --- /dev/null +++ b/tos/chips/msp430/adc12/Msp430Adc12ClientAutoDMAC.nc @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * - Revision ------------------------------------------------------------- + * $Revision$ + * $Date$ + * @author: Jan Hauer + * ======================================================================== + */ + +/** + * This component virtualizes access to the HAL of the MSP430 ADC12. ADC + * conversion results are copied using DMA. + * + * @author Jan Hauer + * + * @see Please refer to the README.txt and TEP 101 for more information about + * this component and its intended use. + */ + +generic configuration Msp430Adc12ClientAutoDMAC() +{ + provides { + interface Resource; + interface Msp430Adc12SingleChannel; + } +} implementation { + components Msp430DmaC, Msp430Adc12DMAP, Msp430Adc12P; + + enum { + ID = unique(MSP430ADC12_RESOURCE), + }; + Resource = Msp430Adc12P.Resource[ID]; + Msp430Adc12SingleChannel = Msp430Adc12DMAP.SingleChannel[ID]; + + Msp430Adc12DMAP.SubSingleChannel[ID] -> Msp430Adc12P.SingleChannel[ID]; + Msp430Adc12DMAP.AsyncAdcControl[ID] -> Msp430Adc12P.DMAExtension[ID]; + + Msp430Adc12DMAP.DMAControl -> Msp430DmaC.Control; + Msp430Adc12DMAP.DMAChannel -> Msp430DmaC.Channel0; +} diff --git a/tos/chips/msp430/adc12/Msp430Adc12ClientAutoDMA_RVGC.nc b/tos/chips/msp430/adc12/Msp430Adc12ClientAutoDMA_RVGC.nc new file mode 100644 index 00000000..ee713db4 --- /dev/null +++ b/tos/chips/msp430/adc12/Msp430Adc12ClientAutoDMA_RVGC.nc @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2006, Technische Universitaet Berlin All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. - Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. - Neither the name of the + * Technische Universitaet Berlin nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * - Revision ------------------------------------------------------------- + * $Revision$ $Date$ @author: Jan Hauer + * + * ======================================================================== + */ + + +/** + * This component virtualizes access to the HAL of the MSP430 ADC12. ADC + * conversion results are copied using DMA and reference voltage is enabled as + * required by the configuration. + * + * @author Jan Hauer + * + * @see Please refer to the README.txt and TEP 101 for more information about + * this component and its intended use. + */ + +generic configuration Msp430Adc12ClientAutoDMA_RVGC() +{ + provides { + interface Resource; + interface Msp430Adc12SingleChannel; + } + uses interface AdcConfigure; +} implementation { + components Msp430Adc12P, Msp430RefVoltArbiterP; + + enum { + ID = unique(MSP430ADC12_RESOURCE), + }; + Resource = Msp430RefVoltArbiterP.ClientResource[ID]; + + Msp430RefVoltArbiterP.AdcResource[ID] -> Msp430Adc12P.Resource[ID]; + AdcConfigure = Msp430RefVoltArbiterP.Config[ID]; + + components Msp430DmaC, Msp430Adc12DMAP; + + Msp430Adc12SingleChannel = Msp430Adc12DMAP.SingleChannel[ID]; + + Msp430Adc12DMAP.SubSingleChannel[ID] -> Msp430Adc12P.SingleChannel[ID]; + Msp430Adc12DMAP.AsyncAdcControl[ID] -> Msp430Adc12P.DMAExtension[ID]; + + Msp430Adc12DMAP.DMAControl -> Msp430DmaC.Control; + Msp430Adc12DMAP.DMAChannel -> Msp430DmaC.Channel0; + +} diff --git a/tos/chips/msp430/adc12/Msp430Adc12ClientAutoRVGC.nc b/tos/chips/msp430/adc12/Msp430Adc12ClientAutoRVGC.nc new file mode 100644 index 00000000..97cc789a --- /dev/null +++ b/tos/chips/msp430/adc12/Msp430Adc12ClientAutoRVGC.nc @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2006, Technische Universitaet Berlin All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. - Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. - Neither the name of the + * Technische Universitaet Berlin nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * - Revision ------------------------------------------------------------- + * $Revision$ $Date$ @author: Jan Hauer + * + * ======================================================================== + */ + +/** + * This component virtualizes access to the HAL of the MSP430 ADC12. + * Reference voltage is enabled automatically as required by the configuration. + * + * @author Jan Hauer + * + * @see Please refer to the README.txt and TEP 101 for more information about + * this component and its intended use. + */ + +generic configuration Msp430Adc12ClientAutoRVGC() +{ + provides { + interface Resource; + interface Msp430Adc12SingleChannel; + } + uses interface AdcConfigure; +} implementation { + components Msp430Adc12P, Msp430RefVoltArbiterP; + + enum { + ID = unique(MSP430ADC12_RESOURCE), + }; + Resource = Msp430RefVoltArbiterP.ClientResource[ID]; + Msp430Adc12SingleChannel = Msp430Adc12P.SingleChannel[ID]; + + Msp430RefVoltArbiterP.AdcResource[ID] -> Msp430Adc12P.Resource[ID]; + AdcConfigure = Msp430RefVoltArbiterP.Config[ID]; +} diff --git a/tos/chips/msp430/adc12/Msp430Adc12DMAP.nc b/tos/chips/msp430/adc12/Msp430Adc12DMAP.nc new file mode 100644 index 00000000..9f98dbb8 --- /dev/null +++ b/tos/chips/msp430/adc12/Msp430Adc12DMAP.nc @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * - Revision ------------------------------------------------------------- + * $Revision$ + * $Date$ + * @author: Jan Hauer + * ======================================================================== + */ + +#include +#include +module Msp430Adc12DMAP +{ + provides { + interface Msp430Adc12SingleChannel as SingleChannel[uint8_t id]; + } + uses { + interface Msp430DmaControl as DMAControl; + interface Msp430DmaChannel as DMAChannel; + interface Msp430Adc12SingleChannel as SubSingleChannel[uint8_t id]; + interface AsyncStdControl as AsyncAdcControl[uint8_t id]; + } +} +implementation +{ + enum { + MULTIPLE_SINGLE, + MULTIPLE_REPEAT, + MULTIPLE_SINGLE_AGAIN, + }; + + // norace declarations are safe here, because Msp430Adc12P.nc implements + // a lock mechanism which guarantees that no two clients can access the ADC + // and the module variables below are only changed after the lock was acquired + norace uint8_t client; + norace uint8_t mode; + norace uint16_t *buffer; + norace uint16_t numSamples; + + async command error_t SingleChannel.configureSingle[uint8_t id]( + const msp430adc12_channel_config_t *config) + { + // don't use DMA for single conversions + return call SubSingleChannel.configureSingle[id](config); + } + + async command error_t SingleChannel.configureSingleRepeat[uint8_t id]( + const msp430adc12_channel_config_t *config, + uint16_t jiffies) + { + // don't use DMA for single conversions + return call SubSingleChannel.configureSingleRepeat[id](config, jiffies); + } + + error_t configure(uint8_t id, const msp430adc12_channel_config_t *config, + uint16_t *buf, uint16_t length, uint16_t jiffies, uint8_t _mode) + { + // for multiple samples single-channel repat-conversion mode + // is used, because then there is only one interrupt at the + // the end of the whole sequence and DMA has done all the copying + error_t result = call SubSingleChannel.configureSingleRepeat[id](config, jiffies); + if (result == SUCCESS){ + call DMAControl.init(); + call DMAControl.setFlags(ENABLE_NMI, NOT_ROUND_ROBIN, ON_FETCH); + call DMAChannel.setupTransfer( + DMA_REPEATED_SINGLE_TRANSFER, + DMA_TRIGGER_ADC12IFGx, + DMA_EDGE_SENSITIVE, + ADC12MEM, + buf, + length, + DMA_WORD, + DMA_WORD, + DMA_ADDRESS_UNCHANGED, + DMA_ADDRESS_INCREMENTED + ); + call DMAChannel.startTransfer(); + client = id; + mode = _mode; + buffer = buf; + numSamples = length; + call AsyncAdcControl.start[id](); + } + return result; + } + + async command error_t SingleChannel.configureMultiple[uint8_t id]( + const msp430adc12_channel_config_t *config, + uint16_t *buf, uint16_t length, uint16_t jiffies) + { + return configure(id, config, buf, length, jiffies, MULTIPLE_SINGLE); + } + + async command error_t SingleChannel.configureMultipleRepeat[uint8_t id]( + const msp430adc12_channel_config_t *config, + uint16_t *buf, uint8_t length, uint16_t jiffies) + { + return configure(id, config, buf, length, jiffies, MULTIPLE_REPEAT); + } + + async command error_t SingleChannel.getData[uint8_t id]() + { + if (mode == MULTIPLE_SINGLE_AGAIN) + call DMAChannel.repeatTransfer(ADC12MEM, buffer, numSamples); + return call SubSingleChannel.getData[id](); + } + + async event error_t SubSingleChannel.singleDataReady[uint8_t id](uint16_t data) + { + // forward (only signalled if not in DMA mode) + return signal SingleChannel.singleDataReady[id](data); + } + + async event uint16_t* SubSingleChannel.multipleDataReady[uint8_t id](uint16_t buf[], uint16_t num) + { + // will never get here + return 0; + } + + async event void DMAChannel.transferDone(error_t success) + { + uint16_t* next; + uint8_t oldMode = mode; + if (oldMode != MULTIPLE_REPEAT){ + call AsyncAdcControl.stop[client](); + mode = MULTIPLE_SINGLE_AGAIN; + } + next = signal SingleChannel.multipleDataReady[client](buffer, numSamples); + if (oldMode == MULTIPLE_REPEAT) + if (next){ + call DMAChannel.repeatTransfer(ADC12MEM, next, numSamples); + call AsyncAdcControl.start[client](); + } else + call AsyncAdcControl.stop[client](); + } + + default async command error_t SubSingleChannel.configureSingle[uint8_t id]( + const msp430adc12_channel_config_t *config) + { return FAIL; } + + default async command error_t SubSingleChannel.configureSingleRepeat[uint8_t id]( + const msp430adc12_channel_config_t *config, uint16_t jiffies) + { return FAIL; } + + default async command error_t SubSingleChannel.configureMultiple[uint8_t id]( + const msp430adc12_channel_config_t + *config, uint16_t buf[], uint16_t num, uint16_t jiffies) + { return FAIL; } + + default async command error_t SubSingleChannel.configureMultipleRepeat[uint8_t id]( + const msp430adc12_channel_config_t *config, uint16_t buf[], uint8_t + num, uint16_t jiffies) + { return FAIL; } + + default async command error_t SubSingleChannel.getData[uint8_t id]() + { return FAIL;} + + default async event error_t SingleChannel.singleDataReady[uint8_t id]( + uint16_t data) + { return FAIL; } + + default async event uint16_t* SingleChannel.multipleDataReady[uint8_t id]( + uint16_t buf[], uint16_t num) + { return 0;} + + default async command error_t AsyncAdcControl.stop[uint8_t id]() + { return FAIL; } + default async command error_t AsyncAdcControl.start[uint8_t id]() + { return FAIL; } +} diff --git a/tos/chips/msp430/adc12/Msp430Adc12ImplP.nc b/tos/chips/msp430/adc12/Msp430Adc12ImplP.nc new file mode 100644 index 00000000..4b5c3ff8 --- /dev/null +++ b/tos/chips/msp430/adc12/Msp430Adc12ImplP.nc @@ -0,0 +1,494 @@ +/* + * Copyright (c) 2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * - Revision ------------------------------------------------------------- + * $Revision$ + * $Date$ + * @author: Jan Hauer + * ======================================================================== + */ + +#include +module Msp430Adc12ImplP +{ + provides { + interface Init; + interface Msp430Adc12SingleChannel as SingleChannel[uint8_t id]; + interface AsyncStdControl as DMAExtension[uint8_t id]; + } + uses { + interface ArbiterInfo as ADCArbiterInfo; + interface HplAdc12; + interface Msp430Timer as TimerA;; + interface Msp430TimerControl as ControlA0; + interface Msp430TimerControl as ControlA1; + interface Msp430Compare as CompareA0; + interface Msp430Compare as CompareA1; + interface HplMsp430GeneralIO as Port60; + interface HplMsp430GeneralIO as Port61; + interface HplMsp430GeneralIO as Port62; + interface HplMsp430GeneralIO as Port63; + interface HplMsp430GeneralIO as Port64; + interface HplMsp430GeneralIO as Port65; + interface HplMsp430GeneralIO as Port66; + interface HplMsp430GeneralIO as Port67; + } +} +implementation +{ + enum { + SINGLE_DATA = 1, + SINGLE_DATA_REPEAT = 2, + MULTIPLE_DATA = 4, + MULTIPLE_DATA_REPEAT = 8, + CONVERSION_MODE_MASK = 0x0F, + + ADC_BUSY = 16, /* request pending */ + USE_TIMERA = 32, /* TimerA used for SAMPCON signal */ + }; + + uint8_t state; /* see enum above */ + + uint16_t *resultBuffer; /* conversion results */ + uint16_t resultBufferLength; /* length of buffer */ + uint16_t resultBufferIndex; /* offset into buffer */ + uint8_t clientID; /* ID of client that called getData() */ + + command error_t Init.init() + { + call HplAdc12.stopConversion(); + return SUCCESS; + } + + void prepareTimerA(uint16_t interval, uint16_t csSAMPCON, uint16_t cdSAMPCON) + { + msp430_compare_control_t ccResetSHI = { + ccifg : 0, cov : 0, out : 0, cci : 0, ccie : 0, + outmod : 0, cap : 0, clld : 0, scs : 0, ccis : 0, cm : 0 }; + + call TimerA.setMode(MSP430TIMER_STOP_MODE); + call TimerA.clear(); + call TimerA.disableEvents(); + call TimerA.setClockSource(csSAMPCON); + call TimerA.setInputDivider(cdSAMPCON); + call ControlA0.setControl(ccResetSHI); + call CompareA0.setEvent(interval-1); + call CompareA1.setEvent((interval-1)/2); + } + + void startTimerA() + { + msp430_compare_control_t ccSetSHI = { + ccifg : 0, cov : 0, out : 1, cci : 0, ccie : 0, + outmod : 0, cap : 0, clld : 0, scs : 0, ccis : 0, cm : 0 }; + msp430_compare_control_t ccResetSHI = { + ccifg : 0, cov : 0, out : 0, cci : 0, ccie : 0, + outmod : 0, cap : 0, clld : 0, scs : 0, ccis : 0, cm : 0 }; + msp430_compare_control_t ccRSOutmod = { + ccifg : 0, cov : 0, out : 0, cci : 0, ccie : 0, + outmod : 7, cap : 0, clld : 0, scs : 0, ccis : 0, cm : 0 }; + // manually trigger first conversion, then switch to Reset/set conversionMode + call ControlA1.setControl(ccResetSHI); + call ControlA1.setControl(ccSetSHI); + //call ControlA1.setControl(ccResetSHI); + call ControlA1.setControl(ccRSOutmod); + call TimerA.setMode(MSP430TIMER_UP_MODE); // go! + } + + void configureAdcPin( uint8_t inch ) + { +#ifdef P6PIN_AUTO_CONFIGURE + switch (inch) + { + case 0: call Port60.selectModuleFunc(); call Port60.makeInput(); break; + case 1: call Port61.selectModuleFunc(); call Port61.makeInput(); break; + case 2: call Port62.selectModuleFunc(); call Port62.makeInput(); break; + case 3: call Port63.selectModuleFunc(); call Port63.makeInput(); break; + case 4: call Port64.selectModuleFunc(); call Port64.makeInput(); break; + case 5: call Port65.selectModuleFunc(); call Port65.makeInput(); break; + case 6: call Port66.selectModuleFunc(); call Port66.makeInput(); break; + case 7: call Port67.selectModuleFunc(); call Port67.makeInput(); break; + } +#endif + } + + void resetAdcPin( uint8_t inch ) + { +#ifdef P6PIN_AUTO_CONFIGURE + switch (inch) + { + case 0: call Port60.selectIOFunc(); break; + case 1: call Port61.selectIOFunc(); break; + case 2: call Port62.selectIOFunc(); break; + case 3: call Port63.selectIOFunc(); break; + case 4: call Port64.selectIOFunc(); break; + case 5: call Port65.selectIOFunc(); break; + case 6: call Port66.selectIOFunc(); break; + case 7: call Port67.selectIOFunc(); break; + } +#endif + } + + async command error_t SingleChannel.configureSingle[uint8_t id]( + const msp430adc12_channel_config_t *config) + { + error_t result = ERESERVE; +#ifdef CHECK_ARGS + if (!config) + return EINVAL; +#endif + atomic { + if (state & ADC_BUSY) + return EBUSY; + if (call ADCArbiterInfo.userId() == id){ + adc12ctl1_t ctl1 = { + adc12busy: 0, + conseq: 0, + adc12ssel: config->adc12ssel, + adc12div: config->adc12div, + issh: 0, + shp: 1, + shs: 0, + cstartadd: 0 + }; + adc12memctl_t memctl = { + inch: config->inch, + sref: config->sref, + eos: 1 + }; + adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); + ctl0.msc = 1; + ctl0.sht0 = config->sht; + ctl0.sht1 = config->sht; + + state = SINGLE_DATA; + call HplAdc12.setCtl0(ctl0); + call HplAdc12.setCtl1(ctl1); + call HplAdc12.setMCtl(0, memctl); + call HplAdc12.setIEFlags(0x01); + result = SUCCESS; + } + } + return result; + } + + async command error_t SingleChannel.configureSingleRepeat[uint8_t id]( + const msp430adc12_channel_config_t *config, + uint16_t jiffies) + { + error_t result = ERESERVE; +#ifdef CHECK_ARGS + if (!config || jiffies == 1 || jiffies == 2) + return EINVAL; +#endif + atomic { + if (state & ADC_BUSY) + return EBUSY; + if (call ADCArbiterInfo.userId() == id) { + adc12ctl1_t ctl1 = { + adc12busy: 0, + conseq: 2, + adc12ssel: config->adc12ssel, + adc12div: config->adc12div, + issh: 0, + shp: 1, + shs: (jiffies == 0) ? 0 : 1, + cstartadd: 0 + }; + adc12memctl_t memctl = { + inch: config->inch, + sref: config->sref, + eos: 1 + }; + adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); + ctl0.msc = (jiffies == 0) ? 1 : 0; + ctl0.sht0 = config->sht; + ctl0.sht1 = config->sht; + + state = SINGLE_DATA_REPEAT; + call HplAdc12.setCtl0(ctl0); + call HplAdc12.setCtl1(ctl1); + call HplAdc12.setMCtl(0, memctl); + call HplAdc12.setIEFlags(0x01); + if (jiffies){ + state |= USE_TIMERA; + prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id); + } + result = SUCCESS; + } + } + return result; + } + + async command error_t SingleChannel.configureMultiple[uint8_t id]( + const msp430adc12_channel_config_t *config, + uint16_t *buf, uint16_t length, uint16_t jiffies) + { + error_t result = ERESERVE; +#ifdef CHECK_ARGS + if (!config || !buf || !length || jiffies == 1 || jiffies == 2) + return EINVAL; +#endif + atomic { + if (state & ADC_BUSY) + return EBUSY; + if (call ADCArbiterInfo.userId() == id){ + adc12ctl1_t ctl1 = { + adc12busy: 0, + conseq: (length > 16) ? 3 : 1, + adc12ssel: config->adc12ssel, + adc12div: config->adc12div, + issh: 0, + shp: 1, + shs: (jiffies == 0) ? 0 : 1, + cstartadd: 0 + }; + adc12memctl_t memctl = { + inch: config->inch, + sref: config->sref, + eos: 0 + }; + uint16_t i, mask = 1; + adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); + ctl0.msc = (jiffies == 0) ? 1 : 0; + ctl0.sht0 = config->sht; + ctl0.sht1 = config->sht; + + state = MULTIPLE_DATA; + resultBuffer = buf; + resultBufferLength = length; + resultBufferIndex = 0; + call HplAdc12.setCtl0(ctl0); + call HplAdc12.setCtl1(ctl1); + for (i=0; i<(length-1) && i < 15; i++) + call HplAdc12.setMCtl(i, memctl); + memctl.eos = 1; + call HplAdc12.setMCtl(i, memctl); + call HplAdc12.setIEFlags(mask << i); + + if (jiffies){ + state |= USE_TIMERA; + prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id); + } + result = SUCCESS; + } + } + return result; + } + + async command error_t SingleChannel.configureMultipleRepeat[uint8_t id]( + const msp430adc12_channel_config_t *config, + uint16_t *buf, uint8_t length, uint16_t jiffies) + { + error_t result = ERESERVE; +#ifdef CHECK_ARGS + if (!config || !buf || !length || length > 16 || jiffies == 1 || jiffies == 2) + return EINVAL; +#endif + atomic { + if (state & ADC_BUSY) + return EBUSY; + if (call ADCArbiterInfo.userId() == id){ + adc12ctl1_t ctl1 = { + adc12busy: 0, + ctl1.conseq = 3, + adc12ssel: config->adc12ssel, + adc12div: config->adc12div, + issh: 0, + shp: 1, + shs: (jiffies == 0) ? 0 : 1, + cstartadd: 0 + }; + adc12memctl_t memctl = { + inch: config->inch, + sref: config->sref, + eos: 0 + }; + uint16_t i, mask = 1; + adc12ctl0_t ctl0 = call HplAdc12.getCtl0(); + ctl0.msc = (jiffies == 0) ? 1 : 0; + ctl0.sht0 = config->sht; + ctl0.sht1 = config->sht; + + state = MULTIPLE_DATA_REPEAT; + resultBuffer = buf; + resultBufferLength = length; + resultBufferIndex = 0; + + call HplAdc12.setCtl0(ctl0); + call HplAdc12.setCtl1(ctl1); + for (i=0; i<(length-1) && i < 15; i++) + call HplAdc12.setMCtl(i, memctl); + memctl.eos = 1; + call HplAdc12.setMCtl(i, memctl); + call HplAdc12.setIEFlags(mask << i); + + if (jiffies){ + state |= USE_TIMERA; + prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id); + } + result = SUCCESS; + } + } + return result; + } + + async command error_t SingleChannel.getData[uint8_t id]() + { + atomic { + if (call ADCArbiterInfo.userId() == id){ + if (state & MULTIPLE_DATA_REPEAT && !resultBuffer) + return EINVAL; + if (state & ADC_BUSY) + return EBUSY; + state |= ADC_BUSY; + clientID = id; + configureAdcPin((call HplAdc12.getMCtl(0)).inch); + call HplAdc12.startConversion(); + if (state & USE_TIMERA) + startTimerA(); + return SUCCESS; + } + } + return FAIL; + } + + void stopConversion() + { + adc12memctl_t memctl = call HplAdc12.getMCtl(0); + if (state & USE_TIMERA) + call TimerA.setMode(MSP430TIMER_STOP_MODE); + resetAdcPin( memctl.inch ); + call HplAdc12.stopConversion(); + call HplAdc12.resetIFGs(); + state &= ~ADC_BUSY; + } + + async command error_t DMAExtension.start[uint8_t id]() + { + atomic { + if (call ADCArbiterInfo.userId() == id){ + call HplAdc12.setIEFlags(0); + call HplAdc12.resetIFGs(); + return SUCCESS; + } + } + return FAIL; + } + + async command error_t DMAExtension.stop[uint8_t id]() + { + atomic { + if (call ADCArbiterInfo.userId() == id){ + stopConversion(); + return SUCCESS; + } + } + return FAIL; + } + + async event void TimerA.overflow(){} + async event void CompareA0.fired(){} + async event void CompareA1.fired(){} + + async event void HplAdc12.conversionDone(uint16_t iv) + { + switch (state & CONVERSION_MODE_MASK) + { + case SINGLE_DATA: + stopConversion(); + signal SingleChannel.singleDataReady[clientID](call HplAdc12.getMem(0)); + break; + case SINGLE_DATA_REPEAT: + { + error_t repeatContinue; + repeatContinue = signal SingleChannel.singleDataReady[clientID]( + call HplAdc12.getMem(0)); + if (repeatContinue == FAIL) + stopConversion(); + break; + } + case MULTIPLE_DATA: + { + uint16_t i = 0, length; + if (resultBufferLength - resultBufferIndex > 16) + length = 16; + else + length = resultBufferLength - resultBufferIndex; + do { + *resultBuffer++ = call HplAdc12.getMem(i); + } while (++i < length); + resultBufferIndex += length; + + if (resultBufferLength - resultBufferIndex > 15) + return; + else if (resultBufferLength - resultBufferIndex > 0){ + adc12memctl_t memctl = call HplAdc12.getMCtl(0); + memctl.eos = 1; + call HplAdc12.setMCtl(resultBufferLength - resultBufferIndex, memctl); + } else { + stopConversion(); + resultBuffer -= resultBufferLength; + resultBufferIndex = 0; + signal SingleChannel.multipleDataReady[clientID](resultBuffer, resultBufferLength); + } + } + break; + case MULTIPLE_DATA_REPEAT: + { + uint8_t i = 0; + do { + *resultBuffer++ = call HplAdc12.getMem(i); + } while (++i < resultBufferLength); + + resultBuffer = signal SingleChannel.multipleDataReady[clientID]( + resultBuffer-resultBufferLength, + resultBufferLength); + if (!resultBuffer) + stopConversion(); + break; + } + } // switch + } + + default async event error_t SingleChannel.singleDataReady[uint8_t id](uint16_t data) + { + return FAIL; + } + + default async event uint16_t* SingleChannel.multipleDataReady[uint8_t id]( + uint16_t *buf, uint16_t length) + { + return 0; + } + + async event void HplAdc12.memOverflow(){} + async event void HplAdc12.conversionTimeOverflow(){} + +} + diff --git a/tos/chips/msp430/adc12/Msp430RefVoltArbiterImplP.nc b/tos/chips/msp430/adc12/Msp430RefVoltArbiterImplP.nc new file mode 100644 index 00000000..afe625e0 --- /dev/null +++ b/tos/chips/msp430/adc12/Msp430RefVoltArbiterImplP.nc @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2006, Technische Universität Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universität Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * - Revision ------------------------------------------------------------- + * $Revision$ + * $Date$ + * @author: Jan Hauer + * ======================================================================== + */ + +module Msp430RefVoltArbiterImplP +{ + provides interface Resource as ClientResource[uint8_t client]; + uses { + interface Resource as AdcResource[uint8_t client]; + interface SplitControl as RefVolt_1_5V; + interface SplitControl as RefVolt_2_5V; + interface AdcConfigure as Config[uint8_t client]; + } +} implementation { + enum { + NO_OWNER = 0xFF, + }; + norace uint8_t owner = NO_OWNER; + + task void switchOff(); + + async command error_t ClientResource.request[uint8_t client]() + { + return call AdcResource.request[client](); + } + + async command error_t ClientResource.immediateRequest[uint8_t client]() + { + const msp430adc12_channel_config_t* settings = call Config.getConfiguration[client](); + if (settings->sref == REFERENCE_VREFplus_AVss || + settings->sref == REFERENCE_VREFplus_VREFnegterm) + // always fails, because of the possible start-up delay (and async-sync transition) + return FAIL; + else { + error_t request = call AdcResource.immediateRequest[client](); + if (request == SUCCESS) + owner = client; + return request; + } + } + + event void AdcResource.granted[uint8_t client]() + { + const msp430adc12_channel_config_t* settings = call Config.getConfiguration[client](); + owner = client; + if (settings->sref == REFERENCE_VREFplus_AVss || + settings->sref == REFERENCE_VREFplus_VREFnegterm){ + error_t started; + if (settings->ref2_5v == REFVOLT_LEVEL_1_5) + started = call RefVolt_1_5V.start(); + else + started = call RefVolt_2_5V.start(); + if (started != SUCCESS){ + owner = NO_OWNER; + call AdcResource.release[client](); + call AdcResource.request[client](); + } + } else + signal ClientResource.granted[client](); + } + + event void RefVolt_1_5V.startDone(error_t error) + { + if (owner != NO_OWNER){ + // Note that it can still not be guaranteed that ClientResource.granted() + // is not signalled after ClientResource.release() has been called. + signal ClientResource.granted[owner](); + } + } + + event void RefVolt_2_5V.startDone(error_t error) + { + if (owner != NO_OWNER){ + // Note that it can still not be guaranteed that ClientResource.granted() + // is not signalled after ClientResource.release() has been called. + signal ClientResource.granted[owner](); + } + } + + async command error_t ClientResource.release[uint8_t client]() + { + atomic { + if (owner == client){ + owner = NO_OWNER; + post switchOff(); + } + } + return call AdcResource.release[client](); + } + + task void switchOff() + { + if (owner == NO_OWNER) + if (call RefVolt_1_5V.stop() != SUCCESS) + post switchOff(); + } + + event void RefVolt_1_5V.stopDone(error_t error) + { + } + + event void RefVolt_2_5V.stopDone(error_t error) + { + } + + async command uint8_t ClientResource.isOwner[uint8_t client]() + { + return call AdcResource.isOwner[client](); + } + + default event void ClientResource.granted[uint8_t client](){} + default async command error_t AdcResource.request[uint8_t client]() + { + return FAIL; + } + default async command error_t AdcResource.immediateRequest[uint8_t client]() + { + return FAIL; + } + default async command bool AdcResource.isOwner[uint8_t client]() { return FALSE; } + default async command error_t AdcResource.release[uint8_t client](){return FAIL;} + const msp430adc12_channel_config_t defaultConfig = {INPUT_CHANNEL_NONE,0,0,0,0,0,0,0}; + default async command const msp430adc12_channel_config_t* + Config.getConfiguration[uint8_t client]() + { + return &defaultConfig; + } +} + diff --git a/tos/chips/msp430/adc12/README.txt b/tos/chips/msp430/adc12/README.txt new file mode 100644 index 00000000..377a7e68 --- /dev/null +++ b/tos/chips/msp430/adc12/README.txt @@ -0,0 +1,68 @@ +The implementation of the 12-bit ADC stack on the MSP430 is in compliance with +TEP 101 (tinyos-2.x/doc/txt/tep101.txt) and provides virtualized access to the +ADC12 by seven different components: AdcReadClientC, AdcReadNowClientC, +AdcReadStreamClientC, Msp430Adc12ClientC, Msp430Adc12ClientAutoDMAC, +Msp430Adc12ClientAutoRVGC and Msp430Adc12ClientAutoDMA_RVGC. A client +component may wire to any of these components and it SHOULD NOT wire to any +other components in 'tinyos-2.x/tos/chips/msp430/adc12'. This document +explains the difference between the seven components. + + +A platform-independent application (an application like 'Oscilloscope' that is +supposed to run on, for example, the 'telosb' and 'micaz' platform at the same +time) cannot wire to an MSP430-specific interface like Msp430Adc12SingleChannel +(there is no MSP430 on micaz). Instead such an application may access the +MSP430 ADC through any of the three following components: + + * AdcReadClientC: to read single ADC values + * AdcReadNowClientC: to read single ADC values asynchronously (fast) + * AdcReadStreamClientC: to read multiple ADC values + +These components are less efficient than the MSP430-specific ADC components +(described below), but they provide standard TinyOS interfaces for reading ADC +values. Thus, if a client component does not care so much about efficiency but +rather about portability it should wire to any of these components. + + +An application that is written for an MSP430-based platform like 'eyesIFX' or +'telosb' can access the ADC12 in a more efficient way to, for example, do +high-frequency sampling through the Msp430Adc12SingleChannel interface. On the +MSP430 two additional hardware modules may become relevant when the ADC12 is +used: the internal reference voltage generator and the DMA controller. The +voltage generator outputs stabilized voltage of 1.5 V or 2.5 V, which may be +used as reference voltage in the conversion process. Whether the internal +reference voltage generator should be enabled during the conversion is +platform-specific (e.g. the light sensor on the 'eyesIFX' requires a stable +reference voltage). When an application requires a stable reference voltage +during the sampling process it should wire to the Msp430Adc12ClientAutoRVGC +component. This assures that when the app is signalled the Resource.granted() +event the reference voltage generator outputs a stable voltage (the level is +defined in the configuration data supplied by the application). The DMA +controller can be used to efficiently copy conversion data from ADC data +registers to the application buffer. DMA is only present on MSP430x15x and +MSP430x16x devices. When an application wants to use the DMA it can wire to +the Msp430Adc12ClientAutoDMAC component and then conversion results are +transferred using DMA. Both, enabling the reference generator and using the +DMA, therefore happens transparent to the app. There are four possible +combinations reflected by the following components that an MSP430-based +application may wire to: + + * Msp430Adc12ClientC: no DMA, no automatic reference voltage + * Msp430Adc12ClientAutoRVGC: automatic reference voltage, but no DMA + * Msp430Adc12ClientAutoDMAC: DMA, but no automatic reference voltage + * Msp430Adc12ClientAutoDMA_RVGC: DMA and automatic reference voltage + +During a conversion the respective ADC port pin (ports 6.0 - 6.7) must be +configured such that the peripheral module function is selected and the port +pin is switched to input direction. By default, for every client this is done +**automatically** in the ADC stack (Msp430Adc12ImplP), i.e. just before the +conversion starts the respective pin is switched to peripheral module function +and input direction and immediately after the conversion has finished it is +switched to I/O function mode. To disable this feature please comment out the +"P6PIN_AUTO_CONFIGURE" macro in Msp430Adc12.h. + +----- + +$Date$ +@author: Jan Hauer + diff --git a/tos/chips/msp430/timer/Alarm32khz16C.nc b/tos/chips/msp430/timer/Alarm32khz16C.nc new file mode 100644 index 00000000..463d0a82 --- /dev/null +++ b/tos/chips/msp430/timer/Alarm32khz16C.nc @@ -0,0 +1,47 @@ + +/* "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement + * is hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY + * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + */ + +/** + * Alarm32khzC is the alarm for async 32khz alarms + * + * @author Cory Sharp + * @see Please refer to TEP 102 for more information about this component and its + * intended use. + */ + +generic configuration Alarm32khz16C() +{ + provides interface Init; + provides interface Alarm; +} +implementation +{ + components new Msp430Timer32khzC() as Msp430Timer; + components new Msp430AlarmC(T32khz) as Msp430Alarm; + + Init = Msp430Alarm; + Alarm = Msp430Alarm; + + Msp430Alarm.Msp430Timer -> Msp430Timer; + Msp430Alarm.Msp430TimerControl -> Msp430Timer; + Msp430Alarm.Msp430Compare -> Msp430Timer; +} + diff --git a/tos/chips/msp430/timer/Alarm32khz32C.nc b/tos/chips/msp430/timer/Alarm32khz32C.nc new file mode 100644 index 00000000..be9ca2dd --- /dev/null +++ b/tos/chips/msp430/timer/Alarm32khz32C.nc @@ -0,0 +1,47 @@ + +/* "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement + * is hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY + * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + */ + +/** + * Alarm32khzC is the alarm for async 32khz alarms + * + * @author Cory Sharp + * @see Please refer to TEP 102 for more information about this component and its + * intended use. + */ + +generic configuration Alarm32khz32C() +{ + provides interface Init; + provides interface Alarm; +} +implementation +{ + components new Alarm32khz16C() as AlarmC; + components Counter32khz32C as Counter; + components new TransformAlarmC(T32khz,uint32_t,T32khz,uint16_t,0) as Transform; + + Init = AlarmC; + Alarm = Transform; + + Transform.AlarmFrom -> AlarmC; + Transform.Counter -> Counter; +} + diff --git a/tos/chips/msp430/timer/AlarmMilli16C.nc b/tos/chips/msp430/timer/AlarmMilli16C.nc new file mode 100644 index 00000000..4fec742d --- /dev/null +++ b/tos/chips/msp430/timer/AlarmMilli16C.nc @@ -0,0 +1,47 @@ + +/* "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement + * is hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY + * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + */ + +/** + * AlarmMilliC is the alarm for async millisecond alarms + * + * @author Cory Sharp + * @see Please refer to TEP 102 for more information about this component and its + * intended use. + */ + +generic configuration AlarmMilli16C() +{ + provides interface Init; + provides interface Alarm; +} +implementation +{ + components new Alarm32khz16C() as AlarmFrom; + components CounterMilli16C as Counter; + components new TransformAlarmC(TMilli,uint16_t,T32khz,uint16_t,5) as Transform; + + Init = AlarmFrom; + Alarm = Transform; + + Transform.AlarmFrom -> AlarmFrom; + Transform.Counter -> Counter; +} + diff --git a/tos/chips/msp430/timer/AlarmMilli32C.nc b/tos/chips/msp430/timer/AlarmMilli32C.nc new file mode 100644 index 00000000..d2227649 --- /dev/null +++ b/tos/chips/msp430/timer/AlarmMilli32C.nc @@ -0,0 +1,47 @@ + +/* "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement + * is hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY + * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + */ + +/** + * AlarmMilliC is the alarm for async millisecond alarms + * + * @author Cory Sharp + * @see Please refer to TEP 102 for more information about this component and its + * intended use. + */ + +generic configuration AlarmMilli32C() +{ + provides interface Init; + provides interface Alarm; +} +implementation +{ + components new Alarm32khz16C() as AlarmFrom; + components CounterMilli32C as Counter; + components new TransformAlarmC(TMilli,uint32_t,T32khz,uint16_t,5) as Transform; + + Init = AlarmFrom; + Alarm = Transform; + + Transform.AlarmFrom -> AlarmFrom; + Transform.Counter -> Counter; +} + diff --git a/tos/chips/msp430/timer/Counter32khz16C.nc b/tos/chips/msp430/timer/Counter32khz16C.nc new file mode 100644 index 00000000..3d272f23 --- /dev/null +++ b/tos/chips/msp430/timer/Counter32khz16C.nc @@ -0,0 +1,40 @@ + +/* "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement + * is hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY + * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + */ + +/** + * Counter32khz16C provides at 16-bit counter at 32768 ticks per second. + * + * @author Cory Sharp + * @see Please refer to TEP 102 for more information about this component and its + * intended use. + */ + +configuration Counter32khz16C +{ + provides interface Counter; +} +implementation +{ + components Msp430Counter32khzC as CounterFrom; + + Counter = CounterFrom; +} + diff --git a/tos/chips/msp430/timer/Counter32khz32C.nc b/tos/chips/msp430/timer/Counter32khz32C.nc new file mode 100644 index 00000000..e3916247 --- /dev/null +++ b/tos/chips/msp430/timer/Counter32khz32C.nc @@ -0,0 +1,43 @@ + +/* "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement + * is hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY + * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + */ + +/** + * Counter32khz32C provides at 32-bit counter at 32768 ticks per second. + * + * @author Cory Sharp + * @see Please refer to TEP 102 for more information about this component and its + * intended use. + */ + +configuration Counter32khz32C +{ + provides interface Counter; +} +implementation +{ + components Msp430Counter32khzC as CounterFrom; + components new TransformCounterC(T32khz,uint32_t,T32khz,uint16_t,0,uint16_t) as Transform; + + Counter = Transform; + + Transform.CounterFrom -> CounterFrom; +} + diff --git a/tos/chips/msp430/timer/CounterMilli16C.nc b/tos/chips/msp430/timer/CounterMilli16C.nc new file mode 100644 index 00000000..ee3b880f --- /dev/null +++ b/tos/chips/msp430/timer/CounterMilli16C.nc @@ -0,0 +1,43 @@ + +/* "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement + * is hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY + * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + */ + +/** + * CounterMilli16C provides at 16-bit counter at 1024 ticks per second. + * + * @author Cory Sharp + * @see Please refer to TEP 102 for more information about this component and its + * intended use. + */ + +configuration CounterMilli16C +{ + provides interface Counter; +} +implementation +{ + components Msp430Counter32khzC as CounterFrom; + components new TransformCounterC(TMilli,uint16_t,T32khz,uint16_t,5,uint8_t) as Transform; + + Counter = Transform.Counter; + + Transform.CounterFrom -> CounterFrom; +} + diff --git a/tos/chips/msp430/timer/CounterMilli32C.nc b/tos/chips/msp430/timer/CounterMilli32C.nc new file mode 100644 index 00000000..e8de47e0 --- /dev/null +++ b/tos/chips/msp430/timer/CounterMilli32C.nc @@ -0,0 +1,43 @@ + +/* "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement + * is hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY + * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + */ + +/** + * CounterMilli32C provides at 32-bit counter at 1024 ticks per second. + * + * @author Cory Sharp + * @see Please refer to TEP 102 for more information about this component and its + * intended use. + */ + +configuration CounterMilli32C +{ + provides interface Counter; +} +implementation +{ + components Msp430Counter32khzC as CounterFrom; + components new TransformCounterC(TMilli,uint32_t,T32khz,uint16_t,5,uint32_t) as Transform; + + Counter = Transform.Counter; + + Transform.CounterFrom -> CounterFrom; +} + diff --git a/tos/chips/msp430/usart/HplMsp430I2C.nc b/tos/chips/msp430/usart/HplMsp430I2C.nc new file mode 100644 index 00000000..8f2f8e94 --- /dev/null +++ b/tos/chips/msp430/usart/HplMsp430I2C.nc @@ -0,0 +1,102 @@ + +#include + +interface HplMsp430I2C { + + async command bool isI2C(); + async command void clearModeI2C(); + async command void setModeI2C( msp430_i2c_config_t* config ); + + // U0CTL + async command void setMasterMode(); + async command void setSlaveMode(); + + async command void enableI2C(); + async command void disableI2C(); + + // I2CTCTL + async command bool getWordMode(); + async command void setWordMode( bool mode ); + + async command bool getRepeatMode(); + async command void setRepeatMode( bool mode ); + + async command uint8_t getClockSource(); + async command void setClockSource( uint8_t src ); + + async command bool getTransmitReceiveMode(); + async command void setTransmitMode(); + async command void setReceiveMode(); + + async command bool getStartByte(); + async command void setStartByte(); + + async command bool getStopBit(); + async command void setStopBit(); + + async command bool getStartBit(); + async command void setStartBit(); + + // I2CDR + async command uint8_t getData(); + async command void setData( uint8_t data ); + + // I2CNDAT + async command uint8_t getTransferByteCount(); + async command void setTransferByteCount( uint8_t count ); + + // I2CPSC + async command uint8_t getClockPrescaler(); + async command void setClockPrescaler( uint8_t scaler ); + + // I2CSCLH and I2CSCLL + async command uint16_t getShiftClock(); + async command void setShiftClock( uint16_t shift ); + + // I2COA + async command uint16_t getOwnAddress(); + async command void setOwnAddress( uint16_t addr ); + + // I2CSA + async command uint16_t getSlaveAddress(); + async command void setSlaveAddress( uint16_t addr ); + + // I2CIE + async command void disableStartDetect(); + async command void enableStartDetect(); + + async command void disableGeneralCall(); + async command void enableGeneralCall(); + + async command void disableTransmitReady(); + async command void enableTransmitReady(); + + async command void disableReceiveReady(); + async command void enableReceiveReady(); + + async command void disableAccessReady(); + async command void enableAccessReady(); + + async command void disableOwnAddress(); + async command void enableOwnAddress(); + + async command void disableNoAck(); + async command void enableNoAck(); + + async command void disableArbitrationLost(); + async command void enableArbitrationLost(); + + // I2CIFG + async command bool isStartDetectPending(); + async command bool isGeneralCallPending(); + async command bool isTransmitReadyPending(); + async command bool isReceiveReadyPending(); + async command bool isAccessReadyPending(); + async command bool isOwnAddressPending(); + async command bool isNoAckPending(); + async command bool isArbitrationLostPending(); + + // I2CIV + async command uint8_t getIV(); + +} diff --git a/tos/chips/msp430/usart/HplMsp430I2C0C.nc b/tos/chips/msp430/usart/HplMsp430I2C0C.nc new file mode 100644 index 00000000..71028144 --- /dev/null +++ b/tos/chips/msp430/usart/HplMsp430I2C0C.nc @@ -0,0 +1,21 @@ + +configuration HplMsp430I2C0C { + + provides interface HplMsp430I2C; + +} + +implementation { + + components HplMsp430I2C0P as HplI2CP; + HplMsp430I2C = HplI2CP; + + components HplMsp430Usart0P as HplUsartP; + HplUsartP.HplI2C -> HplI2CP; + HplI2CP.HplUsart -> HplUsartP; + + components HplMsp430GeneralIOC as GIO; + HplI2CP.SIMO -> GIO.SIMO0; + HplI2CP.UCLK -> GIO.UCLK0; + +} diff --git a/tos/chips/msp430/usart/HplMsp430I2C0P.nc b/tos/chips/msp430/usart/HplMsp430I2C0P.nc new file mode 100644 index 00000000..68398d21 --- /dev/null +++ b/tos/chips/msp430/usart/HplMsp430I2C0P.nc @@ -0,0 +1,249 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +module HplMsp430I2C0P { + + provides interface HplMsp430I2C as HplI2C; + + uses interface HplMsp430Usart as HplUsart; + uses interface HplMsp430GeneralIO as SIMO; + uses interface HplMsp430GeneralIO as UCLK; + +} + +implementation { + + MSP430REG_NORACE(U0CTL); + MSP430REG_NORACE(I2CTCTL); + MSP430REG_NORACE(I2CDR); + MSP430REG_NORACE(I2CSA); + MSP430REG_NORACE(I2CIE); + + async command bool HplI2C.isI2C() { + atomic return ((U0CTL & I2C) && (U0CTL & SYNC) && (U0CTL & I2CEN)); + } + + async command void HplI2C.clearModeI2C() { + atomic { + U0CTL &= ~(I2C | SYNC | I2CEN); + call HplUsart.resetUsart(TRUE); + } + } + + async command void HplI2C.setModeI2C( msp430_i2c_config_t* config ) { + + call HplUsart.disableUart(); + call HplUsart.disableSpi(); + call SIMO.makeInput(); + call SIMO.selectModuleFunc(); + call UCLK.makeInput(); + call UCLK.selectModuleFunc(); + + atomic { + + U0CTL &= ~(I2C | I2CEN | SYNC); + U0CTL = SWRST; + U0CTL |= SYNC | I2C; + U0CTL &= ~I2CEN; + + U0CTL |= ( ( config->rxdmaen << 7 ) | + ( config->txdmaen << 6 ) | + ( config->xa << 4 ) | + ( config->listen << 3 ) ); + I2CTCTL = 0; + I2CTCTL = ( ( config->i2cword << 7 ) | + ( config->i2crm << 6 ) | + ( config->i2cssel << 4 ) ); + I2CPSC = config->i2cpsc; + I2CSCLH = config->i2csclh; + I2CSCLL = config->i2cscll; + I2COA = config->i2coa; + U0CTL |= I2CEN; + + } + + } + + // U0CTL + async command void HplI2C.setMasterMode() { U0CTL |= MST; } + async command void HplI2C.setSlaveMode() { U0CTL &= ~MST; } + + async command void HplI2C.enableI2C() { U0CTL |= I2CEN; } + async command void HplI2C.disableI2C() { U0CTL &= ~I2CEN; } + + // I2CTCTL + async command bool HplI2C.getWordMode() { + return ( I2CTCTL & I2CWORD ) != 0; + } + + async command void HplI2C.setWordMode( bool mode ) { + I2CTCTL |= ( mode & 0x1 ) << 7; + } + + async command bool HplI2C.getRepeatMode() { + return ( I2CTCTL & I2CRM ) != 0; + } + + async command void HplI2C.setRepeatMode( bool mode ) { + I2CTCTL |= ( mode & 0x1 ) << 6;; + } + + async command uint8_t HplI2C.getClockSource() { + return ( I2CTCTL >> 4 ) & 0x3;; + } + + async command void HplI2C.setClockSource( uint8_t src ) { + atomic I2CTCTL = ( ( src & 0x3 ) << 4 ) | I2CTCTL; + } + + async command bool HplI2C.getTransmitReceiveMode() { + return ( I2CTCTL & I2CTRX ) != 0; + } + + async command void HplI2C.setTransmitMode() { I2CTCTL |= I2CTRX; } + async command void HplI2C.setReceiveMode() { I2CTCTL &= ~I2CTRX; } + + async command bool HplI2C.getStartByte() { return (I2CTCTL & I2CSTB) != 0; } + async command void HplI2C.setStartByte() { I2CTCTL |= I2CSTB; } + + async command bool HplI2C.getStopBit() { return (I2CTCTL & I2CSTP) != 0; } + async command void HplI2C.setStopBit() { I2CTCTL |= I2CSTP; } + + async command bool HplI2C.getStartBit() { return (I2CTCTL & I2CSTT) != 0; } + async command void HplI2C.setStartBit() { I2CTCTL |= I2CSTT; } + + // I2CDR + async command uint8_t HplI2C.getData() { return I2CDR; } + async command void HplI2C.setData( uint8_t v ) { I2CDR = v; } + + // I2CNDAT + async command uint8_t HplI2C.getTransferByteCount() { return I2CNDAT; } + async command void HplI2C.setTransferByteCount( uint8_t v ) { I2CNDAT = v; } + + // I2CPSC + async command uint8_t HplI2C.getClockPrescaler() { return I2CPSC; } + async command void HplI2C.setClockPrescaler( uint8_t v ) { I2CPSC = v; } + + // I2CSCLH and I2CSCLL + async command uint16_t HplI2C.getShiftClock() { + uint16_t shift; + atomic { + shift = I2CSCLH; + shift <<= 8; + shift |= I2CSCLL; + } + return shift; + } + + async command void HplI2C.setShiftClock( uint16_t shift ) { + atomic { + I2CSCLH = shift >> 8; + I2CSCLL = shift; + } + } + + // I2COA + async command uint16_t HplI2C.getOwnAddress() { return I2COA; } + async command void HplI2C.setOwnAddress( uint16_t addr ) { I2COA = addr; } + + // I2CSA + async command uint16_t HplI2C.getSlaveAddress() { return I2CSA; } + async command void HplI2C.setSlaveAddress( uint16_t addr ) { I2CSA = addr; } + + // I2CIE + async command void HplI2C.disableStartDetect() { I2CIE &= ~STTIE; } + async command void HplI2C.enableStartDetect() { I2CIE |= STTIE; } + + async command void HplI2C.disableGeneralCall() { I2CIE &= ~GCIE; } + async command void HplI2C.enableGeneralCall() { I2CIE |= GCIE; } + + async command void HplI2C.disableTransmitReady() { I2CIE &= ~TXRDYIE; } + async command void HplI2C.enableTransmitReady() { I2CIE |= TXRDYIE; } + + async command void HplI2C.disableReceiveReady() { I2CIE &= ~RXRDYIE; } + async command void HplI2C.enableReceiveReady() { I2CIE |= RXRDYIE; } + + async command void HplI2C.disableAccessReady() { I2CIE &= ~ARDYIE; } + async command void HplI2C.enableAccessReady() { I2CIE |= ARDYIE; } + + async command void HplI2C.disableOwnAddress() { I2CIE &= ~OAIE; } + async command void HplI2C.enableOwnAddress() { I2CIE |= OAIE; } + + async command void HplI2C.disableNoAck() { I2CIE &= ~NACKIE; } + async command void HplI2C.enableNoAck() { I2CIE |= NACKIE; } + + async command void HplI2C.disableArbitrationLost() { I2CIE &= ~ALIE; } + async command void HplI2C.enableArbitrationLost() { I2CIE |= ALIE; } + + // I2CIFG + async command bool HplI2C.isStartDetectPending() { + return ( I2CIFG & STTIFG ) != 0; + } + + async command bool HplI2C.isGeneralCallPending() { + return ( I2CIFG & GCIFG ) != 0; + } + + async command bool HplI2C.isTransmitReadyPending() { + return ( I2CIFG & TXRDYIFG ) != 0; + } + + async command bool HplI2C.isReceiveReadyPending() { + return ( I2CIFG & RXRDYIFG ) != 0; + } + + async command bool HplI2C.isAccessReadyPending() { + return ( I2CIFG & ARDYIFG ) != 0; + } + + async command bool HplI2C.isOwnAddressPending() { + return ( I2CIFG & OAIFG ) != 0; + } + + async command bool HplI2C.isNoAckPending() { + return ( I2CIFG & NACKIFG ) != 0; + } + + async command bool HplI2C.isArbitrationLostPending() { + return ( I2CIFG & ALIFG ) != 0; + } + + // I2CIV + async command uint8_t HplI2C.getIV() { + return I2CIV; + } + +} diff --git a/tos/chips/msp430/usart/HplMsp430I2CInterrupts.nc b/tos/chips/msp430/usart/HplMsp430I2CInterrupts.nc new file mode 100644 index 00000000..454f811c --- /dev/null +++ b/tos/chips/msp430/usart/HplMsp430I2CInterrupts.nc @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +interface HplMsp430I2CInterrupts { + + async event void fired(); + +} diff --git a/tos/chips/msp430/usart/Msp430I2C0P.nc b/tos/chips/msp430/usart/Msp430I2C0P.nc new file mode 100644 index 00000000..5ab469b5 --- /dev/null +++ b/tos/chips/msp430/usart/Msp430I2C0P.nc @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +configuration Msp430I2C0P { + + provides interface Resource[ uint8_t id ]; + provides interface ResourceConfigure[uint8_t id ]; + provides interface I2CPacket as I2CBasicAddr; + + uses interface Resource as UsartResource[ uint8_t id ]; + uses interface Msp430I2CConfigure[ uint8_t id ]; + uses interface HplMsp430I2CInterrupts as I2CInterrupts; + +} + +implementation { + + components Msp430I2CP as I2CP; + Resource = I2CP.Resource; + ResourceConfigure = I2CP.ResourceConfigure; + Msp430I2CConfigure = I2CP.Msp430I2CConfigure; + I2CBasicAddr = I2CP.I2CBasicAddr; + UsartResource = I2CP.UsartResource; + I2CInterrupts = I2CP.I2CInterrupts; + + components HplMsp430I2C0C as HplI2CC; + I2CP.HplI2C -> HplI2CC; + + components LedsC as Leds; + I2CP.Leds -> Leds; + +} diff --git a/tos/chips/msp430/usart/Msp430I2CC.nc b/tos/chips/msp430/usart/Msp430I2CC.nc new file mode 100644 index 00000000..7c5727bc --- /dev/null +++ b/tos/chips/msp430/usart/Msp430I2CC.nc @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include +#include "msp430usart.h" + +generic configuration Msp430I2CC() { + + provides interface Resource; + provides interface I2CPacket as I2CBasicAddr; + + uses interface Msp430I2CConfigure; + +} + +implementation { + + enum { + CLIENT_ID = unique( MSP430_I2CO_BUS ), + }; + + components Msp430I2C0P as I2CP; + Resource = I2CP.Resource[ CLIENT_ID ]; + I2CBasicAddr = I2CP.I2CBasicAddr; + Msp430I2CConfigure = I2CP.Msp430I2CConfigure[ CLIENT_ID ]; + + components new Msp430Usart0C() as UsartC; + I2CP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; + I2CP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; + I2CP.I2CInterrupts -> UsartC.HplMsp430I2CInterrupts; + +} diff --git a/tos/chips/msp430/usart/Msp430I2CConfigure.nc b/tos/chips/msp430/usart/Msp430I2CConfigure.nc new file mode 100644 index 00000000..c01e4a08 --- /dev/null +++ b/tos/chips/msp430/usart/Msp430I2CConfigure.nc @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2004-2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Interface used by Msp430I2C clients to reconfigure the I2C before use + * @author Vlado Handziski + * @version $Revision$ $Date$ + */ + +#include "msp430usart.h" + +interface Msp430I2CConfigure { + async command msp430_i2c_config_t* getConfig(); +} diff --git a/tos/chips/msp430/usart/Msp430I2CP.nc b/tos/chips/msp430/usart/Msp430I2CP.nc new file mode 100644 index 00000000..ff163508 --- /dev/null +++ b/tos/chips/msp430/usart/Msp430I2CP.nc @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include + +module Msp430I2CP { + + provides interface Resource[ uint8_t id ]; + provides interface ResourceConfigure[ uint8_t id ]; + provides interface I2CPacket as I2CBasicAddr; + + uses interface Resource as UsartResource[ uint8_t id ]; + uses interface Msp430I2CConfigure[ uint8_t id ]; + uses interface HplMsp430I2C as HplI2C; + uses interface HplMsp430I2CInterrupts as I2CInterrupts; + uses interface Leds; + +} + +implementation { + + MSP430REG_NORACE(I2CIE); + + enum { + TIMEOUT = 64, + }; + + norace uint8_t* m_buf; + norace uint8_t m_len; + norace uint8_t m_pos; + norace i2c_flags_t m_flags; + + void nextRead(); + void nextWrite(); + void signalDone( error_t error ); + + async command error_t Resource.immediateRequest[ uint8_t id ]() { + return call UsartResource.immediateRequest[ id ](); + } + + async command error_t Resource.request[ uint8_t id ]() { + return call UsartResource.request[ id ](); + } + + async command uint8_t Resource.isOwner[ uint8_t id ]() { + return call UsartResource.isOwner[ id ](); + } + + async command error_t Resource.release[ uint8_t id ]() { + return call UsartResource.release[ id ](); + } + + async command void ResourceConfigure.configure[ uint8_t id ]() { + call HplI2C.setModeI2C(call Msp430I2CConfigure.getConfig[id]()); + } + + async command void ResourceConfigure.unconfigure[ uint8_t id ]() { + call HplI2C.clearModeI2C(); + } + + event void UsartResource.granted[ uint8_t id ]() { + signal Resource.granted[ id ](); + } + + default async command error_t UsartResource.request[ uint8_t id ]() { return FAIL; } + default async command error_t UsartResource.immediateRequest[ uint8_t id ]() { return FAIL; } + default async command error_t UsartResource.release[ uint8_t id ]() {return FAIL;} + default event void Resource.granted[ uint8_t id ]() {} + default async command msp430_i2c_config_t* Msp430I2CConfigure.getConfig[uint8_t id]() { + return &msp430_i2c_default_config; + } + + async command error_t I2CBasicAddr.read( i2c_flags_t flags, + uint16_t addr, uint8_t len, + uint8_t* buf ) { + + m_buf = buf; + m_len = len; + m_flags = flags; + m_pos = 0; + + call HplI2C.setMasterMode(); + call HplI2C.setReceiveMode(); + + call HplI2C.setSlaveAddress( addr ); + call HplI2C.enableReceiveReady(); + call HplI2C.enableAccessReady(); + call HplI2C.enableNoAck(); + if ( flags & I2C_START ) + call HplI2C.setStartBit(); + else + nextRead(); + + return SUCCESS; + + } + + async command error_t I2CBasicAddr.write( i2c_flags_t flags, + uint16_t addr, uint8_t len, + uint8_t* buf ) { + + m_buf = buf; + m_len = len; + m_flags = flags; + m_pos = 0; + + call HplI2C.setMasterMode(); + call HplI2C.setTransmitMode(); + + call HplI2C.setSlaveAddress( addr ); + call HplI2C.enableTransmitReady(); + call HplI2C.enableAccessReady(); + call HplI2C.enableNoAck(); + + if ( flags & I2C_START ) + call HplI2C.setStartBit(); + else + nextWrite(); + + return SUCCESS; + + } + + async event void I2CInterrupts.fired() { + + int i = 0; + + switch( call HplI2C.getIV() ) { + + case 0x04: + if ( I2CDCTL & I2CBB ) + call HplI2C.setStopBit(); + while( I2CDCTL & I2CBUSY ); + signalDone( FAIL ); + break; + + case 0x08: + while( (I2CDCTL & I2CBUSY) ) { + if ( i++ >= TIMEOUT ) { + signalDone( FAIL ); + return; + } + } + signalDone( SUCCESS ); + break; + + case 0x0A: + nextRead(); + break; + + case 0x0C: + nextWrite(); + break; + + default: + break; + + } + + } + + void nextRead() { + m_buf[ m_pos++ ] = call HplI2C.getData(); + if ( m_pos == m_len ) { + if ( m_flags & I2C_STOP ) + call HplI2C.setStopBit(); + else + signalDone( SUCCESS ); + } + } + + void nextWrite() { + if ( ( m_pos == m_len - 1 ) && ( m_flags & I2C_STOP ) ) { + call HplI2C.setStopBit(); + } + else if ( m_pos == m_len ) { + signalDone( SUCCESS ); + return; + } + call HplI2C.setData( m_buf[ m_pos++ ] ); + } + + void signalDone( error_t error ) { + I2CIE = 0; + if ( call HplI2C.getTransmitReceiveMode() ) + signal I2CBasicAddr.writeDone( error, I2CSA, m_len, m_buf ); + else + signal I2CBasicAddr.readDone( error, I2CSA, m_len, m_buf ); + } + + default async command error_t UsartResource.isOwner[ uint8_t id ]() { return FAIL; } + +} diff --git a/tos/chips/msp430/usart/Msp430Spi1C.nc b/tos/chips/msp430/usart/Msp430Spi1C.nc new file mode 100644 index 00000000..1c777d9c --- /dev/null +++ b/tos/chips/msp430/usart/Msp430Spi1C.nc @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2005-2006 Arched Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * An implementation of the SPI on USART0 for the MSP430. The current + * implementation defaults not using the DMA and performing the SPI + * transfers in software. To utilize the DMA, use Msp430SpiDma0P in + * place of Msp430SpiNoDma0P. + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include "msp430usart.h" + +generic configuration Msp430Spi1C() { + + provides interface Resource; + provides interface SpiByte; + provides interface SpiPacket; + + uses interface Msp430SpiConfigure; +} + +implementation { + + enum { + CLIENT_ID = unique( MSP430_SPI1_BUS ), + }; + + components Msp430SpiNoDma1P as SpiP; + Resource = SpiP.Resource[ CLIENT_ID ]; + SpiByte = SpiP.SpiByte; + SpiPacket = SpiP.SpiPacket[ CLIENT_ID ]; + Msp430SpiConfigure = SpiP.Msp430SpiConfigure[ CLIENT_ID ]; + + components new Msp430Usart1C() as UsartC; + SpiP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; + SpiP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; + SpiP.UsartInterrupts -> UsartC.HplMsp430UsartInterrupts; + +} diff --git a/tos/chips/msp430/usart/Msp430SpiConfigure.nc b/tos/chips/msp430/usart/Msp430SpiConfigure.nc new file mode 100644 index 00000000..f6fd05db --- /dev/null +++ b/tos/chips/msp430/usart/Msp430SpiConfigure.nc @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2004-2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Interface used by Msp430Spi clients to reconfigure the SPI before use + * @author Vlado Handziski + * @version $Revision$ $Date$ + */ + +#include "msp430usart.h" + +interface Msp430SpiConfigure { + async command msp430_spi_config_t* getConfig(); +} diff --git a/tos/chips/msp430/usart/Msp430SpiDma1P.nc b/tos/chips/msp430/usart/Msp430SpiDma1P.nc new file mode 100644 index 00000000..dfbd2780 --- /dev/null +++ b/tos/chips/msp430/usart/Msp430SpiDma1P.nc @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2005-2006 Arched Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +configuration Msp430SpiDma1P { + + provides interface Resource[ uint8_t id ]; + provides interface ResourceControl [uint8_t id]; + provides interface SpiByte; + provides interface SpiPacket[ uint8_t id ]; + + uses interface Resource as UsartResource[ uint8_t id ]; + uses interface Msp430SpiConfigure[ uint8_t id ]; + uses interface HplMsp430UsartInterrupts as UsartInterrupts; + +} + +implementation { + + components new Msp430SpiDmaP() as SpiP; + Resource = SpiP.Resource; + ResourceControl = SpiP.ResourceControl; + Msp430SpiConfigure = SpiP.Msp430SpiConfigure; + SpiByte = SpiP.SpiByte; + SpiPacket = SpiP.SpiPacket; + UsartResource = SpiP.UsartResource; + UsartInterrupts = SpiP.UsartInterrupts; + + components HplMsp430Usart1C as UsartC; + SpiP.Usart -> UsartC; + + components Msp430DmaC as DmaC; + SpiP.DmaChannel1 -> DmaC.Channel1; + SpiP.DmaChannel2 -> DmaC.Channel2; + + components LedsC as Leds; + SpiP.Leds -> Leds; + +} diff --git a/tos/chips/msp430/usart/Msp430SpiNoDma1P.nc b/tos/chips/msp430/usart/Msp430SpiNoDma1P.nc new file mode 100644 index 00000000..683434eb --- /dev/null +++ b/tos/chips/msp430/usart/Msp430SpiNoDma1P.nc @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2005-2006 Arched Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +configuration Msp430SpiNoDma1P { + + provides interface Resource[ uint8_t id ]; + provides interface ResourceConfigure[uint8_t id ]; + provides interface SpiByte; + provides interface SpiPacket[ uint8_t id ]; + + uses interface Resource as UsartResource[ uint8_t id ]; + uses interface Msp430SpiConfigure[ uint8_t id ]; + uses interface HplMsp430UsartInterrupts as UsartInterrupts; + +} + +implementation { + + components new Msp430SpiNoDmaP() as SpiP; + Resource = SpiP.Resource; + ResourceConfigure = SpiP.ResourceConfigure; + Msp430SpiConfigure = SpiP.Msp430SpiConfigure; + SpiByte = SpiP.SpiByte; + SpiPacket = SpiP.SpiPacket; + UsartResource = SpiP.UsartResource; + UsartInterrupts = SpiP.UsartInterrupts; + + components HplMsp430Usart1C as UsartC; + SpiP.Usart -> UsartC; + + components LedsC as Leds; + SpiP.Leds -> Leds; + +} diff --git a/tos/chips/msp430/usart/Msp430Uart0C.nc b/tos/chips/msp430/usart/Msp430Uart0C.nc new file mode 100644 index 00000000..470872d2 --- /dev/null +++ b/tos/chips/msp430/usart/Msp430Uart0C.nc @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2005-2006 Arched Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * An implementation of the UART on USART0 for the MSP430. + * @author Vlado Handziski + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include "msp430usart.h" + +generic configuration Msp430Uart0C() { + + provides interface Resource; + provides interface UartStream; + provides interface UartByte; + provides interface Msp430UartControl as UartControl; + + uses interface Msp430UartConfigure; +} + +implementation { + + enum { + CLIENT_ID = unique( MSP430_UARTO_BUS ), + }; + + components Msp430Uart0P as UartP; + Resource = UartP.Resource[ CLIENT_ID ]; + UartStream = UartP.UartStream; + UartByte = UartP.UartByte; + UartControl = UartP.UartControl[ CLIENT_ID ]; + Msp430UartConfigure = UartP.Msp430UartConfigure[ CLIENT_ID ]; + + components new Msp430Usart0C() as UsartC; + UartP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; + UartP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; + UartP.UsartInterrupts -> UsartC.HplMsp430UsartInterrupts; + +} diff --git a/tos/chips/msp430/usart/Msp430Uart0P.nc b/tos/chips/msp430/usart/Msp430Uart0P.nc new file mode 100644 index 00000000..f910998c --- /dev/null +++ b/tos/chips/msp430/usart/Msp430Uart0P.nc @@ -0,0 +1,73 @@ +/** + * Copyright (c) 2005-2006 Arched Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @author Vlado Handziski + * @version $Revision$ $Date$ + */ + +configuration Msp430Uart0P { + + provides interface Resource[ uint8_t id ]; + provides interface ResourceConfigure[uint8_t id ]; + provides interface Msp430UartControl as UartControl[ uint8_t id ]; + provides interface UartStream; + provides interface UartByte; + + uses interface Resource as UsartResource[ uint8_t id ]; + uses interface Msp430UartConfigure[ uint8_t id ]; + uses interface HplMsp430UsartInterrupts as UsartInterrupts; + +} + +implementation { + + components new Msp430UartP() as UartP; + Resource = UartP.Resource; + ResourceConfigure = UartP.ResourceConfigure; + Msp430UartConfigure = UartP.Msp430UartConfigure; + UartControl = UartP.UartControl; + UartStream = UartP.UartStream; + UartByte = UartP.UartByte; + UsartResource = UartP.UsartResource; + UsartInterrupts = UartP.UsartInterrupts; + + components HplMsp430Usart0C as UsartC; + UartP.Usart -> UsartC; + + components Counter32khz16C as CounterC; + UartP.Counter -> CounterC; + + components LedsC as Leds; + UartP.Leds -> Leds; + +} diff --git a/tos/chips/msp430/usart/Msp430Uart1P.nc b/tos/chips/msp430/usart/Msp430Uart1P.nc new file mode 100644 index 00000000..4c57206c --- /dev/null +++ b/tos/chips/msp430/usart/Msp430Uart1P.nc @@ -0,0 +1,73 @@ +/** + * Copyright (c) 2005-2006 Arched Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @author Vlado Handziski + * @version $Revision$ $Date$ + */ + +configuration Msp430Uart1P { + + provides interface Resource[ uint8_t id ]; + provides interface ResourceConfigure[uint8_t id ]; + provides interface Msp430UartControl as UartControl[ uint8_t id ]; + provides interface UartStream; + provides interface UartByte; + + uses interface Resource as UsartResource[ uint8_t id ]; + uses interface Msp430UartConfigure[ uint8_t id ]; + uses interface HplMsp430UsartInterrupts as UsartInterrupts; + +} + +implementation { + + components new Msp430UartP() as UartP; + Resource = UartP.Resource; + ResourceConfigure = UartP.ResourceConfigure; + Msp430UartConfigure = UartP.Msp430UartConfigure; + UartControl = UartP.UartControl; + UartStream = UartP.UartStream; + UartByte = UartP.UartByte; + UsartResource = UartP.UsartResource; + UsartInterrupts = UartP.UsartInterrupts; + + components HplMsp430Usart1C as UsartC; + UartP.Usart -> UsartC; + + components Counter32khz16C as CounterC; + UartP.Counter -> CounterC; + + components LedsC as Leds; + UartP.Leds -> Leds; + +} diff --git a/tos/chips/msp430/usart/Msp430UartConfigure.nc b/tos/chips/msp430/usart/Msp430UartConfigure.nc new file mode 100644 index 00000000..92af9873 --- /dev/null +++ b/tos/chips/msp430/usart/Msp430UartConfigure.nc @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2004-2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Interface used by Msp430Uart clients to reconfigure the UART before use + * @author Vlado Handziski + * @version $Revision$ $Date$ + */ + +#include "msp430usart.h" + +interface Msp430UartConfigure { + async command msp430_uart_config_t* getConfig(); +} diff --git a/tos/chips/msp430/usart/Msp430UartControl.nc b/tos/chips/msp430/usart/Msp430UartControl.nc new file mode 100644 index 00000000..49f8352d --- /dev/null +++ b/tos/chips/msp430/usart/Msp430UartControl.nc @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2004-2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Interface used by Msp430Uart clients to control/configure the Uart. + * + * @author Philipp Huppertz (huppertz@tkn.tu-berlin.de) + */ +interface Msp430UartControl { + + /** + * Sets the Uart to Rx mode. + */ + async command void setModeRx(); + + /** + * Sets the Uart to Tx mode. + */ + async command void setModeTx(); + + /** + * Sets the Uart to duplex mode. + */ + async command void setModeDuplex(); + +} diff --git a/tos/chips/msp430/usart/Msp430Usart1C.nc b/tos/chips/msp430/usart/Msp430Usart1C.nc new file mode 100644 index 00000000..29f5d021 --- /dev/null +++ b/tos/chips/msp430/usart/Msp430Usart1C.nc @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2005-2006 Arched Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Provides an interface for USART1 on the MSP430. + * + * @author Vlado Handziski + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +generic configuration Msp430Usart1C() { + + provides interface Resource; + provides interface ArbiterInfo; + provides interface HplMsp430Usart; + provides interface HplMsp430UsartInterrupts; + + uses interface ResourceConfigure; +} + +implementation { + + enum { + CLIENT_ID = unique( MSP430_HPLUSART1_RESOURCE ), + }; + + components Msp430UsartShare1P as UsartShareP; + + Resource = UsartShareP.Resource[ CLIENT_ID ]; + ResourceConfigure = UsartShareP.ResourceConfigure[ CLIENT_ID ]; + ArbiterInfo = UsartShareP.ArbiterInfo; + HplMsp430UsartInterrupts = UsartShareP.Interrupts[ CLIENT_ID ]; + + components HplMsp430Usart1C as UsartC; + HplMsp430Usart = UsartC; + +} diff --git a/tos/chips/msp430/usart/Msp430UsartShare1P.nc b/tos/chips/msp430/usart/Msp430UsartShare1P.nc new file mode 100644 index 00000000..153906a7 --- /dev/null +++ b/tos/chips/msp430/usart/Msp430UsartShare1P.nc @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2005-2006 Arched Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Vlado Handziski + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +configuration Msp430UsartShare1P { + + provides interface HplMsp430UsartInterrupts as Interrupts[ uint8_t id ]; + provides interface Resource[ uint8_t id ]; + provides interface ArbiterInfo; + + uses interface ResourceConfigure[ uint8_t id ]; +} + +implementation { + + components new Msp430UsartShareP() as UsartShareP; + Interrupts = UsartShareP; + UsartShareP.RawInterrupts -> UsartC; + + components new FcfsArbiterC( MSP430_HPLUSART1_RESOURCE ) as ArbiterC; + Resource = ArbiterC; + ResourceConfigure = ArbiterC; + ArbiterInfo = ArbiterC; + UsartShareP.ArbiterInfo -> ArbiterC; + + components new AsyncStdControlPowerManagerC() as PowerManagerC; + PowerManagerC.ResourceController -> ArbiterC; + + components HplMsp430Usart1C as UsartC; + PowerManagerC.AsyncStdControl -> UsartC; +} diff --git a/tos/chips/pxa27x/dma/DMA.h b/tos/chips/pxa27x/dma/DMA.h new file mode 100644 index 00000000..fd9aaaa1 --- /dev/null +++ b/tos/chips/pxa27x/dma/DMA.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +#ifndef _DMA_H +#define _DMA_H + +typedef uint8_t DMAPeripheralID_t; +typedef uint8_t DMAPriority_t; + +typedef enum { + DMA_BURST_SIZE_8BYTES, + DMA_BURST_SIZE_16BYTES, + DMA_BURST_SIZE_32BYTES, +} DMAMaxBurstSize_t; + +typedef enum { + DMA_WIDTH_1BYTE, + DMA_WIDTH_2BYTES, + DMA_WIDTH_4BYTES, +} DMATransferWidth_t; + +#endif /* _DMA_H */ diff --git a/tos/chips/pxa27x/dma/HalPXA27xDMAChannel.nc b/tos/chips/pxa27x/dma/HalPXA27xDMAChannel.nc new file mode 100644 index 00000000..f612fef6 --- /dev/null +++ b/tos/chips/pxa27x/dma/HalPXA27xDMAChannel.nc @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +#include "DMA.h" + +interface HalPXA27xDMAChannel +{ + + command error_t requestChannel(DMAPeripheralID_t peripheralID, + DMAPriority_t priority, bool permanent); + event error_t requestChannelDone(); + command error_t returnChannel(DMAPeripheralID_t peripheralID); + + command error_t setSourceAddr(uint32_t val); + command error_t setTargetAddr(uint32_t val); + command error_t enableSourceAddrIncrement(bool enable); + command error_t enableTargetAddrIncrement(bool enable); + command error_t enableSourceFlowControl(bool enable); + command error_t enableTargetFlowControl(bool enable); + command error_t setMaxBurstSize(DMAMaxBurstSize_t size); + command error_t setTransferLength(uint16_t length); + command error_t setTransferWidth(DMATransferWidth_t width); + command error_t run(bool InterruptEn); + command error_t stop(); + async event void Interrupt(); +} diff --git a/tos/chips/pxa27x/dma/HalPXA27xDMAChannelC.nc b/tos/chips/pxa27x/dma/HalPXA27xDMAChannelC.nc new file mode 100644 index 00000000..f4d6afd3 --- /dev/null +++ b/tos/chips/pxa27x/dma/HalPXA27xDMAChannelC.nc @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +configuration HalPXA27xDMAChannelC { + provides interface HalPXA27xDMAChannel[uint8_t chnl]; +} + +implementation { + components HplPXA27xDMAC, HalPXA27xDMAChannelM; + + HalPXA27xDMAChannel = HalPXA27xDMAChannelM; + HalPXA27xDMAChannelM.HplPXA27xDMAChnl -> HplPXA27xDMAC; + HalPXA27xDMAChannelM.HplPXA27xDMACntl -> HplPXA27xDMAC; +} diff --git a/tos/chips/pxa27x/dma/HalPXA27xDMAChannelM.nc b/tos/chips/pxa27x/dma/HalPXA27xDMAChannelM.nc new file mode 100644 index 00000000..4bfdc475 --- /dev/null +++ b/tos/chips/pxa27x/dma/HalPXA27xDMAChannelM.nc @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +#include "DMA.h" + +module HalPXA27xDMAChannelM { + provides interface HalPXA27xDMAChannel[uint8_t chnl]; + + uses interface HplPXA27xDMACntl; + uses interface HplPXA27xDMAChnl[uint8_t chnl]; +} + +implementation { + uint8_t requestedChannel; + task void reqCompleteTask() { + signal HalPXA27xDMAChannel.requestChannelDone[requestedChannel](); + } + + command error_t HalPXA27xDMAChannel.requestChannel[uint8_t chnl](DMAPeripheralID_t peripheralID, DMAPriority_t priority, bool permanent) { + // priority is decided based on which channel you pick (PXADEV 5-4) + // permanent? nothing lasts forever my friend + + uint32_t valDRCMR; + valDRCMR = call HplPXA27xDMACntl.getDRCMR(peripheralID) | DRCMR_MAPVLD; + valDRCMR = valDRCMR & ~DRCMR_CHLNUM(0x1F); + valDRCMR |= DRCMR_CHLNUM(chnl); + call HplPXA27xDMACntl.setDRCMR(peripheralID, valDRCMR); + requestedChannel = chnl; + post reqCompleteTask(); + return SUCCESS; + } + + command error_t HalPXA27xDMAChannel.returnChannel[uint8_t chnl](DMAPeripheralID_t peripheralID) { + // modified interface to require peripheralID, this isn't virtualized + uint32_t valDRCMR; + valDRCMR = call HplPXA27xDMACntl.getDRCMR(peripheralID) & ~DRCMR_MAPVLD; + call HplPXA27xDMACntl.setDRCMR(peripheralID, valDRCMR); + return SUCCESS; + } + + command error_t HalPXA27xDMAChannel.setSourceAddr[uint8_t chnl](uint32_t val) { + call HplPXA27xDMAChnl.setDSADR[chnl](val); + return SUCCESS; + } + + command error_t HalPXA27xDMAChannel.setTargetAddr[uint8_t chnl](uint32_t val) { + call HplPXA27xDMAChnl.setDTADR[chnl](val); + return SUCCESS; + } + + command error_t HalPXA27xDMAChannel.enableSourceAddrIncrement[uint8_t chnl](bool enable) { + uint32_t valDCMD; + valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); + + valDCMD = (enable) ? (valDCMD | DCMD_INCSRCADDR) : (valDCMD & ~DCMD_INCSRCADDR); + + call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); + return SUCCESS; + } + + command error_t HalPXA27xDMAChannel.enableTargetAddrIncrement[uint8_t chnl](bool enable) { + uint32_t valDCMD; + valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); + + valDCMD = (enable) ? (valDCMD | DCMD_INCTRGADDR) : (valDCMD & ~DCMD_INCTRGADDR); + + call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); + return SUCCESS; + } + + command error_t HalPXA27xDMAChannel.enableSourceFlowControl[uint8_t chnl](bool enable) { + uint32_t valDCMD; + valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); + + valDCMD = (enable) ? (valDCMD | DCMD_FLOWSRC) : (valDCMD & ~DCMD_FLOWSRC); + + call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); + return SUCCESS; + } + + command error_t HalPXA27xDMAChannel.enableTargetFlowControl[uint8_t chnl](bool enable) { + uint32_t valDCMD; + valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); + + valDCMD = (enable) ? (valDCMD | DCMD_FLOWTRG) : (valDCMD & ~DCMD_FLOWTRG); + + call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); + return SUCCESS; + } + + command error_t HalPXA27xDMAChannel.setMaxBurstSize[uint8_t chnl](DMAMaxBurstSize_t size) { + uint32_t valDCMD; + valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); + valDCMD &= ~DCMD_BURST32; // zero the bits first + + switch(size) { + case DMA_BURST_SIZE_8BYTES: + valDCMD |= DCMD_BURST8; + break; + case DMA_BURST_SIZE_16BYTES: + valDCMD |= DCMD_BURST16; + break; + case DMA_BURST_SIZE_32BYTES: + valDCMD |= DCMD_BURST32; + break; + default: + return FAIL; + } + + call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); + return SUCCESS; + } + + command error_t HalPXA27xDMAChannel.setTransferLength[uint8_t chnl](uint16_t length) { + uint32_t valDCMD; + valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); + + if(length > DCMD_MAXLEN) + return FAIL; + + valDCMD &= ~DCMD_MAXLEN; // zero the bits first + valDCMD |= DCMD_LEN(length); + + call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); + return SUCCESS; + } + + command error_t HalPXA27xDMAChannel.setTransferWidth[uint8_t chnl](DMATransferWidth_t width) { + uint32_t valDCMD; + valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); + valDCMD &= ~DCMD_WIDTH4; // zero the bits first + + switch(width) { + case DMA_WIDTH_1BYTE: + valDCMD |= DCMD_WIDTH1; + break; + case DMA_WIDTH_2BYTES: + valDCMD |= DCMD_WIDTH2; + break; + case DMA_WIDTH_4BYTES: + valDCMD |= DCMD_WIDTH4; + break; + default: + return FAIL; + } + + call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); + return SUCCESS; + } + + command error_t HalPXA27xDMAChannel.run[uint8_t chnl](bool InterruptEn) { + uint32_t valDCSR; + uint32_t valDCMD; + valDCSR = call HplPXA27xDMAChnl.getDCSR[chnl](); + valDCMD = call HplPXA27xDMAChnl.getDCMD[chnl](); + + valDCMD = (InterruptEn) ? valDCMD | DCMD_ENDIRQEN : valDCSR & ~DCMD_ENDIRQEN; + + call HplPXA27xDMAChnl.setDCMD[chnl](valDCMD); + call HplPXA27xDMAChnl.setDCSR[chnl](valDCSR | DCSR_RUN | DCSR_NODESCFETCH); + return SUCCESS; + } + + command error_t HalPXA27xDMAChannel.stop[uint8_t chnl]() { + uint32_t valDCSR; + valDCSR = call HplPXA27xDMAChnl.getDCSR[chnl](); + + call HplPXA27xDMAChnl.setDCSR[chnl](valDCSR & ~DCSR_RUN); + return SUCCESS; + } + + async event void HplPXA27xDMAChnl.interruptDMA[uint8_t chnl]() { + // might want to clear interrupt first + // ... + + signal HalPXA27xDMAChannel.Interrupt[chnl](); + } + + default async event void HalPXA27xDMAChannel.Interrupt[uint8_t chnl]() { } + default event error_t HalPXA27xDMAChannel.requestChannelDone[uint8_t chnl]() { return FAIL; } +} diff --git a/tos/chips/pxa27x/dma/HplPXA27xDMAInfoC.nc b/tos/chips/pxa27x/dma/HplPXA27xDMAInfoC.nc new file mode 100644 index 00000000..27edccc8 --- /dev/null +++ b/tos/chips/pxa27x/dma/HplPXA27xDMAInfoC.nc @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +// Example (STUART RX): +// peripheral = 19 (Request to Channel Map register in PXA Dev Manual) +// baseAddr = &STRBR (DMA address) + +// Example (STUART TX): +// peripheral = 20 +// baseAddr = &STTHR + +generic module HplPXA27xDMAInfoC(uint8_t peripheral, uint32_t baseAddr) { + provides interface HplPXA27xDMAInfo; +} + +implementation { + async command uint32_t HplPXA27xDMAInfo.getAddr() { + return baseAddr; + } + + async command uint8_t HplPXA27xDMAInfo.getMapIndex() { + return peripheral; + } +} diff --git a/tos/chips/pxa27x/p30/Flash.nc b/tos/chips/pxa27x/p30/Flash.nc new file mode 100644 index 00000000..7c997f38 --- /dev/null +++ b/tos/chips/pxa27x/p30/Flash.nc @@ -0,0 +1,76 @@ +/* tab:4 + * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By + * downloading, copying, installing or using the software you agree to + * this license. If you do not agree to this license, do not download, + * install, copy or use the software. + * + * Intel Open Source License + * + * Copyright (c) 2002 Intel Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR ITS + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + */ +/** + * Interface for writing and erasing in flash memory + * + * Author: Josh Herbach + * Revision: 1.0 + * Date: 09/02/2005 + */ + +interface Flash +{ + /** + * Writes numBytes of the buffer data to the address in flash specified + * by addr. This function will only set bits low for the bytes it is + * supposed to write to.If addr connot be written to for any reason returns + * FAIL, otherwise returns SUCCESS. + * + * @returns SUCCESS or FAIL. + */ + command error_t write(uint32_t addr, uint8_t* data, uint32_t numBytes); + + /** + * Erases the block of flash that contains addr, setting all bits to 1. + * If this function fails for any reason it will return FAIL, otherwise + * SUCCESS. + * + * @returns SUCCESS or FAIL. + */ + command error_t erase(uint32_t addr); + + /** + * Reads len number of bytes into buf, starting at addr. If addr + * cannot be read for any reason returns FAIL, otherwise returns + * SUCCESS. + */ + command error_t read(uint32_t addr, uint8_t* buf, uint32_t len); +} + + + diff --git a/tos/chips/pxa27x/p30/FlashC.nc b/tos/chips/pxa27x/p30/FlashC.nc new file mode 100644 index 00000000..5fbf140a --- /dev/null +++ b/tos/chips/pxa27x/p30/FlashC.nc @@ -0,0 +1,17 @@ +/* + * Author: Josh Herbach + * Revision: 1.0 + * Date: 09/02/2005 + */ + +configuration FlashC { + provides interface Flash; +} +implementation { + components + Main, + FlashM; + + Main.StdControl -> FlashM; + Flash = FlashM; +} diff --git a/tos/chips/pxa27x/p30/HalP30C.nc b/tos/chips/pxa27x/p30/HalP30C.nc new file mode 100644 index 00000000..7df5abf9 --- /dev/null +++ b/tos/chips/pxa27x/p30/HalP30C.nc @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * P30 Hal component + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +configuration HalP30C { + provides interface Flash; +} + +implementation { + components HalP30P, HplP30P, MainC; + + Flash = HalP30P; + + MainC.SoftwareInit -> HalP30P; + HalP30P.HplP30 -> HplP30P; +} diff --git a/tos/chips/pxa27x/p30/HalP30P.nc b/tos/chips/pxa27x/p30/HalP30P.nc new file mode 100644 index 00000000..5bd0f6cd --- /dev/null +++ b/tos/chips/pxa27x/p30/HalP30P.nc @@ -0,0 +1,280 @@ +/* + * Author: Josh Herbach + * Revision: 1.0 + * Date: 09/02/2005 + */ +module HalP30P { + provides interface Init; + provides interface Flash; //does not allow writing into FLASH_PROTECTED_REGION + uses interface HplP30; +} +implementation { + +#include + + enum { + FLASH_STATE_READ_INACTIVE, + FLASH_STATE_PROGRAM, + FLASH_STATE_ERASE, + FLASH_STATE_READ_ACTIVE + }; + + uint8_t FlashPartitionState[FLASH_PARTITION_COUNT]; + uint8_t init = 0, programBufferSupported = 2, currBlock = 0; + + command error_t Init.init() { + int i = 0; + if(init != 0) + return SUCCESS; + init = 1; + for(i = 0; i < FLASH_PARTITION_COUNT; i++) + FlashPartitionState[i] = FLASH_STATE_READ_INACTIVE; + + return SUCCESS; + } + + uint16_t writeHelper(uint32_t addr, uint8_t* data, uint32_t numBytes, + uint8_t prebyte, uint8_t postbyte){ + uint32_t i = 0, j = 0, k = 0; + error_t status; + uint16_t buffer[FLASH_PROGRAM_BUFFER_SIZE]; + + if(numBytes == 0) + return FAIL; + + if(addr % 2 == 1){ + status = call HplP30.progWord(addr - 1, prebyte | (data[i] << 8)); + i++; + if(status != SUCCESS) + return FAIL; + } + + if(addr % 2 == numBytes % 2){ + if(programBufferSupported == 1) + for(; i < numBytes; i = k){ + for(j = 0, k = i; k < numBytes && + j < FLASH_PROGRAM_BUFFER_SIZE; j++, k+=2) + buffer[j] = data[k] | (data[k + 1] << 8); + status = call HplP30.progBuffer(addr + i, buffer, j); + if(status != SUCCESS) + return FAIL; + } + else + for(; i < numBytes; i+=2){ + status = call HplP30.progWord(addr + i, (data[i + 1] << 8) | data[i]); + if(status != SUCCESS) + return FAIL; + } + } + else{ + if(programBufferSupported == 1) + for(; i < numBytes - 1; i = k){ + for(j = 0, k = i; k < numBytes - 1 && + j < FLASH_PROGRAM_BUFFER_SIZE; j++, k+=2) + buffer[j] = data[k] | (data[k + 1] << 8); + status = call HplP30.progBuffer(addr + i, buffer, j); + if(status != SUCCESS) + return FAIL; + } + else + for(; i < numBytes - 1; i+=2){ + status = call HplP30.progWord(addr + i, (data[i + 1] << 8) | data[i]); + if(status != SUCCESS) + return FAIL; + } + status = call HplP30.progWord(addr + i, data[i] | (postbyte << 8)); + if(status != SUCCESS) + return FAIL; + } + return SUCCESS; + } + + void writeExitHelper(uint32_t addr, uint32_t numBytes){ + uint32_t i = 0; + for(i = addr / FLASH_PARTITION_SIZE; + i < (numBytes + addr) / FLASH_PARTITION_SIZE; + i++) + FlashPartitionState[i] = FLASH_STATE_READ_INACTIVE; + } + + command error_t Flash.write(uint32_t addr, uint8_t* data, uint32_t numBytes) { + uint32_t i; + uint16_t status; + uint8_t blocklen; + uint32_t blockAddr = (addr / P30_BLOCK_SIZE) * P30_BLOCK_SIZE; + + if(addr + numBytes > 0x02000000) //not in the flash memory space + return FAIL; + if(addr < FLASH_PROTECTED_REGION) + return FAIL; + + + for(i = 0; i < FLASH_PARTITION_COUNT; i++) + if(i != addr / FLASH_PARTITION_SIZE && + FlashPartitionState[i] != FLASH_STATE_READ_INACTIVE && + FlashPartitionState[i] != FLASH_STATE_READ_ACTIVE) + return FAIL; + + + for(i = addr / FLASH_PARTITION_SIZE; + i < (numBytes + addr) / FLASH_PARTITION_SIZE; + i++) + if(FlashPartitionState[i] != FLASH_STATE_READ_INACTIVE) + return FAIL; + + for(i = addr / FLASH_PARTITION_SIZE; + i < (numBytes + addr) / FLASH_PARTITION_SIZE; + i++) + FlashPartitionState[i] = FLASH_STATE_PROGRAM; + + atomic{ + for(blocklen = 0, i = blockAddr; + i < addr + numBytes; + i += P30_BLOCK_SIZE, blocklen++) + call HplP30.blkUnlock(i); //unlock(i); + + if(programBufferSupported == 2){ + uint16_t testBuf[1]; + + if(addr % 2 == 0){ + testBuf[0] = data[0] | ((*((uint8_t *)(addr + 1))) << 8); + status = call HplP30.progBuffer(addr, testBuf, 1); + } + else{ + testBuf[0] = *((uint8_t *)(addr - 1)) | (data[0] << 8); + status = call HplP30.progBuffer(addr - 1, testBuf, 1); + } + if(status != SUCCESS) + programBufferSupported = 0; + else + programBufferSupported = 1; + } + } + if(blocklen == 1){ + atomic status = writeHelper(addr,data,numBytes,0xFF,0xFF); + if(status == FAIL){ + writeExitHelper(addr, numBytes); + return FAIL; + } + } + else{ + uint32_t bytesLeft = numBytes; + atomic status = writeHelper(addr,data, blockAddr + P30_BLOCK_SIZE - addr,0xFF,0xFF); + if(status == FAIL){ + writeExitHelper(addr, numBytes); + return FAIL; + } + bytesLeft = numBytes - (P30_BLOCK_SIZE - (addr - blockAddr)); + for(i = 1; i < blocklen - 1; i++){ + atomic status = writeHelper(blockAddr + i * P30_BLOCK_SIZE, (uint8_t *)(data + numBytes - bytesLeft), + P30_BLOCK_SIZE,0xFF,0xFF); + bytesLeft -= P30_BLOCK_SIZE; + if(status == FAIL){ + writeExitHelper(addr, numBytes); + return FAIL; + } + } + atomic status = writeHelper(blockAddr + i * P30_BLOCK_SIZE, data + (numBytes - bytesLeft), bytesLeft, 0xFF,0xFF); + if(status == FAIL){ + writeExitHelper(addr, numBytes); + return FAIL; + } + } + + writeExitHelper(addr, numBytes); + return SUCCESS; + } + + command error_t Flash.erase(uint32_t addr){ + uint16_t status, i; + uint32_t j; + + if(addr > 0x02000000) //not in the flash memory space + return FAIL; + if(addr < FLASH_PROTECTED_REGION) + return FAIL; + + addr = (addr / P30_BLOCK_SIZE) * P30_BLOCK_SIZE; + + for(i = 0; i < FLASH_PARTITION_COUNT; i++) + if(i != addr / FLASH_PARTITION_SIZE && + FlashPartitionState[i] != FLASH_STATE_READ_INACTIVE && + FlashPartitionState[i] != FLASH_STATE_READ_ACTIVE) + return FAIL; + + if(FlashPartitionState[addr / FLASH_PARTITION_SIZE] != FLASH_STATE_READ_INACTIVE) + return FAIL; + + FlashPartitionState[addr / FLASH_PARTITION_SIZE] = FLASH_STATE_ERASE; + + for(j = 0; j < P30_BLOCK_SIZE; j++){ + uint32_t tempCheck = *(uint32_t *)(addr + j); + if(tempCheck != 0xFFFFFFFF) + break; + if(j == P30_BLOCK_SIZE - 1){ + FlashPartitionState[addr / FLASH_PARTITION_SIZE] = FLASH_STATE_READ_INACTIVE; + return SUCCESS; + } + } + atomic{ + call HplP30.blkUnlock(addr); + // status = eraseFlash(addr); + status = call HplP30.blkErase(addr); + } + FlashPartitionState[addr / FLASH_PARTITION_SIZE] = FLASH_STATE_READ_INACTIVE; + if(status != SUCCESS) + return FAIL; + + return SUCCESS; + } + + // WARNING: Check the endien of this + command error_t Flash.read(uint32_t addr, uint8_t* buf, uint32_t len) { + error_t status; + + uint8_t databyte; + /* + uint16_t dataword; + + while(len > 1) { + atomic { + status = call HplP30.readWordBurst(addr, &dataword); + } + if(status != SUCCESS) + return FAIL; + + *((uint16_t*) buf) = dataword; + + addr += 2; + buf += 2; + len -= 2; + } + + if(len == 1) { + atomic { + status = call HplP30.readWordBurst(addr, &dataword); + } + if(status != SUCCESS) + return FAIL; + + *buf = (uint8_t) dataword; + } + */ + + while(len > 0) { + atomic { + status = call HplP30.readByteBurst(addr, &databyte); + } + if(status != SUCCESS) + return FAIL; + + *buf = databyte; + + addr += 1; + buf += 1; + len -= 1; + } + + return SUCCESS; + } +} diff --git a/tos/chips/pxa27x/p30/HplP30.nc b/tos/chips/pxa27x/p30/HplP30.nc new file mode 100644 index 00000000..692498a9 --- /dev/null +++ b/tos/chips/pxa27x/p30/HplP30.nc @@ -0,0 +1,45 @@ +/* $Id$ */ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Phil Buonadonna + */ + +interface HplP30 { + + async command error_t progWord(uint32_t addr, uint16_t word); + async command error_t progBuffer(uint32_t addr, uint16_t *data, uint8_t len); + async command error_t blkErase(uint32_t blkaddr); + async command error_t blkLock(uint32_t blkaddr); + async command error_t blkUnlock(uint32_t blkaddr); + + async command error_t readByteBurst(uint32_t addr, uint8_t* bytex); + async command error_t readWordBurst(uint32_t addr, uint16_t* word); +} diff --git a/tos/chips/pxa27x/p30/HplP30P.nc b/tos/chips/pxa27x/p30/HplP30P.nc new file mode 100644 index 00000000..0ab2b68e --- /dev/null +++ b/tos/chips/pxa27x/p30/HplP30P.nc @@ -0,0 +1,179 @@ +/* $Id$ */ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Phil Buonadonna + * + */ +#include +module HplP30P { + provides interface HplP30; +} + +implementation { + + volatile uint16_t * devBaseAddress = (uint16_t *)(0x0); + + async command error_t HplP30.progWord(uint32_t addr, uint16_t word) { + volatile uint16_t *blkAddress = (uint16_t *)addr; + uint32_t result; + + *devBaseAddress = P30_READ_CLRSTATUS; + *blkAddress = P30_WRITE_WORDPRGSETUP; + *blkAddress = word; + + do { + result = *blkAddress; + } while ((result & P30_SR_DWS) == 0); + + *blkAddress = P30_READ_READARRAY; + + if (result & (P30_SR_PS | P30_SR_VPPS | P30_SR_BLS)) { + return FAIL; + } + + return SUCCESS; + + } + + async command error_t HplP30.progBuffer(uint32_t addr, uint16_t *data, uint8_t len) { + volatile uint16_t *blkAddress = (uint16_t *)addr; + uint32_t i,result; + error_t error = SUCCESS; + + if (len <= 0) { + error = EINVAL; + goto done; + } + + *devBaseAddress = P30_READ_CLRSTATUS; + *blkAddress = P30_WRITE_BUFPRG; + + result = *blkAddress; + if ((result & P30_SR_DWS) == 0) { + error = FAIL; + goto cleanup; + } + + *blkAddress = len-1; + + for (i=0;i HalP30C; +} diff --git a/tos/chips/pxa27x/p30/P30BlockP.nc b/tos/chips/pxa27x/p30/P30BlockP.nc new file mode 100644 index 00000000..c75c5cbd --- /dev/null +++ b/tos/chips/pxa27x/p30/P30BlockP.nc @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ +#include +#include + +module P30BlockP { + provides interface BlockRead as Read[ storage_volume_t block ]; + provides interface BlockWrite as Write[ storage_volume_t block ]; + + uses interface Leds; + uses interface Flash; +} + +implementation { + typedef enum { + S_IDLE, + S_READ, + S_WRITE, + S_ERASE, + S_CRC, + S_SYNC, + + } p30_block_state_t; + norace p30_block_state_t m_state = S_IDLE; + storage_volume_t clientId = 0xff; + storage_addr_t clientAddr; + void* clientBuf; + storage_len_t clientLen; + error_t clientResult; + + /* + * This is a helper function to translate from the client address + * space to the underlying HalP30 address space. This is necessary + * because HAL provides a flat 32MB interface. + */ + uint32_t xlateAddr(storage_volume_t b, storage_addr_t addr) { + return P30_VMAP[b].base * FLASH_PARTITION_SIZE + addr; + } + + task void signalDoneTask() { + switch(m_state) { + case S_WRITE: + m_state = S_IDLE; + signal Write.writeDone[clientId](clientAddr, clientBuf, clientLen, clientResult); + break; + case S_SYNC: + m_state = S_IDLE; + signal Write.syncDone[clientId](SUCCESS); + break; + case S_ERASE: + m_state = S_IDLE; + signal Write.eraseDone[clientId](clientResult); + break; + case S_READ: + m_state = S_IDLE; + signal Read.readDone[clientId](clientAddr, clientBuf, clientLen, clientResult); + break; + default: + break; + } + } + + /* + * Translate the address to a physical flash address and do the + * write. + */ + command error_t Write.write[ storage_volume_t b ]( storage_addr_t addr, + void* buf, + storage_len_t len ) { + uint32_t physAddr; + + if(m_state != S_IDLE) + return EBUSY; + + // error check + if(addr + len > P30_VMAP[b].size * FLASH_PARTITION_SIZE) + return EINVAL; + + clientId = b; + clientAddr = addr; + clientBuf = buf; + clientLen = len; + + m_state = S_WRITE; + + physAddr = xlateAddr(b, addr); + + clientResult = call Flash.write(physAddr, (uint8_t*) buf, len); + + post signalDoneTask(); + return SUCCESS; + } + + /* + * Sync doesn't really do anything because Intel PXA is + * write-through. + */ + command error_t Write.sync[ storage_volume_t b ]() { + + m_state = S_SYNC; + clientId = b; + + post signalDoneTask(); + return SUCCESS; + } + + /* + * Because each 2MB partition is divided into 128k erasable pieces, + * we must go through and erase all of them. + */ + command error_t Write.erase[ storage_volume_t b ]() { + uint32_t physAddr; + uint32_t blocks; + + if(m_state != S_IDLE) + return EBUSY; + + clientId = b; + + m_state = S_ERASE; + physAddr = xlateAddr(b,0); + for(blocks = ((P30_VMAP[b].size)*FLASH_PARTITION_SIZE)/P30_BLOCK_SIZE; + blocks > 0; + blocks--) { + clientResult = call Flash.erase(physAddr); + if(clientResult != SUCCESS) + break; + physAddr += P30_BLOCK_SIZE; + } + + post signalDoneTask(); + return SUCCESS; + } + + /* + * Translate the address to a physical flash address and do the + * read. + */ + command error_t Read.read[ storage_volume_t b ]( storage_addr_t addr, + void* buf, + storage_len_t len ) { + uint32_t physAddr; + + if(m_state != S_IDLE) + return FAIL; + + clientId = b; + clientAddr = addr; + clientBuf = buf; + clientLen = len; + + m_state = S_READ; + physAddr = xlateAddr(b,addr); + + call Flash.read((uint32_t) physAddr, (uint8_t*) buf, (uint32_t) len); + + post signalDoneTask(); + return SUCCESS; + } + + + command error_t Read.computeCrc[ storage_volume_t b ]( storage_addr_t addr, + storage_len_t len, + uint16_t crc) { + m_state = S_CRC; + clientId = b; + + post signalDoneTask(); + return SUCCESS; + } + + command storage_len_t Read.getSize[ storage_volume_t b]() { + return P30_VMAP[b].size * FLASH_PARTITION_SIZE; + } + + default event void Write.writeDone[ storage_volume_t b ]( storage_addr_t addr, void* buf, storage_len_t len, error_t error ) {} + default event void Write.eraseDone[ storage_volume_t b ]( error_t error ) {} + default event void Write.syncDone[ storage_volume_t b ]( error_t error ) {} + + default event void Read.readDone[ storage_volume_t b ]( storage_addr_t addr, void* buf, storage_len_t len, error_t error ) {} + default event void Read.computeCrcDone[ storage_volume_t b ]( storage_addr_t addr, storage_len_t len, uint16_t crc, error_t error ) {} + +} diff --git a/tos/chips/pxa27x/p30/P30ConfigC.nc b/tos/chips/pxa27x/p30/P30ConfigC.nc new file mode 100644 index 00000000..ffedef9c --- /dev/null +++ b/tos/chips/pxa27x/p30/P30ConfigC.nc @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ +configuration P30ConfigC { + provides interface ConfigStorage[ storage_volume_t volume ]; + provides interface Mount[ storage_volume_t volume ]; +} + +implementation { + components P30ConfigP, MainC; + ConfigStorage = P30ConfigP.Config; + Mount = P30ConfigP.Mount; + + components HalP30C; + P30ConfigP.Flash -> HalP30C; +} diff --git a/tos/chips/pxa27x/p30/P30ConfigP.nc b/tos/chips/pxa27x/p30/P30ConfigP.nc new file mode 100644 index 00000000..dbd239bc --- /dev/null +++ b/tos/chips/pxa27x/p30/P30ConfigP.nc @@ -0,0 +1,322 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ +#include +#include + +module P30ConfigP { + provides interface ConfigStorage as Config[ storage_volume_t v ]; + provides interface Mount[ storage_volume_t v ]; + + uses interface Flash; + uses interface Leds; +} + +implementation { + /* + * These are some macros for convenience. Essentially it is cutting + * a 2MB chunk into a two pieces. The size of the two pieces is + * hardcoded by C_PARTITION_sIZE. It must be a multiple of + * P30_BLOCK_SIZE because that is the erasable size. The bigger you + * make the C_PARTITION_SIZE, the longer commits will take because + * it must erase all the blocks inside. On the other hand, a larger + * C_PARTITION_SIZE will give you a larger address space. v is the + * parameterized interface that is used in the context of these + * macros. + */ +#define C_PARTITION_SIZE (P30_BLOCK_SIZE*1) +#define C_PARTITION_0 (P30_VMAP[v].base * FLASH_PARTITION_SIZE) +#define C_PARTITION_1 (P30_VMAP[v].base * FLASH_PARTITION_SIZE + C_PARTITION_SIZE) + typedef uint32_t version_t; + + enum { + /* + * WARNING: AT45DB has a RAM buffer that allows writes to occur + * without actually writing to flash. We simulate this because it + * makes rewrites a lot simpler. However, this essentially takes + * RAM overhead. However, Configstores are relatively small and + * the Intel PXA has a lot of main memory, so we do it anyway. + */ + BUFFER_SIZE = 2048, + INVALID_VERSION = 0xFFFFFFFF, + NUM_VOLS = _V_NUMVOLS_, //uniqueCount( "pxa27xp30.Volume" ), + }; + + typedef enum { + S_IDLE, + S_MOUNT, + S_READ, + S_WRITE, + S_COMMIT, + } p30_config_state_t; + norace p30_config_state_t m_state = S_IDLE; + + /* + * Each instantiation of a Configstore must keep certain state. This + * includes the current version of the page and the active address + * within that page since we are splitting it into two pieces. Each + * Configstore must also have its own RAM buffer for concurrent + * operations. + */ + uint32_t currentVersion[NUM_VOLS]; + uint32_t activeBaseAddr[NUM_VOLS]; + uint8_t workBuf[BUFFER_SIZE*NUM_VOLS]; + + storage_volume_t clientId = 0xff; + storage_addr_t clientAddr; + void* clientBuf; + storage_len_t clientLen; + error_t clientResult; + + task void signalDoneTask() { + switch(m_state) { + case S_MOUNT: + m_state = S_IDLE; + signal Mount.mountDone[clientId](clientResult); + break; + case S_WRITE: + m_state = S_IDLE; + signal Config.writeDone[clientId](clientAddr, clientBuf, clientLen, clientResult); + break; + case S_COMMIT: + m_state = S_IDLE; + signal Config.commitDone[clientId](SUCCESS); + break; + case S_READ: + m_state = S_IDLE; + signal Config.readDone[clientId](clientAddr, clientBuf, clientLen, clientResult); + break; + default: + break; + } + } + + /* + * Erase a config partition. It may be more than one P30 block size, + * so erase multiple times. + */ + void eraseConfigPartition(uint32_t base) { + uint32_t blocks; + + for(blocks = C_PARTITION_SIZE / P30_BLOCK_SIZE; + blocks > 0; + blocks--) { + call Flash.erase(base); + base += P30_BLOCK_SIZE; + } + } + + /* + * Read the data directly from the RAM buffer into the client + * buffer... Might be read from Flash depending on semantics + */ + command error_t Config.read[storage_volume_t v](storage_addr_t addr, + void* buf, + storage_len_t len) { + uint32_t i; + + clientId = v; + clientAddr = addr; + clientBuf = buf; + clientLen = len; + + m_state = S_READ; + + /* + for(i = addr; i < addr + len; i++) { + ((uint8_t*)buf)[i-addr] = workBuf[(v*BUFFER_SIZE)+i]; + } + */ + call Flash.read(activeBaseAddr[v] + addr, + (uint8_t*) buf, + len); + + post signalDoneTask(); + + return SUCCESS; + } + + /* + * Writes the client data into the given address in the RAM + * buffer. Data is not actually written to flash until the user + * commits. + */ + command error_t Config.write[storage_volume_t v](storage_addr_t addr, + void* buf, + storage_len_t len) { + uint32_t i; + + clientId = v; + clientAddr = addr; + clientBuf = buf; + clientLen = len; + + // error check + if(addr + len > BUFFER_SIZE) + return FAIL; // out of my artificial bounds + + m_state = S_WRITE; + + for(i = addr; i < addr + len; i++) + workBuf[(v*BUFFER_SIZE)+i] = ((uint8_t*)buf)[i-addr]; + + clientResult = SUCCESS; + post signalDoneTask(); + return SUCCESS; + } + + /* + * Determine which partition to write to based on the current one + * that is active. Also update the version number. Version numbers + * are 0, 1, 2, or 3 and wraps around. Write the RAM buffer out + * first BEFORE writing the the new version number. After the + * version number is written, the active config is now atomically + * switched. Then update any other in memory metadata. + */ + command error_t Config.commit[storage_volume_t v]() { + uint32_t destBaseAddr; + + if(activeBaseAddr[v] == C_PARTITION_0) + destBaseAddr = C_PARTITION_1; + else + destBaseAddr = C_PARTITION_0; + + m_state = S_COMMIT; + + clientId = v; + clientResult = SUCCESS; + + currentVersion[v] = (currentVersion[v] + 1) % 4; + + // erase target flash area before writing to it + eraseConfigPartition(destBaseAddr); + + // write RAM buffer out + call Flash.write(destBaseAddr, + (uint8_t*) &workBuf[v*BUFFER_SIZE], + BUFFER_SIZE); + + call Flash.write(destBaseAddr + C_PARTITION_SIZE - sizeof(version_t), + (uint8_t*) ¤tVersion[v], + sizeof(version_t)); + + activeBaseAddr[v] = destBaseAddr; + + post signalDoneTask(); + return SUCCESS; + } + + /* + * The only metadata that needs to be saved is a version + * number. Thus you get the whole partition minus the version number + * in terms of space. + */ + command storage_len_t Config.getSize[storage_volume_t v]() { + return C_PARTITION_SIZE - sizeof(version_t); + } + + command bool Config.valid[storage_volume_t v]() { + return TRUE; + } + + /* + * When a Configstore is mounted, it must do some initial + * book-keeping work. It first reads from the two pieces two + * determine, which one is the actual active one. Afterwards, we + * read from flash into the RAM buffer or else subsequent reads will + * not work. + */ + command error_t Mount.mount[storage_volume_t v]() { + version_t v0; + version_t v1; + + m_state = S_MOUNT; + clientResult = SUCCESS; + clientId = v; + + currentVersion[v] = INVALID_VERSION; + + // read version #s from both sectors and determine new one + // pick among 0 1 2 3 FFFF + call Flash.read(C_PARTITION_0 + C_PARTITION_SIZE - sizeof(version_t), + (uint8_t*)&v0, sizeof(version_t)); + call Flash.read(C_PARTITION_1 + C_PARTITION_SIZE - sizeof(version_t), + (uint8_t*)&v1, sizeof(version_t)); + + // this logic in this could probably be simplified + if(v0 == INVALID_VERSION && v1 == INVALID_VERSION) { + // clean partition + activeBaseAddr[v] = C_PARTITION_0; + currentVersion[v] = 0; + } + else if(v1 == INVALID_VERSION) { + // use v0 + activeBaseAddr[v] = C_PARTITION_0; + currentVersion[v] = v0; + } + else if(v0 == INVALID_VERSION) { + // use v1 + activeBaseAddr[v] = C_PARTITION_1; + currentVersion[v] = v1; + } + else if((v0 + 1) % 4 == v1) { + // use v1 + activeBaseAddr[v] = C_PARTITION_1; + currentVersion[v] = v1; + } + else if((v1 + 1) % 4 == v0) { + // use v0 + activeBaseAddr[v] = C_PARTITION_0; + currentVersion[v] = v0; + } + else { + // corrupted? erase both, might want to improve this later + eraseConfigPartition(C_PARTITION_0); + eraseConfigPartition(C_PARTITION_1); + currentVersion[v] = 0; + } + + // read into RAM buffer + call Flash.read(activeBaseAddr[v], (uint8_t*)&workBuf[v*BUFFER_SIZE], BUFFER_SIZE); + + post signalDoneTask(); + return SUCCESS; + } + + default event void Config.readDone[storage_volume_t v](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} + default event void Config.writeDone[storage_volume_t v](storage_addr_t addr, void* buf, storage_len_t len, error_t error) {} + default event void Config.commitDone[storage_volume_t v](error_t error) {} + default event void Mount.mountDone[storage_volume_t v](error_t error) {} +} + diff --git a/tos/chips/pxa27x/p30/P30LogC.nc b/tos/chips/pxa27x/p30/P30LogC.nc new file mode 100644 index 00000000..e2d7d616 --- /dev/null +++ b/tos/chips/pxa27x/p30/P30LogC.nc @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ +configuration P30LogC { + + provides interface LogWrite as Write[ storage_volume_t volume ]; + provides interface LogRead as Read[ storage_volume_t volume ]; + + uses interface Get as Circular[ storage_volume_t block ]; +} + +implementation { + components P30LogP; + + P30LogP = Write; + P30LogP = Read; + + P30LogP = Circular; + + components HalP30C; + P30LogP.Flash -> HalP30C; +} diff --git a/tos/chips/pxa27x/p30/P30LogCircularP.nc b/tos/chips/pxa27x/p30/P30LogCircularP.nc new file mode 100644 index 00000000..ac6b1f44 --- /dev/null +++ b/tos/chips/pxa27x/p30/P30LogCircularP.nc @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ +generic module P30LogCircularP( bool IS_CIRCULAR ) { + + provides interface Get as Circular; + +} + +implementation { + + command bool Circular.get() { + return IS_CIRCULAR; + } + +} diff --git a/tos/chips/pxa27x/p30/P30LogP.nc b/tos/chips/pxa27x/p30/P30LogP.nc new file mode 100644 index 00000000..6754fdc1 --- /dev/null +++ b/tos/chips/pxa27x/p30/P30LogP.nc @@ -0,0 +1,584 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ +#include +#include + +module P30LogP { + provides interface LogRead as Read[ storage_volume_t block ]; + provides interface LogWrite as Write[ storage_volume_t block ]; + + uses interface Leds; + uses interface Flash; + uses interface Get as Circular[ storage_volume_t block ]; +} + +implementation { + +#define SEEK_BEGINNING (0x0) +#define SEEK_EOL (0xFFFFFFFF) +#define L_BASE_BLOCK(_x) (P30_VMAP[_x].base * FLASH_PARTITION_SIZE) +#define L_PARTITIONS(_x) ((P30_VMAP[_x].size * FLASH_PARTITION_SIZE) / P30_BLOCK_SIZE) +#define L_FULL_RECORD_SIZE (sizeof(record_data_t) + sizeof(record_meta_t)) +#define L_RECORD_DATA_SIZE 256 +#define L_MAX_RECORDS_PER_BLOCK (P30_BLOCK_SIZE / L_FULL_RECORD_SIZE) // page meta counts as one record + // _a = blockId (from parameterized interface), _b = page, _c = record +#define L_RAW_OFFSET(_a,_b,_c) (L_BASE_BLOCK(_a) + (_b * P30_BLOCK_SIZE) + (_c * L_FULL_RECORD_SIZE)) + + enum { + INVALID_VERSION = 0xFFFFFFFF, + NUM_VOLS = _V_NUMVOLS_, //uniqueCount("pxa27xp30.Volume"), + }; + + enum { + PAGE_START = 0x0000, + PAGE_USED = 0xFFF0, + PAGE_AVAILABLE = 0xFFFF, + }; + typedef struct page_meta_t { + uint16_t header; + } page_meta_t; + + enum { + RECORD_VALID = 0x0000, + RECORD_INVALID = 0xFFF0, + RECORD_EMPTY = 0xFFFF, + }; + typedef struct record_meta_t { + uint16_t status; + uint16_t length; + } record_meta_t; + typedef struct record_data_t { + uint8_t data[L_RECORD_DATA_SIZE]; + } record_data_t; + + typedef enum { + S_IDLE, + S_READ, + S_APPEND, + S_SYNC, + S_ERASE, + S_SEEK, + } p30_log_state_t; + norace p30_log_state_t m_state = S_IDLE; + storage_volume_t clientId = 0xff; + void* clientBuf; + storage_len_t clientLen; + error_t clientResult; + + uint32_t firstBlock[NUM_VOLS]; // 0-15 for 2 MB + uint32_t lastBlock[NUM_VOLS]; // 0-15 for 2 MB + uint32_t nextFreeRecord[NUM_VOLS]; // 0-X depending on data size + storage_cookie_t readCookieOffset[NUM_VOLS]; // this is a raw offset + bool gbOverwriteOccured = FALSE; + + /* This shuffles all the blocks when we run out of space. We have to + * do it in a special order so crash recovery is possible. We also + * have to write special bytes so we can rewrite to areas without + * doing a complete erase. + */ + void shuffleBlocks(storage_volume_t block) { + page_meta_t pageMeta; + uint32_t pageCounter; + // 1. set the last block to USED, if it's already USED or START, then no effect + pageMeta.header = PAGE_USED; + call Flash.write(L_RAW_OFFSET(block, lastBlock[block], 0), + (uint8_t*) &pageMeta, + sizeof(page_meta_t)); + // 2. if lastBlock + 1 is free, then set it as last block and the first record is free + pageCounter = (lastBlock[block] + 1) % L_PARTITIONS(block); + call Flash.read(L_RAW_OFFSET(block, pageCounter, 0), + (uint8_t*) &pageMeta, + sizeof(page_meta_t)); + if(pageMeta.header == PAGE_AVAILABLE) { + nextFreeRecord[block] = 1; + lastBlock[block] = pageCounter; + } + else { + call Flash.erase(L_RAW_OFFSET(block, firstBlock[block], 0)); + pageCounter = (firstBlock[block] + 1) % L_PARTITIONS(block); + pageMeta.header = PAGE_START; + call Flash.write(L_RAW_OFFSET(block, pageCounter, 0), + (uint8_t*) &pageMeta, + sizeof(page_meta_t)); + nextFreeRecord[block] = 1; + lastBlock[block] = firstBlock[block]; + firstBlock[block] = pageCounter; + gbOverwriteOccured = TRUE; + } + } + + /* + * Converts a cookie to a page/record/offset tuple + */ + void cookieToTuple(uint32_t cookie, storage_volume_t block, + uint32_t *page, uint32_t *record, uint32_t *offset) { + + uint32_t mypage; + uint32_t myrecord; + uint32_t myoffset; + + mypage = (cookie - L_BASE_BLOCK(block)) / P30_BLOCK_SIZE; + cookie = (cookie - L_BASE_BLOCK(block)) % P30_BLOCK_SIZE; + myrecord = cookie / L_FULL_RECORD_SIZE; + myoffset = (cookie % L_FULL_RECORD_SIZE) - sizeof(record_meta_t); + + *page = mypage; + *record = myrecord; + *offset = myoffset; + } + + /* + * Ideally, Logstorage would require a mount too, but it doesn't so + * it's a total hack. Before any operation, we have to check if a + * mount occurred. Mount initializes the your logblock. + */ + uint8_t mountBits[NUM_VOLS]; + void myMount(storage_volume_t block) { + page_meta_t pageMeta; + record_meta_t recordMeta; + uint32_t pageCounter; + uint32_t recordCounter; + + uint32_t freePages = 0; + + if(mountBits[block] != 0) + return; + + // scan all 128k pages for page meta + + // annoying corner case of all free pages, write the first page as START + for(pageCounter = 0; pageCounter < L_PARTITIONS(block); pageCounter++) { + call Flash.read(L_RAW_OFFSET(block, pageCounter, 0), + (uint8_t*)&pageMeta, + sizeof(page_meta_t)); + if(pageMeta.header == PAGE_AVAILABLE) + freePages++; + } + if(freePages == L_PARTITIONS(block)) { + pageMeta.header = PAGE_START; + call Flash.write(L_RAW_OFFSET(block, 0, 0), (uint8_t*) &pageMeta, sizeof(page_meta_t)); + } + + // if we find a START page, then we are done + for(pageCounter = 0; pageCounter < L_PARTITIONS(block); pageCounter++) { + call Flash.read(L_RAW_OFFSET(block, pageCounter, 0), + (uint8_t*)&pageMeta, + sizeof(page_meta_t)); + if(pageMeta.header == PAGE_START) { + firstBlock[block] = pageCounter; + break; + } + } + // if we didn't find a START page, first page is right after AVAILABLE + if(pageCounter == L_PARTITIONS(block)) { + for(pageCounter = 0; pageCounter < L_PARTITIONS(block); pageCounter++) { + call Flash.read(L_RAW_OFFSET(block, pageCounter, 0), + (uint8_t*)&pageMeta, + sizeof(page_meta_t)); + if(pageMeta.header == PAGE_AVAILABLE) { + pageCounter = (pageCounter + 1) % L_PARTITIONS(block); + firstBlock[block] = pageCounter; + // mark that block as a START block + pageMeta.header = PAGE_START; + call Flash.write(L_RAW_OFFSET(block, pageCounter, 0), + (uint8_t*) &pageMeta, + sizeof(page_meta_t)); + break; + } + } + } + // now we scan for next free record location + pageCounter = firstBlock[block]; + for(recordCounter = 1; recordCounter < L_MAX_RECORDS_PER_BLOCK; recordCounter++) { + call Flash.read(L_RAW_OFFSET(block, pageCounter, recordCounter), + (uint8_t*) &recordMeta, + sizeof(record_meta_t)); + if(recordMeta.status == RECORD_EMPTY) { + nextFreeRecord[block] = recordCounter; + lastBlock[block] = pageCounter; + break; + } + } + // Didn't find a free record in the START block, search the first FREE block + if(recordCounter == L_MAX_RECORDS_PER_BLOCK) { + for(pageCounter = 0; pageCounter < L_PARTITIONS(block); pageCounter++) { + call Flash.read(L_RAW_OFFSET(block, pageCounter, 0), + (uint8_t*)&pageMeta, + sizeof(page_meta_t)); + if(pageMeta.header == PAGE_AVAILABLE) { + for(recordCounter = 1; recordCounter < L_MAX_RECORDS_PER_BLOCK; recordCounter++) { + call Flash.read(L_RAW_OFFSET(block, pageCounter, recordCounter), + (uint8_t*) &recordMeta, + sizeof(record_meta_t)); + if(recordMeta.status == RECORD_EMPTY) { + lastBlock[block] = pageCounter; + nextFreeRecord[block] = recordCounter; + goto mount_complete; + } + } + } + } + // if here, you didn't find the last block, it must be right before the START block + // special case the wrap around + if(firstBlock[block] == 0) + lastBlock[block] = L_PARTITIONS(block) - 1; + else + lastBlock[block] = firstBlock[block] - 1; + // that last block must be full, so shuffle it + shuffleBlocks(block); + } + + mount_complete: + readCookieOffset[block] = SEEK_BEGINNING; + mountBits[block] = 1; + } + + task void signalDoneTask() { + switch(m_state) { + case S_APPEND: + m_state = S_IDLE; + signal Write.appendDone[clientId](clientBuf, clientLen, gbOverwriteOccured, clientResult); + gbOverwriteOccured = FALSE; + break; + case S_SYNC: + m_state = S_IDLE; + signal Write.syncDone[clientId](SUCCESS); + break; + case S_ERASE: + m_state = S_IDLE; + signal Write.eraseDone[clientId](clientResult); + break; + case S_READ: + m_state = S_IDLE; + signal Read.readDone[clientId](clientBuf, clientLen, clientResult); + break; + case S_SEEK: + m_state = S_IDLE; + signal Read.seekDone[clientId](SUCCESS); + break; + default: + break; + } + } + + /* + * Invariant should be that everytime after an append completes, + * nextFreeRecord should point to a valid free record slot. Uses + * nextFreeRecord to append. + */ + command error_t Write.append[ storage_volume_t block ](void* buf, storage_len_t len) { + record_meta_t recordMeta; + + myMount(block); + + // error check + if(len > L_RECORD_DATA_SIZE) + return EINVAL; + + // if non circular log, fail + if((!call Circular.get[block]()) && + (lastBlock[block] == (L_PARTITIONS(block) - 1)) && + (nextFreeRecord[block] == (L_MAX_RECORDS_PER_BLOCK - 1))) + return FAIL; + + m_state = S_APPEND; + clientId = block; + clientBuf = buf; + clientLen = len; + + // if you try to log 0, just immediately succeed, this really shouldn't happen + if(len == 0) { + clientResult = SUCCESS; + post signalDoneTask(); + return SUCCESS; + } + + // if readCookie was on SEEK_EOL, adjust it back to here + if(readCookieOffset[block] == SEEK_EOL) + readCookieOffset[block] = L_RAW_OFFSET(block, lastBlock[block], nextFreeRecord[block]) + sizeof(record_meta_t); + + // use next free record, write the INVALID, write the data, write the VALID + recordMeta.status = RECORD_INVALID; + recordMeta.length = len; + call Flash.write(L_RAW_OFFSET(block, lastBlock[block], nextFreeRecord[block]), + (uint8_t*) &recordMeta, + sizeof(record_meta_t)); + call Flash.write(L_RAW_OFFSET(block, lastBlock[block], nextFreeRecord[block]) + + sizeof(record_meta_t), + (uint8_t*) buf, len); + recordMeta.status = RECORD_VALID; + call Flash.write(L_RAW_OFFSET(block, lastBlock[block], nextFreeRecord[block]), + (uint8_t*) &recordMeta, + sizeof(record_meta_t)); + nextFreeRecord[block]++; + // see if you need to adjust blocks or shuffle + if(nextFreeRecord[block] == L_MAX_RECORDS_PER_BLOCK) + shuffleBlocks(block); + + clientResult = SUCCESS; + post signalDoneTask(); + + return SUCCESS; + } + + /* + * We use nextFreeRecord to get the cookie + */ + command storage_cookie_t Write.currentOffset[ storage_volume_t block ]() { + myMount(block); + + return L_RAW_OFFSET(block, lastBlock[block], nextFreeRecord[block]) + + sizeof(record_meta_t); + } + + /* + * First we erase all the log data blocks so that they can be + * reused. Then we zero the cookies and then write them to our + * partitions like the append operation. If we crash in the middle, + * you may have to erase again. However, if an erase does fail, at + * least all your data will still be there, so that you can try + * again. + */ + command error_t Write.erase[storage_volume_t block]() { + uint32_t i; + + for(i = 0; i < L_PARTITIONS(block); i++) { + call Flash.erase(L_BASE_BLOCK(block) + (i * P30_BLOCK_SIZE)); + } + + mountBits[block] = 0; + myMount(block); + + // ... starting block implicitly written by mount + + m_state = S_ERASE; + clientId = block; + clientResult = SUCCESS; + post signalDoneTask(); + + return SUCCESS; + } + + /* + * Sync does nothing really because unlike the AT45DB, Intel P30 + * writes directly through. + */ + command error_t Write.sync[storage_volume_t block]() { + myMount(block); + + m_state = S_SYNC; + + clientId = block; + clientResult = SUCCESS; + + post signalDoneTask(); + return SUCCESS; + + } + + /* + * Sanity check the read cookie and adjust for any other special + * cookies. Because you can seek to the byte, must it is saved in + * flash as records, you have to do a lot of tricky seeking, but + * it's done here. Also has to handle any pages that are spilled + * over. + */ + command error_t Read.read[ storage_volume_t block ](void* buf, storage_len_t len) { + record_meta_t recordMeta; + uint32_t recordCounter; + uint32_t pageCounter; + uint32_t offset; + + clientId = block; + clientBuf = buf; + clientResult = SUCCESS; + + myMount(block); + + m_state = S_READ; + + if(len == 0 || readCookieOffset[block] == SEEK_EOL) { + clientResult = SUCCESS; + clientLen = 0; + post signalDoneTask(); + return SUCCESS; + } + + // adjust SEEK_BEGINNING to a real offset + if(readCookieOffset[block] == SEEK_BEGINNING) { + readCookieOffset[block] = L_RAW_OFFSET(block, firstBlock[block], 1) + + sizeof(record_meta_t); + } + + // convert the cookie to something useful + cookieToTuple(readCookieOffset[block], block, &pageCounter, &recordCounter, &offset); + // sanity check readCookie + call Flash.read(L_RAW_OFFSET(block, pageCounter, recordCounter), + (uint8_t*) &recordMeta, + sizeof(record_meta_t)); + if((recordMeta.status == RECORD_VALID) && (offset > len)) { + readCookieOffset[block] = L_RAW_OFFSET(block, firstBlock[block], 0) + sizeof(record_meta_t); + cookieToTuple(readCookieOffset[block], block, &pageCounter, &recordCounter, &offset); + } + + clientLen = 0; // reset how much actually read and count up + + + while(len != 0) { + call Flash.read(L_RAW_OFFSET(block, pageCounter, recordCounter), + (uint8_t*) &recordMeta, + sizeof(record_meta_t)); + if(recordMeta.status == RECORD_INVALID) { + goto advance_counter; + } + if(recordMeta.status == RECORD_EMPTY) { + readCookieOffset[block] = SEEK_EOL; + post signalDoneTask(); + return SUCCESS; + } + // read partial block and finish + if(len < recordMeta.length + offset) { + call Flash.read(L_RAW_OFFSET(block, pageCounter, recordCounter) + + offset + sizeof(record_meta_t), + buf, + len); + offset = len; + buf = buf + len; + len = 0; + } + else { + call Flash.read(L_RAW_OFFSET(block, pageCounter, recordCounter) + + offset + sizeof(record_meta_t), + buf, + recordMeta.length - offset); + clientLen = clientLen + recordMeta.length - offset; + len -= recordMeta.length - offset; + buf = buf + recordMeta.length - offset; + offset = 0; + + advance_counter: + recordCounter++; + if((recordCounter >= L_MAX_RECORDS_PER_BLOCK) && (pageCounter == lastBlock[block])) { + readCookieOffset[block] = SEEK_EOL; + post signalDoneTask(); + return SUCCESS; + } + // need to adjust page possibly if spills + // also need to check if reached end of log (lastBlock[block] or RECORD_AVAILABLE) + if(recordCounter >= L_MAX_RECORDS_PER_BLOCK) { + pageCounter = (pageCounter + 1) % L_PARTITIONS(block); + recordCounter = 1; + } + } + } + + readCookieOffset[block] = L_RAW_OFFSET(block, pageCounter, recordCounter) + + sizeof(record_meta_t) + offset; + post signalDoneTask(); + return SUCCESS; + } + + command storage_cookie_t Read.currentOffset[ storage_volume_t block ]() { + myMount(block); + return readCookieOffset[block]; + } + + /* + * Just set the cookie. If you seek into an invalid area, just set + * it at SEEK_BEGINNING. + */ + command error_t Read.seek[ storage_volume_t block ](storage_cookie_t offset) { + uint32_t page; + uint32_t record; + uint32_t recordOffset; + record_meta_t recordMeta; + myMount(block); + + clientId = block; + clientResult = SUCCESS; + + m_state = S_SEEK; + + readCookieOffset[block] = offset; + + post signalDoneTask(); + + return SUCCESS; + } + + /* + * Go through all the pages, if it's a free page, count whatever is + * available left. Add them all up. + */ + command storage_len_t Read.getSize[ storage_volume_t block ]() { + storage_len_t len = 0; + uint32_t i; + uint32_t j; + page_meta_t pageMeta; + record_meta_t recordMeta; + + myMount(block); + + for(i = 0; i < L_PARTITIONS(block); i++) { + call Flash.read(L_RAW_OFFSET(block, i, j), + (uint8_t*) &pageMeta, + sizeof(page_meta_t)); + if(pageMeta.header != PAGE_AVAILABLE) { + len = len + (sizeof(record_data_t) * L_MAX_RECORDS_PER_BLOCK); + continue; + } + for(j = 1; j < L_MAX_RECORDS_PER_BLOCK; j++) { + call Flash.read(L_RAW_OFFSET(block, i, j), + (uint8_t*) &recordMeta, + sizeof(record_meta_t)); + if(recordMeta.status == RECORD_EMPTY) { + len = len + ((L_MAX_RECORDS_PER_BLOCK - j) * sizeof(record_meta_t)); + break; + } + } + } + + return len; + } + + default event void Read.readDone[ storage_volume_t block ](void* buf, storage_len_t len, error_t error) {} + default event void Read.seekDone[ storage_volume_t block ](error_t error) {} + default event void Write.appendDone[ storage_volume_t block ](void* buf, storage_len_t len, bool recordsLost, error_t error) {} + + default event void Write.eraseDone[ storage_volume_t block ](error_t error) {} + default event void Write.syncDone[ storage_volume_t block ](error_t error) {} + + default command bool Circular.get[ uint8_t id ]() { return FALSE; } +} diff --git a/tos/chips/pxa27x/p30/Storage_chip.h b/tos/chips/pxa27x/p30/Storage_chip.h new file mode 100644 index 00000000..da59ca43 --- /dev/null +++ b/tos/chips/pxa27x/p30/Storage_chip.h @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + * + * @author Phil Buonadonna + * @version $Revision$ $Date$ + */ + +#ifndef __STORAGE_CHIP_H__ +#define __STORAGE_CHIP_H__ + +typedef uint8_t storage_volume_t; +typedef uint8_t storage_block_t; +typedef uint8_t storage_log_t; +typedef uint8_t storage_config_t; + +#endif diff --git a/tos/chips/pxa27x/ssp/HalPXA27xPSPDMAC.nc b/tos/chips/pxa27x/ssp/HalPXA27xPSPDMAC.nc new file mode 100644 index 00000000..e57af300 --- /dev/null +++ b/tos/chips/pxa27x/ssp/HalPXA27xPSPDMAC.nc @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +generic configuration HalPXA27xSpiDMAC(uint8_t valSCR, + uint8_t valDSS, + bool enableRWOT) +{ + provides interface Init; + provides interface SpiByte; + provides interface SpiPacket[uint8_t instance]; + provides interface HalPXA27xSSPCntl; + + uses { + interface HplPXA27xSSP as SSP; + interface HplPXA27xDMAChnl as RxDMA; + interface HplPXA27xDMAChnl as TxDMA; + interface HplPXA27xDMAInfo as SSPRxDMAInfo; + interface HplPXA27xDMAInfo as SSPTxDMAInfo; + } +} + +implementation { + components new HalPXA27xSpiDMAM(3, valSCR, valDSS, enableRWOT); + components HalPXA27xSSPControlP; + + Init = HalPXA27xSpiSSPM; + SpiByte = HalPXA27xSpiSSPM; + SpiPacket = HalPXA27xSpiSSPM; + HalPXA27xSSPCntl = HalPXA27xSSPControlP; + + SSP = HalPXA27xSpiSSPM; + SSP = HalPXA27xSSPControlP; + RxDMA = HalPXA27xSpiDMAM; + TxDMA = HalPXA27xSpiDMAM; + SSPRxDMAInfo = HalPXA27xSpiDMAM; + SSPTxDMAInfo = HalPXA27xSpiDMAM; + +} diff --git a/tos/chips/pxa27x/ssp/HalPXA27xPSPPioC.nc b/tos/chips/pxa27x/ssp/HalPXA27xPSPPioC.nc new file mode 100644 index 00000000..d8d68184 --- /dev/null +++ b/tos/chips/pxa27x/ssp/HalPXA27xPSPPioC.nc @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +generic configuration HalPXA27xSpiPioC(uint8_t valSCR, + uint8_t valDSS, + bool enableRWOT) +{ + provides interface Init; + provides interface SpiByte; + provides interface SpiPacket[uint8_t instance]; + provides interface HalPXA27xSSPCntl; + + uses interface HplPXA27xSSP as SSP; +} + +implementation { + components new HalPXA27xSpiPioM(3, valSCR, valDSS, enableRWOT); + components HalPXA27xSSPControlP; + + Init = HalPXA27xSpiPioM; + SpiByte = HalPXA27xSpiPioM; + SpiPacket = HalPXA27xSpiPioM; + HalPXA27xSSPCntl = HalPXA27xSSPControlP; + + SSP = HalPXA27xSpiPioM; + SSP = HalPXA27xSSPControlP; +} diff --git a/tos/chips/pxa27x/ssp/HalPXA27xSSPDMAC.nc b/tos/chips/pxa27x/ssp/HalPXA27xSSPDMAC.nc new file mode 100644 index 00000000..096f47cc --- /dev/null +++ b/tos/chips/pxa27x/ssp/HalPXA27xSSPDMAC.nc @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +generic configuration HalPXA27xSpiDMAC(uint8_t valSCR, + uint8_t valDSS, + bool enableRWOT) +{ + provides interface Init; + provides interface SpiByte; + provides interface SpiPacket[uint8_t instance]; + provides interface HalPXA27xSSPCntl; + + uses { + interface HplPXA27xSSP as SSP; + interface HplPXA27xDMAChnl as RxDMA; + interface HplPXA27xDMAChnl as TxDMA; + interface HplPXA27xDMAInfo as SSPRxDMAInfo; + interface HplPXA27xDMAInfo as SSPTxDMAInfo; + } +} + +implementation { + components new HalPXA27xSpiDMAM(1, valSCR, valDSS, enableRWOT); + components HalPXA27xSSPControlP; + + Init = HalPXA27xSpiDMAM; + SpiByte = HalPXA27xSpiDMAM; + SpiPacket = HalPXA27xSpiDMAM; + HalPXA27xSSPCntl = HalPXA27xSSPControlP; + + SSP = HalPXA27xSpiDMAM; + SSP = HalPXA27xSSPControlP; + RxDMA = HalPXA27xSpiDMAM; + TxDMA = HalPXA27xSpiDMAM; + SSPRxDMAInfo = HalPXA27xSpiDMAM; + SSPTxDMAInfo = HalPXA27xSpiDMAM; + +} diff --git a/tos/chips/pxa27x/ssp/HalPXA27xSSPPioC.nc b/tos/chips/pxa27x/ssp/HalPXA27xSSPPioC.nc new file mode 100644 index 00000000..0a54cf03 --- /dev/null +++ b/tos/chips/pxa27x/ssp/HalPXA27xSSPPioC.nc @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +generic configuration HalPXA27xSpiPioC(uint8_t valSCR, + uint8_t valDSS, + bool enableRWOT) +{ + provides interface Init; + provides interface SpiByte; + provides interface SpiPacket[uint8_t instance]; + provides interface HalPXA27xSSPCntl; + + uses interface HplPXA27xSSP as SSP; +} + +implementation { + components new HalPXA27xSpiPioM(1, valSCR, valDSS, enableRWOT); + components HalPXA27xSSPControlP; + + Init = HalPXA27xSpiPioM; + SpiByte = HalPXA27xSpiPioM; + SpiPacket = HalPXA27xSpiPioM; + HalPXA27xSSPCntl = HalPXA27xSSPControlP; + + SSP = HalPXA27xSpiPioM; + SSP = HalPXA27xSSPControlP; +} diff --git a/tos/chips/pxa27x/ssp/HalPXA27xSpiDMAC.nc b/tos/chips/pxa27x/ssp/HalPXA27xSpiDMAC.nc new file mode 100644 index 00000000..02fc9955 --- /dev/null +++ b/tos/chips/pxa27x/ssp/HalPXA27xSpiDMAC.nc @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +generic configuration HalPXA27xSpiDMAC(uint8_t valSCR, + uint8_t valDSS, + bool enableRWOT) +{ + provides interface Init; + provides interface SpiByte; + provides interface SpiPacket[uint8_t instance]; + provides interface HalPXA27xSSPCntl; + + uses { + interface HplPXA27xSSP as SSP; + interface HplPXA27xDMAChnl as RxDMA; + interface HplPXA27xDMAChnl as TxDMA; + interface HplPXA27xDMAInfo as SSPRxDMAInfo; + interface HplPXA27xDMAInfo as SSPTxDMAInfo; + } +} + +implementation { + components new HalPXA27xSpiDMAM(0, valSCR, valDSS, enableRWOT); + components HalPXA27xSSPControlP; + + Init = HalPXA27xSpiDMAM; + SpiByte = HalPXA27xSpiDMAM; + SpiPacket = HalPXA27xSpiDMAM; + HalPXA27xSSPCntl = HalPXA27xSSPControlP; + + SSP = HalPXA27xSpiDMAM; + SSP = HalPXA27xSSPControlP; + RxDMA = HalPXA27xSpiDMAM.RxDMA; + TxDMA = HalPXA27xSpiDMAM.TxDMA; + SSPRxDMAInfo = HalPXA27xSpiDMAM.SSPRxDMAInfo; + SSPTxDMAInfo = HalPXA27xSpiDMAM.SSPTxDMAInfo; + +} diff --git a/tos/chips/pxa27x/ssp/HalPXA27xuWireDMAC.nc b/tos/chips/pxa27x/ssp/HalPXA27xuWireDMAC.nc new file mode 100644 index 00000000..7789744b --- /dev/null +++ b/tos/chips/pxa27x/ssp/HalPXA27xuWireDMAC.nc @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +generic configuration HalPXA27xSpiDMAC(uint8_t valSCR, + uint8_t valDSS, + bool enableRWOT) +{ + provides interface Init; + provides interface SpiByte; + provides interface SpiPacket[uint8_t instance]; + provides interface HalPXA27xSSPCntl; + + uses { + interface HplPXA27xSSP as SSP; + interface HplPXA27xDMAChnl as RxDMA; + interface HplPXA27xDMAChnl as TxDMA; + interface HplPXA27xDMAInfo as SSPRxDMAInfo; + interface HplPXA27xDMAInfo as SSPTxDMAInfo; + } +} + +implementation { + components new HalPXA27xSpiDMAM(2, valSCR, valDSS, enableRWOT); + components HalPXA27xSSPControlP; + + Init = HalPXA27xSpiDMAM; + SpiByte = HalPXA27xSpiDMAM; + SpiPacket = HalPXA27xSpiDMAM; + HalPXA27xSSPCntl = HalPXA27xSSPControlP; + + SSP = HalPXA27xSpiDMAM; + SSP = HalPXA27xSSPControlP; + RxDMA = HalPXA27xSpiDMAM; + TxDMA = HalPXA27xSpiDMAM; + SSPRxDMAInfo = HalPXA27xSpiDMAM; + SSPTxDMAInfo = HalPXA27xSpiDMAM; + +} diff --git a/tos/chips/pxa27x/ssp/HalPXA27xuWirePioC.nc b/tos/chips/pxa27x/ssp/HalPXA27xuWirePioC.nc new file mode 100644 index 00000000..ba4947e9 --- /dev/null +++ b/tos/chips/pxa27x/ssp/HalPXA27xuWirePioC.nc @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +generic configuration HalPXA27xSpiPioC(uint8_t valSCR, + uint8_t valDSS, + bool enableRWOT) +{ + provides interface Init; + provides interface SpiByte; + provides interface SpiPacket[uint8_t instance]; + provides interface HalPXA27xSSPCntl; + + uses interface HplPXA27xSSP as SSP; +} + +implementation { + components new HalPXA27xSpiPioM(2, valSCR, valDSS, enableRWOT); + components HalPXA27xSSPControlP; + + Init = HalPXA27xSpiPioM; + SpiByte = HalPXA27xSpiPioM; + SpiPacket = HalPXA27xSpiPioM; + HalPXA27xSSPCntl = HalPXA27xSSPControlP; + + SSP = HalPXA27xSpiPioM; + SSP = HalPXA27xSSPControlP; +} diff --git a/tos/chips/pxa27x/timer/HalPXA27xSleep.nc b/tos/chips/pxa27x/timer/HalPXA27xSleep.nc new file mode 100644 index 00000000..614b1271 --- /dev/null +++ b/tos/chips/pxa27x/timer/HalPXA27xSleep.nc @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * This interfaces provides HAL level sleep functionality for the PXA27x. + * + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ + +interface HalPXA27xSleep { + /** + * Sleep for a given number of milliseconds. This function supports + * sleep times up to 65534ms. Larger sleep durations must + * use one of the other methods. + * + * @param time Sleep duration in milliseconds up to 65534. + * + */ + async command void sleepMillis(uint16_t time); + + /** + * Sleep for a given number of seconds up to 62859 sec. + * If the function is passed a value greater than 62859, it + * will default to the maximum. + * + * @param time Sleep duration in seconds. + * + */ + async command void sleepSeconds(uint32_t time); + + /** + * Sleep for a given number of minutes up to 1439 min. + * If the function is passed a value greater than 1439, it + * will default to the maximum. + * + * @param time Sleep duration in minutes. + */ + async command void sleepMinutes(uint32_t time); + + /** + * Sleep for a given number of hours up to 23 hours + * If the function is passed a value greater than 23, it + * will default to the maximum. + * + * @param time Sleep duration in hours + */ + async command void sleepHours(uint16_t time); +} diff --git a/tos/chips/pxa27x/timer/HalPXA27xSleepC.nc b/tos/chips/pxa27x/timer/HalPXA27xSleepC.nc new file mode 100644 index 00000000..a2206566 --- /dev/null +++ b/tos/chips/pxa27x/timer/HalPXA27xSleepC.nc @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ + +configuration HalPXA27xSleepC { + provides interface HalPXA27xSleep; +} + +implementation { + components HalPXA27xSleepM; + + HalPXA27xSleep = HalPXA27xSleepM; + + components HplPXA27xRTCM, HplPXA27xPowerM; + HalPXA27xSleepM.HplPXA27xRTC -> HplPXA27xRTCM; + HalPXA27xSleepM.HplPXA27xPower -> HplPXA27xPowerM; + + components LedsC; + HalPXA27xSleepM.Leds -> LedsC; +} diff --git a/tos/chips/pxa27x/timer/HalPXA27xSleepM.nc b/tos/chips/pxa27x/timer/HalPXA27xSleepM.nc new file mode 100644 index 00000000..f65e8d79 --- /dev/null +++ b/tos/chips/pxa27x/timer/HalPXA27xSleepM.nc @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ + +module HalPXA27xSleepM { + provides interface HalPXA27xSleep; + uses interface HplPXA27xRTC; + uses interface HplPXA27xPower; + + uses interface Leds; +} + +implementation { + + void doSleep(uint32_t swRegVal) { + int i; + call HplPXA27xPower.setPWER(PWER_WERTC); + // let it wrap around itself if necessary + call HplPXA27xRTC.setSWCR(0); + call HplPXA27xRTC.setSWAR1(swRegVal); // minutes + call HplPXA27xRTC.setSWAR2(0x00FFFFFF); + for(i = 0; i < 10; i++); // spin for a bit + call HplPXA27xRTC.setRTSR(RTSR_SWCE); + for(i = 0; i < 5000; i++); // spin for a bit + + call HplPXA27xPower.setPWRMode(PWRMODE_M_SLEEP); + // this call never returns + } + + + async command void HalPXA27xSleep.sleepMillis(uint16_t time) { + int i; + call HplPXA27xPower.setPWER(PWER_WERTC); + // let it wrap around itself if necessary + call HplPXA27xRTC.setPIAR(time); // implicitly resets RTCPICR + for(i = 0; i < 10; i++); // spin for a bit + call HplPXA27xRTC.setRTSR(RTSR_PICE); + for(i = 0; i < 5000; i++); // spin for a bit + + call HplPXA27xPower.setPWRMode(PWRMODE_M_SLEEP); + // this call never returns + } + + async command void HalPXA27xSleep.sleepSeconds(uint32_t time) { + uint32_t hrs = time / 3600; + uint32_t mins = (time / 60) % 60; + uint32_t secs = time % 60; + uint32_t swReg; + + if (hrs > 23) { + hrs = 23; + mins = 59; + secs = 59; + } + + swReg = ((hrs << 19) | (mins << 13) | (secs << 7)); + doSleep(swReg); + return; + } + + async command void HalPXA27xSleep.sleepMinutes(uint32_t time) { + uint32_t hrs = time / 60; + uint32_t mins = time % 60; + uint32_t swReg; + + if (hrs > 23) { + hrs = 23; + mins = 59; + } + swReg = ((hrs << 19) | (mins << 13)); + + doSleep(swReg); + return; + } + + async command void HalPXA27xSleep.sleepHours(uint16_t time) { + uint32_t hrs = time; + uint32_t swReg; + + if (hrs > 23) { + hrs = 23; + } + swReg = (hrs << 19); + + doSleep(swReg); + return; + } +} diff --git a/tos/chips/pxa27x/timer/HalPXA27xWatchdog.nc b/tos/chips/pxa27x/timer/HalPXA27xWatchdog.nc new file mode 100644 index 00000000..c642bff6 --- /dev/null +++ b/tos/chips/pxa27x/timer/HalPXA27xWatchdog.nc @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +interface HalPXA27xWatchdog { + + /** + * Enable the watchdog resource with the given timeout interval. + * This function may be called multiple times to reset the timeout + * interval. However, the watchdog function itself is sticky and + * will remain enabled until system reset. + * + * @param interval The timeout interval in untis of 3.25MHZ clock cycle + * ticks. + * + */ + async command void enable(uint32_t interval); + + /** + * Tickle/reset the watchdog counter. This function must be + * called on a regular basis to prevent the watchdog from resetting the + * system. + * + */ + async command void tickle(); +} diff --git a/tos/chips/pxa27x/timer/HalPXA27xWatchdogC.nc b/tos/chips/pxa27x/timer/HalPXA27xWatchdogC.nc new file mode 100644 index 00000000..dca08518 --- /dev/null +++ b/tos/chips/pxa27x/timer/HalPXA27xWatchdogC.nc @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +module HalPXA27xWatchdogC { + provides interface HalPXA27xWatchdog; +} + +implementation { + components HplPXA27xOSTimerC; + components HalPXA27xWatchdogM; + + HalPXA27xWatchdog = HalPXA27xWatchdogM; + + HalPXA27xWatchdogM.HplPXA27xOSTimerWatchdog -> HplPXA27xOSTimerC.OSTWDCntl; + HalPXA27xWatchdogM.HplPXA27xOSTimer -> HplPXA27xOSTimerC.OST0M3; + +} diff --git a/tos/chips/pxa27x/timer/HalPXA27xWatchdogM.nc b/tos/chips/pxa27x/timer/HalPXA27xWatchdogM.nc new file mode 100644 index 00000000..ec5fa623 --- /dev/null +++ b/tos/chips/pxa27x/timer/HalPXA27xWatchdogM.nc @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * + * @author Kaisen Lin + * @author Phil Buonadonna + */ + +module HalPXA27xWatchdogM { + provides interface HalPXA27xWatchdog; + uses interface HplPXA27xOSTimerWatchdog; + uses interface HplPXA27xOSTimer; +} + +implementation { + uint32_t gResetInterval; + + async command void HalPXA27xWatchdog.enable(uint32_t interval) { + uint32_t curMatch; + atomic { + gResetInterval = interval; + curMatch = call HplPXA27xOSTimer.getOSCR(); + curMatch = (curMatch + gResetInterval) % 0xFFFFFFFF; + call HplPXA27xOSTimer.setOSMR(curMatch); + call HplPXA27xOSTimerWatchdog.enableWatchdog(); + } + } + + async command void HalPXA27xWatchdog.tickle() { + uint32_t curMatch; + atomic { + curMatch = call HplPXA27xOSTimer.getOSCR(); + curMatch = (curMatch + gResetInterval) % 0xFFFFFFFF; + call HplPXA27xOSTimer.setOSMR(curMatch); + } + } + + // This won't ever get called. Rather, the system will reset. + async event void HplPXA27xOSTimer.fired() {} + +} diff --git a/tos/chips/pxa27x/timer/HplPXA27xPower.nc b/tos/chips/pxa27x/timer/HplPXA27xPower.nc new file mode 100644 index 00000000..3bb5b157 --- /dev/null +++ b/tos/chips/pxa27x/timer/HplPXA27xPower.nc @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ + +/* + * Code to access some power management registers + */ + +interface HplPXA27xPower { + async command void setPWER(uint32_t val); + async command void setPWRMode(uint8_t val); +} diff --git a/tos/chips/pxa27x/timer/HplPXA27xPowerM.nc b/tos/chips/pxa27x/timer/HplPXA27xPowerM.nc new file mode 100644 index 00000000..daa217cd --- /dev/null +++ b/tos/chips/pxa27x/timer/HplPXA27xPowerM.nc @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ + +module HplPXA27xPowerM { + provides interface HplPXA27xPower; +} + +implementation { + async command void HplPXA27xPower.setPWER(uint32_t val) { + PWER = val; + } + + async command void HplPXA27xPower.setPWRMode(uint8_t val) { + val = val & 0xF; + asm volatile ( + "mcr p14,0,%0,c7,c0,0" + : + : "r" (val) + ); + __nesc_enable_interrupt(); + __nesc_disable_interrupt(); + } +} diff --git a/tos/chips/pxa27x/timer/HplPXA27xRTC.nc b/tos/chips/pxa27x/timer/HplPXA27xRTC.nc new file mode 100644 index 00000000..14daeea0 --- /dev/null +++ b/tos/chips/pxa27x/timer/HplPXA27xRTC.nc @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ + +/* + * Code to access some RTC registers + */ + +interface HplPXA27xRTC { + async command void setRTCPICR(uint16_t val); + async command uint16_t getRTCPICR(); + async command void setPIAR(uint16_t val); + async command uint16_t getPIAR(); + async command void setRTSR(uint16_t val); + async command void setSWAR1(uint32_t val); + async command void setSWAR2(uint32_t val); + async command void setSWCR(uint32_t val); +} diff --git a/tos/chips/pxa27x/timer/HplPXA27xRTCM.nc b/tos/chips/pxa27x/timer/HplPXA27xRTCM.nc new file mode 100644 index 00000000..8e873e75 --- /dev/null +++ b/tos/chips/pxa27x/timer/HplPXA27xRTCM.nc @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ + +module HplPXA27xRTCM { + provides interface HplPXA27xRTC; +} + +implementation { + async command void HplPXA27xRTC.setRTCPICR(uint16_t val) { RTCPICR = val; } + async command uint16_t HplPXA27xRTC.getRTCPICR() { return RTCPICR; } + async command void HplPXA27xRTC.setPIAR(uint16_t val) { PIAR = val; } + async command uint16_t HplPXA27xRTC.getPIAR() { return PIAR; } + async command void HplPXA27xRTC.setRTSR(uint16_t val) { RTSR = val; } + async command void HplPXA27xRTC.setSWAR1(uint32_t val) { SWAR1 = val; } + async command void HplPXA27xRTC.setSWAR2(uint32_t val) { SWAR2 = val; } + async command void HplPXA27xRTC.setSWCR(uint32_t val) { SWCR = val; } +} diff --git a/tos/chips/pxa27x/uart/HalPXA27xSerialCntl.nc b/tos/chips/pxa27x/uart/HalPXA27xSerialCntl.nc new file mode 100644 index 00000000..9ba18fa3 --- /dev/null +++ b/tos/chips/pxa27x/uart/HalPXA27xSerialCntl.nc @@ -0,0 +1,65 @@ +/* $Id$ */ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +/** + * @author Phil Buonadonna + */ + +#include "pxa27x_serial.h" + +interface HalPXA27xSerialCntl +{ + /** + * Modify runtime port parameters + * + * @param baudrate The integer value of baudrate + * @param databits The Number of data bits + * @param partiy Values of EVEN,ODD or NONE + * @param stopbits Values of 1 or 2 + * @param flow_cntl TRUE to enable hardware flow control + * + * @return SUCCESS if parameters successfully applied. FAIL otherwise + */ + async command error_t configPort(uint32_t baudrate, + uint8_t databits, + uart_parity_t parity, + uint8_t stopbits, + bool flow_cntl); + + /** + * Flush the port FIFOs + * + * @return SUCCESS if flushed, FAIL otherwise. + */ + async command error_t flushPort(); + +} + diff --git a/tos/chips/pxa27x/uart/HalPXA27xSerialPacket.nc b/tos/chips/pxa27x/uart/HalPXA27xSerialPacket.nc new file mode 100644 index 00000000..3ea98740 --- /dev/null +++ b/tos/chips/pxa27x/uart/HalPXA27xSerialPacket.nc @@ -0,0 +1,92 @@ +/* $Id$ */ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +/** + * @author Phil Buonadonna + */ + +#include "pxa27x_serial.h" + +interface HalPXA27xSerialPacket +{ + /** + * Begin transmission of a UART stream. If SUCCESS is returned, + * sendDone will be signalled when transmission is + * complete. + * + * @param buf Buffer for bytes to send. + * @param len Number of bytes to send. + * @return SUCCESS if request was accepted, FAIL otherwise. + */ + async command error_t send(uint8_t *buf, uint16_t len); + + /** + * Signal completion of sending a stream. + * + * @param buf Bytes sent. + * @param len Number of bytes sent. + * @param status UART error status. + * + * @return buf A pointer to a new buffer of equal length + * as in the original send call that is to be transmitted (chained + * send). Set to NULL to end further transmissions. + */ + async event uint8_t *sendDone(uint8_t *buf, uint16_t len, uart_status_t status); + + /** + * Begin reception of a UART stream. If SUCCESS is returned, + * receiveDone will be signalled when reception is + * complete. + * + * @param buf Buffer for received bytes. + * @param len Number of bytes to receive. + * @param timeout Timeout, in milliseconds, for receive operation + * + * @return SUCCESS if request was accepted, FAIL otherwise. + */ + async command error_t receive(uint8_t *buf, uint16_t len, uint16_t timeout); + + /** + * Signal completion of receiving a stream. + * + * @param buf Buffer for bytes received. + * @param len Number of bytes received. + * @param status UART error status + * + * @return buf A pointer to a new buffer of equal or greater length + * as in the original receive call in which it intiate a + * new packet reception (chained receive). Set to NULL to terminate further + * reception. + */ + async event uint8_t *receiveDone(uint8_t *buf, uint16_t len, uart_status_t status); + +} + diff --git a/tos/chips/pxa27x/uart/HplPXA27xBTUARTC.nc b/tos/chips/pxa27x/uart/HplPXA27xBTUARTC.nc new file mode 100644 index 00000000..5f1d0d49 --- /dev/null +++ b/tos/chips/pxa27x/uart/HplPXA27xBTUARTC.nc @@ -0,0 +1,52 @@ +/* $Id$ */ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * @author Phil Buonadonna + */ + +configuration HplPXA27xBTUARTC +{ + provides interface Init; + provides interface HplPXA27xUART as BTUART; +} + +implementation +{ + components new HplPXA27xUARTP((uint32_t)&BTRBR); + components HplPXA27xInterruptM; + + Init = HplPXA27xUARTP; + BTUART = HplPXA27xUARTP.UART; + + HplPXA27xUARTP.UARTIrq -> HplPXA27xInterruptM.PXA27xIrq[PPID_BTUART]; + +} diff --git a/tos/chips/pxa27x/uart/HplPXA27xFFUARTC.nc b/tos/chips/pxa27x/uart/HplPXA27xFFUARTC.nc new file mode 100644 index 00000000..f55947c2 --- /dev/null +++ b/tos/chips/pxa27x/uart/HplPXA27xFFUARTC.nc @@ -0,0 +1,52 @@ +/* $Id$ */ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * + * @author Phil Buonadonna + */ + +configuration HplPXA27xFFUARTC +{ + provides interface Init; + provides interface HplPXA27xUART as FFUART; +} + +implementation +{ + components new HplPXA27xUARTP((uint32_t)&FFRBR); + components HplPXA27xInterruptM; + + Init = HplPXA27xUARTP; + FFUART = HplPXA27xUARTP.UART; + + HplPXA27xUARTP.UARTIrq -> HplPXA27xInterruptM.PXA27xIrq[PPID_FFUART]; + +} diff --git a/tos/chips/pxa27x/uart/HplPXA27xUARTP.nc b/tos/chips/pxa27x/uart/HplPXA27xUARTP.nc new file mode 100644 index 00000000..0ecd79d8 --- /dev/null +++ b/tos/chips/pxa27x/uart/HplPXA27xUARTP.nc @@ -0,0 +1,143 @@ +/* $Id$ */ +/* + * Copyright (c) 2005 Arched Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arched Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * Provides low-level initialization, 1st level interrupt dispatch and register + * access for the different uarts. It is a generic that's bound to + * the particular UART upon creation. + * + * @param baseaddr. The base address of the associated uart. One of + * &FFRBR, &BTRBR or &STRBR. + * This component automatically handles setting of the DLAB bit for + * divisor register access (DLL and DLH) + * + * @author Phil Buonadonna + */ + +#include "PXA27X_UARTREG.h" + +generic module HplPXA27xUARTP(uint32_t base_addr) +{ + provides interface Init; + provides interface HplPXA27xUART as UART; + uses interface HplPXA27xInterrupt as UARTIrq; +} + +implementation +{ + bool m_fInit = FALSE; + + command error_t Init.init() { + bool isInited; + + atomic { + isInited = m_fInit; + m_fInit = TRUE; + } + + if (!isInited) { + switch (base_addr) { + case (0x40100000): + CKEN |= CKEN6_FFUART; + break; + case (0x40200000): + CKEN |= CKEN7_BTUART; + break; + case (0x40700000): + CKEN |= CKEN5_STUART; + break; + default: + break; + } + call UARTIrq.allocate(); + call UARTIrq.enable(); + UARTLCR(base_addr) |= LCR_DLAB; + UARTDLL(base_addr) = 0x04; + UARTDLH(base_addr) = 0x00; + UARTLCR(base_addr) &= ~LCR_DLAB; + } + + return SUCCESS; + } + + async command uint32_t UART.getRBR() { return UARTRBR(base_addr); } + async command void UART.setTHR(uint32_t val) { UARTTHR(base_addr) = val; } + async command void UART.setDLL(uint32_t val) { + UARTLCR(base_addr) |= LCR_DLAB; + UARTDLL(base_addr) = val; + UARTLCR(base_addr) &= ~LCR_DLAB; + } + async command uint32_t UART.getDLL() { + uint32_t val; + UARTLCR(base_addr) |= LCR_DLAB; + val = UARTDLL(base_addr); + UARTLCR(base_addr) &= ~LCR_DLAB; + return val; + } + async command void UART.setDLH(uint32_t val) { + UARTLCR(base_addr) |= LCR_DLAB; + UARTDLH(base_addr) = val; + UARTLCR(base_addr) &= ~LCR_DLAB; + } + async command uint32_t UART.getDLH() { + uint32_t val; + UARTLCR(base_addr) |= LCR_DLAB; + val = UARTDLH(base_addr); + UARTLCR(base_addr) &= ~LCR_DLAB; + return val; + } + async command void UART.setIER(uint32_t val) { UARTIER(base_addr) = val; } + async command uint32_t UART.getIER() { return UARTIER(base_addr); } + async command uint32_t UART.getIIR() { return UARTIIR(base_addr); } + async command void UART.setFCR(uint32_t val) { UARTFCR(base_addr) = val; } + async command void UART.setLCR(uint32_t val) { UARTLCR(base_addr) = val; } + async command uint32_t UART.getLCR() { return UARTLCR(base_addr); } + async command void UART.setMCR(uint32_t val) { UARTMCR(base_addr) = val; } + async command uint32_t UART.getMCR() { return UARTMCR(base_addr); } + async command uint32_t UART.getLSR() { return UARTLSR(base_addr); } + async command uint32_t UART.getMSR() { return UARTMSR(base_addr); } + async command void UART.setSPR(uint32_t val) { UARTSPR(base_addr) = val; } + async command uint32_t UART.getSPR() { return UARTSPR(base_addr); } + async command void UART.setISR(uint32_t val) { UARTISR(base_addr) = val; } + async command uint32_t UART.getISR() { return UARTISR(base_addr); } + async command void UART.setFOR(uint32_t val) { UARTFOR(base_addr) = val; } + async command uint32_t UART.getFOR() { return UARTFOR(base_addr); } + async command void UART.setABR(uint32_t val) { UARTABR(base_addr) = val; } + async command uint32_t UART.getABR() { return UARTABR(base_addr); } + async command uint32_t UART.getACR() { return UARTACR(base_addr); } + + async event void UARTIrq.fired () { + + signal UART.interruptUART(); + } + + default async event void UART.interruptUART() { return; } + +} diff --git a/tos/chips/pxa27x/uart/PXA27X_UARTREG.h b/tos/chips/pxa27x/uart/PXA27X_UARTREG.h new file mode 100644 index 00000000..5dea0f19 --- /dev/null +++ b/tos/chips/pxa27x/uart/PXA27X_UARTREG.h @@ -0,0 +1,58 @@ +/* $Id$ */ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arched Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +/* + * Helper macros to make programming the HplPXA27xUARTP component easier + */ + +#ifndef _PXA27X_UARTREG_H +#define _PXA27X_UARTREG_H + +#define UARTRBR(_base) _PXAREG_OFFSET(_base,0) +#define UARTTHR(_base) _PXAREG_OFFSET(_base,0) +#define UARTIER(_base) _PXAREG_OFFSET(_base,0x04) +#define UARTIIR(_base) _PXAREG_OFFSET(_base,0x08) +#define UARTFCR(_base) _PXAREG_OFFSET(_base,0x08) +#define UARTLCR(_base) _PXAREG_OFFSET(_base,0x0C) +#define UARTMCR(_base) _PXAREG_OFFSET(_base,0x10) +#define UARTLSR(_base) _PXAREG_OFFSET(_base,0x14) +#define UARTMSR(_base) _PXAREG_OFFSET(_base,0x18) +#define UARTSPR(_base) _PXAREG_OFFSET(_base,0x1C) +#define UARTISR(_base) _PXAREG_OFFSET(_base,0x20) +#define UARTFOR(_base) _PXAREG_OFFSET(_base,0x24) +#define UARTABR(_base) _PXAREG_OFFSET(_base,0x28) +#define UARTACR(_base) _PXAREG_OFFSET(_base,0x2C) + +#define UARTDLL(_base) _PXAREG_OFFSET(_base,0) +#define UARTDLH(_base) _PXAREG_OFFSET(_base,0x04) + +#endif /* _PXA27X_UARTREG_H */ + diff --git a/tos/chips/pxa27x/uart/pxa27x_serial.h b/tos/chips/pxa27x/uart/pxa27x_serial.h new file mode 100644 index 00000000..b7e03f25 --- /dev/null +++ b/tos/chips/pxa27x/uart/pxa27x_serial.h @@ -0,0 +1,44 @@ +/* $Id$ */ +/* + * Copyright (c) 2005 Arched Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arched Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + + +#ifndef _pxa27x_serial_h +#define _pxa27x_serial_h + +typedef uint8_t uart_status_t; // ??? if this is supposed to be a uint8_t + +typedef enum { + EVEN, + ODD, + NONE +} uart_parity_t; + +#endif /* _pxa27x_serial_h */ diff --git a/tos/chips/tda5250/HplTda5250DataC.nc b/tos/chips/tda5250/HplTda5250DataC.nc new file mode 100644 index 00000000..87d2744f --- /dev/null +++ b/tos/chips/tda5250/HplTda5250DataC.nc @@ -0,0 +1,67 @@ +/* +* Copyright (c) 2004, Technische Universitat Berlin +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* - Neither the name of the Technische Universitat Berlin nor the names +* of its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* - Revision ------------------------------------------------------------- +* $Revision$ +* $Date$ +* ======================================================================== +*/ + + +/** + * Controlling the TDA5250 at the HPL layer. + * + * @author Kevin Klues (klues@tkn.tu-berlin.de) + */ +configuration HplTda5250DataC { + provides { + interface Init; + interface HplTda5250Data; + interface HplTda5250DataControl; + interface ResourceRequested; + interface Resource as Resource; + } +} +implementation { + + components HplTda5250DataP, + Tda5250RadioIOC, + HplTda5250DataIOC; + + Init = HplTda5250DataP; + Resource = HplTda5250DataP.Resource; + ResourceRequested = HplTda5250DataP.ResourceRequested; + HplTda5250Data = HplTda5250DataP; + HplTda5250DataControl = HplTda5250DataP; + + HplTda5250DataP.DATA -> Tda5250RadioIOC.Tda5250RadioDATA; + HplTda5250DataP.Uart -> HplTda5250DataIOC.UartStream; + HplTda5250DataP.UartDataControl -> HplTda5250DataIOC.UartDataControl; + HplTda5250DataP.UartResource -> HplTda5250DataIOC.Resource; + HplTda5250DataP.UartResourceRequested -> HplTda5250DataIOC.ResourceRequested; + +} diff --git a/tos/chips/tda5250/HplTda5250DataControl.nc b/tos/chips/tda5250/HplTda5250DataControl.nc new file mode 100644 index 00000000..fb4a82d1 --- /dev/null +++ b/tos/chips/tda5250/HplTda5250DataControl.nc @@ -0,0 +1,29 @@ + /** + * Interface for controlling the data interface of the TDA5250 Radio. + * This interface lets you switch between Tx and Rx. + * In conjunction to this the HplTda5250Data interface + * is used for the actual receiving and sending of data. + * + * @see HplTda5250Data + * @author Philipp Huppertz (huppertz@tkn.tu-berlin.de) + */ +interface HplTda5250DataControl { + +/** + * Sets the radio to transmit. + * + * @return SUCCESS on success + * FAIL otherwise. + */ + async command error_t setToTx(); + + + /** + * Sets the radio to receive. + * + * @return SUCCESS on success + * FAIL otherwise. + */ + async command error_t setToRx(); + +} diff --git a/tos/interfaces/AdcConfigure.nc b/tos/interfaces/AdcConfigure.nc new file mode 100644 index 00000000..a9713eb9 --- /dev/null +++ b/tos/interfaces/AdcConfigure.nc @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * - Revision ------------------------------------------------------------- + * $Revision$ + * $Date$ + * @author: Jan Hauer + * ======================================================================== + */ + +/** + * This interface is intended to be provided by an ADC client and used by the + * ADC subsystem to retrieve the client's ADC configuration. + * + * @author Jan Hauer + * @see Please refer to TEP 101 for more information about this interface and + * its intended use. + */ + +interface AdcConfigure +{ + + /** + * Returns the configuration of an ADC client. adc_config_t is + * a hardware specific data type that contains all information necessary to + * configure the respective ADC hardware for the client. A client MUST always + * return the same configuration and, if configuration data is passed as a + * pointer, the ADC subsystem (HIL component) MUST NOT reference it after the + * return of this command. + * + * @return chip specific configuration. + */ + async command adc_config_t getConfiguration(); +} diff --git a/tos/interfaces/ResourceQueue.nc b/tos/interfaces/ResourceQueue.nc new file mode 100644 index 00000000..3b135b85 --- /dev/null +++ b/tos/interfaces/ResourceQueue.nc @@ -0,0 +1,70 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * A queue interface for managing client ids when performing resource + * arbitration. A single slot in the queue is guaranteed to each resource + * client, with the actual queing policy determined by the implementation + * of the interface. + * + * @author Kevin Klues + * @date $Date$ + */ + +#include "Resource.h" + +interface ResourceQueue { + + /** + * Check to see if the queue is empty. + * + * @return TRUE if the queue is empty.
    + * FALSE if there is at least one entry in the queue + */ + async command bool isEmpty(); + + /** + * Check to see if a given cleint id has already been enqueued + * and is waiting to be processed. + * + * @return TRUE if the client id is in the queue.
    + * FALSE if it does not + */ + async command bool isEnqueued(resource_client_id_t id); + + /** + * Retreive the cleint id of the next resource in the queue. + * If the queue is empty, the return value is undefined. + * + * @return The cleint id at the head of the queue. + */ + async command resource_client_id_t dequeue(); + + /** + * Enqueue a cleint id + * + * @param cleintId - the cleint id to enqueue + * @return SUCCESS if the client id was enqueued successfully
    + * EBUSY if it has already been enqueued. + */ + async command error_t enqueue(resource_client_id_t id); +} diff --git a/tos/interfaces/ResourceRequested.nc b/tos/interfaces/ResourceRequested.nc new file mode 100644 index 00000000..771a38d6 --- /dev/null +++ b/tos/interfaces/ResourceRequested.nc @@ -0,0 +1,52 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * Please refer to TEP 108 for more information about this interface and its + * intended use.

    + * + * The ResourceRequested interface can be used in conjunction with the + * Resource interface in order to receive events based on other users + * requests. + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +interface ResourceRequested { + /** + * This event is signalled whenever the user of this interface + * currently has control of the resource, and another user requests + * it through the Resource.request() command. You may want to + * consider releasing a resource based on this event + */ + async event void requested(); + + /** + * This event is signalled whenever the user of this interface + * currently has control of the resource, and another user requests + * it through the Resource.immediateRequest() command. You may + * want to consider releasing a resource based on this event + */ + async event void immediateRequested(); +} diff --git a/tos/interfaces/UartByte.nc b/tos/interfaces/UartByte.nc new file mode 100644 index 00000000..e534c23d --- /dev/null +++ b/tos/interfaces/UartByte.nc @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +interface UartByte { + + /** + * Send a single uart byte. The call blocks until it is ready to + * accept another byte for sending. + * + * @param byte The byte to send. + * @return SUCCESS if byte was sent, FAIL otherwise. + */ + async command error_t send( uint8_t byte ); + + /** + * Receive a single uart byte. The call blocks until a byte is + * received. + * + * @param byte Where to place received byte. + * @param timeout How long in byte times to wait. + * @return SUCCESS if a byte was received, FAIL if timed out. + */ + async command error_t receive( uint8_t* byte, uint8_t timeout ); + +} diff --git a/tos/interfaces/UartStream.nc b/tos/interfaces/UartStream.nc new file mode 100644 index 00000000..6f4e320a --- /dev/null +++ b/tos/interfaces/UartStream.nc @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +interface UartStream { + + /** + * Begin transmission of a UART stream. If SUCCESS is returned, + * sendDone will be signalled when transmission is + * complete. + * + * @param buf Buffer for bytes to send. + * @param len Number of bytes to send. + * @return SUCCESS if request was accepted, FAIL otherwise. + */ + async command error_t send( uint8_t* buf, uint16_t len ); + + /** + * Signal completion of sending a stream. + * + * @param buf Bytes sent. + * @param len Number of bytes sent. + * @param error SUCCESS if the transmission was successful, FAIL otherwise. + */ + async event void sendDone( uint8_t* buf, uint16_t len, error_t error ); + + /** + * Enable the receive byte interrupt. The receive event + * is signalled each time a byte is received. + * + * @return SUCCESS if interrupt was enabled, FAIL otherwise. + */ + async command error_t enableReceiveInterrupt(); + + /** + * Disable the receive byte interrupt. + * + * @return SUCCESS if interrupt was disabled, FAIL otherwise. + */ + async command error_t disableReceiveInterrupt(); + + /** + * Signals the receipt of a byte. + * + * @param byte The byte received. + */ + async event void receivedByte( uint8_t byte ); + + /** + * Begin reception of a UART stream. If SUCCESS is returned, + * receiveDone will be signalled when reception is + * complete. + * + * @param buf Buffer for received bytes. + * @param len Number of bytes to receive. + * @return SUCCESS if request was accepted, FAIL otherwise. + */ + async command error_t receive( uint8_t* buf, uint16_t len ); + + /** + * Signal completion of receiving a stream. + * + * @param buf Buffer for bytes received. + * @param len Number of bytes received. + * @param error SUCCESS if the reception was successful, FAIL otherwise. + */ + async event void receiveDone( uint8_t* buf, uint16_t len, error_t error ); + +} diff --git a/tos/lib/byte_radio/PacketAck.h b/tos/lib/byte_radio/PacketAck.h new file mode 100644 index 00000000..fd5dd5f9 --- /dev/null +++ b/tos/lib/byte_radio/PacketAck.h @@ -0,0 +1,51 @@ +/* -*- mode:c++; indent-tabs-mode: nil -*- + * Copyright (c) 2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES {} LOSS OF USE, DATA, + * OR PROFITS {} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * - Description --------------------------------------------------------- + * provide constants for packet ack interface + * - Author -------------------------------------------------------------- + * @author: Andreas Koepke (koepke@tkn.tu-berlin.de) + * ======================================================================== + */ + +#ifndef PACKET_ACK_H +#define PACKET_ACK_H +/* +#define NO_ACK_REQUESTED 1 +#define WAS_ACKED 2 +#define ACK_REQUESTED 128 +*/ +typedef enum { + NO_ACK_REQUESTED = 1, + WAS_ACKED, + WAS_NOT_ACKED, + ACK_REQUESTED = 128U +} packet_ack_t; + + +#endif diff --git a/tos/lib/net/CollectionDebug.nc b/tos/lib/net/CollectionDebug.nc new file mode 100644 index 00000000..23d5fcbc --- /dev/null +++ b/tos/lib/net/CollectionDebug.nc @@ -0,0 +1,69 @@ +/* $Id$*/ +/* + * "Copyright (c) 2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ + +/** + * The CollectionDebug is an interface for sending debugging events to + * a logging infrastructure. An implementer can choose to send the event + * information to different destinations. Primary examples can include: + *

      + *
    • logging to the UART, in case of a testbed of network-connected + * nodes; + *
    • logging to flash, if the logs are to be retrieved later + *
    • logging to the standard output, in the case of TOSSIM. + *
    + * + * The interface does not specify in what format the log is to be produced, + * or if other information, like timestamps, should be added, and this is + * up to the implementer. + * + * Some commands are generic, like Event, EventSimple, and EventDbg, while others + * are for more specific events related to collection, like EventRoute and EventMsg. + * + + * @author Rodrigo Fonseca + * @author Kyle Jamieson + * @date $Date$ + */ + +interface CollectionDebug { + /* Log the occurrence of an event of type type */ + command error_t logEvent(uint8_t type); + + /* Log the occurrence of an event and a single parameter */ + command error_t logEventSimple(uint8_t type, uint16_t arg); + + /* Log the occurrence of an event and 3 16bit parameters */ + command error_t logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3); + + /* Log the occurrence of an event related to forwarding a message. + * This is intended to allow following the same message as it goes from one + * hop to the next + */ + command error_t logEventMsg(uint8_t type, uint16_t msg, am_addr_t origin, am_addr_t node); + + /* Log the occurrence of an event related to a route update message, + * such as a node receiving a route, updating its own route information, + * or looking at a particular entry in its routing table. + */ + command error_t logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t metric); +} diff --git a/tos/lib/net/CollectionDebugMsg.h b/tos/lib/net/CollectionDebugMsg.h new file mode 100644 index 00000000..e666979f --- /dev/null +++ b/tos/lib/net/CollectionDebugMsg.h @@ -0,0 +1,74 @@ +#ifndef _COLLECTION_UART_MSG +#define _COLLECTION_UART_MSG + +#include "AM.h" + +//Comment format -> :meaning:args +enum { + NET_C_DEBUG_STARTED = 0xDE, + + NET_C_FE_MSG_POOL_EMPTY = 0x10, //::no args + NET_C_FE_SEND_QUEUE_FULL = 0x11, //::no args + NET_C_FE_NO_ROUTE = 0x12, //::no args + NET_C_FE_SUBSEND_OFF = 0x13, + NET_C_FE_SUBSEND_BUSY = 0x14, + NET_C_FE_BAD_SENDDONE = 0x15, + NET_C_FE_QENTRY_POOL_EMPTY = 0x16, + NET_C_FE_SUBSEND_SIZE = 0x17, + NET_C_FE_LOOP_DETECTED = 0x18, + NET_C_FE_SEND_BUSY = 0x19, + + NET_C_FE_SENDQUEUE_EMPTY = 0x50, + NET_C_FE_PUT_MSGPOOL_ERR = 0x51, + NET_C_FE_PUT_QEPOOL_ERR = 0x52, + NET_C_FE_GET_MSGPOOL_ERR = 0x53, + NET_C_FE_GET_QEPOOL_ERR = 0x54, + + NET_C_FE_SENT_MSG = 0x20, //:app. send :msg uid, origin, next_hop + NET_C_FE_RCV_MSG = 0x21, //:next hop receive:msg uid, origin, last_hop + NET_C_FE_FWD_MSG = 0x22, //:fwd msg :msg uid, origin, next_hop + NET_C_FE_DST_MSG = 0x23, //:base app. recv :msg_uid, origin, last_hop + NET_C_FE_SENDDONE_FAIL = 0x24, + NET_C_FE_SENDDONE_WAITACK = 0x25, + NET_C_FE_SENDDONE_FAIL_ACK_SEND = 0x26, + NET_C_FE_SENDDONE_FAIL_ACK_FWD = 0x27, + NET_C_FE_DUPLICATE_CACHE = 0x28, //dropped duplicate packet seen in cache + NET_C_FE_DUPLICATE_QUEUE = 0x29, //dropped duplicate packet seen in queue + NET_C_FE_DUPLICATE_CACHE_AT_SEND = 0x2A, //dropped duplicate packet seen in cache + + + NET_C_TREE_NO_ROUTE = 0x30, //: :no args + NET_C_TREE_NEW_PARENT = 0x31, //: :parent_id, hopcount, metric + NET_C_TREE_ROUTE_INFO = 0x32, //:periodic:parent_id, hopcount, metric + NET_C_TREE_SENT_BEACON = 0x33, + NET_C_TREE_RCV_BEACON = 0x34, + + NET_C_DBG_1 = 0x40, //:any :uint16_t a + NET_C_DBG_2 = 0x41, //:any :uint16_t a, b, c + NET_C_DBG_3 = 0x42, //:any :uint16_t a, b, c +}; + +typedef nx_struct CollectionDebugMsg { + nx_uint8_t type; + nx_union { + nx_uint16_t arg; + nx_struct { + nx_uint16_t msg_uid; + nx_am_addr_t origin; + nx_am_addr_t other_node; + } msg; + nx_struct { + nx_am_addr_t parent; + nx_uint8_t hopcount; + nx_uint16_t metric; + } route_info; + nx_struct { + nx_uint16_t a; + nx_uint16_t b; + nx_uint16_t c; + } dbg; + } data; + nx_uint16_t seqno; +} CollectionDebugMsg; + +#endif diff --git a/tos/lib/net/CollectionId.nc b/tos/lib/net/CollectionId.nc new file mode 100644 index 00000000..5e3a9673 --- /dev/null +++ b/tos/lib/net/CollectionId.nc @@ -0,0 +1,47 @@ +/* $Id$ */ +/* + * Copyright (c) 2006 Massachusetts Institute of Technology (MIT). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Massachusetts Institute of Technology nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * MASSACHUSETTS INSITIUTE OF TECHNOLOGY OR ITS CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +/** + * Interface for fetching the collection ID associated with a + * collection sender instance. + * + * @author Kyle Jamieson + * @date $Date$ + */ + +#include "Collection.h" + +interface CollectionId { + command collection_id_t fetch(); +} diff --git a/tos/lib/net/CollectionIdP.nc b/tos/lib/net/CollectionIdP.nc new file mode 100644 index 00000000..03be05d6 --- /dev/null +++ b/tos/lib/net/CollectionIdP.nc @@ -0,0 +1,53 @@ +/* $Id$ */ +/* + * Copyright (c) 2006 Massachusetts Institute of Technology (MIT). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Massachusetts Institute of Technology nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * MASSACHUSETTS INSITIUTE OF TECHNOLOGY OR ITS CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +/** + * Interface for fetching the collection ID associated with a + * collection sender instance. + * + * @author Kyle Jamieson + * @date $Date$ + */ + +#include "Collection.h" + +generic module CollectionIdP(collection_id_t collectid) { + provides interface CollectionId; +} + +implementation { + command collection_id_t CollectionId.fetch() { + return collectid; + } +} diff --git a/tos/lib/net/CollectionPacket.nc b/tos/lib/net/CollectionPacket.nc new file mode 100644 index 00000000..62bf3a36 --- /dev/null +++ b/tos/lib/net/CollectionPacket.nc @@ -0,0 +1,52 @@ +/* $Id$ */ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * @author Philip Levis + * @author Kyle Jamieson + * @date $Date$ + */ + +#include +#include + +interface CollectionPacket { + command am_addr_t getOrigin(message_t* msg); + command void setOrigin(message_t* msg, am_addr_t addr); + + command collection_id_t getType(message_t* msg); + command void setType(message_t* msg, collection_id_t id); + + command uint8_t getSequenceNumber(message_t* msg); + command void setSequenceNumber(message_t* msg, uint8_t seqno); +} + diff --git a/tos/lib/net/NeighborTableEviction.nc b/tos/lib/net/NeighborTableEviction.nc new file mode 100644 index 00000000..4eaeda58 --- /dev/null +++ b/tos/lib/net/NeighborTableEviction.nc @@ -0,0 +1,47 @@ +/* + * "Copyright (c) 2006 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright. + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the University of California nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * REGENTS OF THE UNVERSITY OF CALIFORNIA OR ITS CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +/** + * Notify when a neighbor has been evicted from the neighbor table. + * + * @author Rodrigo Fonseca + */ + +interface NeighborTableEviction { + + /** + * Signals to users that the neighbor has been evicted from the table + */ + event void evicted(uint16_t neighbor) +} + diff --git a/tos/lib/net/README b/tos/lib/net/README new file mode 100644 index 00000000..4906a856 --- /dev/null +++ b/tos/lib/net/README @@ -0,0 +1,7 @@ +This directory contains network protocols that are part of +the TinyOS core distribution. They are: + +ctp: Collection Tree Protocol (TEP 123) +dip: DIssemination Protocol (TEP 1xx) +rstp: Root Sequenced Tree Protocol (TEP 124) + diff --git a/tos/lib/net/RootControl.nc b/tos/lib/net/RootControl.nc new file mode 100644 index 00000000..387f627a --- /dev/null +++ b/tos/lib/net/RootControl.nc @@ -0,0 +1,44 @@ +/* $Id$ */ +/* + * "Copyright (c) 2006 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright. + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the University of California nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * REGENTS OF THE UNVERSITY OF CALIFORNIA OR ITS CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +/** Controls whether the current node is a root of the tree + * @author Rodrigo Fonseca + * @date $Date$ + */ + +interface RootControl { + command error_t setRoot(); + command error_t unsetRoot(); + command bool isRoot(); +} diff --git a/tos/lib/net/UARTDebugSenderP.nc b/tos/lib/net/UARTDebugSenderP.nc new file mode 100644 index 00000000..b339d87b --- /dev/null +++ b/tos/lib/net/UARTDebugSenderP.nc @@ -0,0 +1,202 @@ +#include +module UARTDebugSenderP { + provides { + interface CollectionDebug; + } + uses { + interface Boot; + interface Pool as MessagePool; + interface Queue as SendQueue; + interface AMSend as UARTSend; + } +} +implementation { + message_t uartPacket; + bool sending; + uint8_t len; + uint16_t statLogReceived = 0; + uint16_t statEnqueueFail = 0; + uint16_t statSendFail = 0; + uint16_t statSendDoneFail = 0; + uint16_t statSendDoneOk = 0; + uint16_t statSendDoneBug = 0; + + + event void Boot.booted() { + sending = FALSE; + len = sizeof(CollectionDebugMsg); + statSendFail = 0; + statLogReceived = 0; + statEnqueueFail = 0; + statSendDoneOk = 0; + statSendDoneFail = 0; + statSendDoneBug = 0; + } + + task void sendTask() { + if (sending) { + return; + } else if (call SendQueue.empty()) { + return; + } else { + message_t* smsg = call SendQueue.head(); + error_t eval = call UARTSend.send(AM_BROADCAST_ADDR, smsg, len); + if (eval == SUCCESS) { + sending = TRUE; + return; + } else { + //Drop packet. Don't retry. + statSendFail++; + call SendQueue.dequeue(); + call MessagePool.put(smsg); + if (! call SendQueue.empty()) + post sendTask(); + } + } + } + + event void UARTSend.sendDone(message_t *msg, error_t error) { + message_t* qh = call SendQueue.head(); + if (qh == NULL || qh != msg) { + //bad mojo + statSendDoneBug++; + } else { + call SendQueue.dequeue(); + call MessagePool.put(msg); + if (error == SUCCESS) + statSendDoneOk++; + else + statSendDoneFail++; + } + sending = FALSE; + if (!call SendQueue.empty()) + post sendTask(); + } + + command error_t CollectionDebug.logEvent(uint8_t type) { + statLogReceived++; + if (call MessagePool.empty()) { + return FAIL; + } else { + message_t* msg = call MessagePool.get(); + CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg); + memset(dbg_msg, 0, len); + + dbg_msg->type = type; + dbg_msg->seqno = statLogReceived; + + if (call SendQueue.enqueue(msg) == SUCCESS) { + post sendTask(); + return SUCCESS; + } else { + statEnqueueFail++; + call MessagePool.put(msg); + return FAIL; + } + } + } + /* Used for FE_SENT_MSG, FE_RCV_MSG, FE_FWD_MSG, FE_DST_MSG */ + command error_t CollectionDebug.logEventMsg(uint8_t type, uint16_t msg_id, am_addr_t origin, am_addr_t node) { + statLogReceived++; + if (call MessagePool.empty()) { + return FAIL; + } else { + message_t* msg = call MessagePool.get(); + CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg); + memset(dbg_msg, 0, len); + + dbg_msg->type = type; + dbg_msg->data.msg.msg_uid = msg_id; + dbg_msg->data.msg.origin = origin; + dbg_msg->data.msg.other_node = node; + dbg_msg->seqno = statLogReceived; + + if (call SendQueue.enqueue(msg) == SUCCESS) { + post sendTask(); + return SUCCESS; + } else { + statEnqueueFail++; + call MessagePool.put(msg); + return FAIL; + } + } + } + /* Used for TREE_NEW_PARENT, TREE_ROUTE_INFO */ + command error_t CollectionDebug.logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t metric) { + statLogReceived++; + if (call MessagePool.empty()) { + return FAIL; + } else { + message_t* msg = call MessagePool.get(); + CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg); + memset(dbg_msg, 0, len); + + dbg_msg->type = type; + dbg_msg->data.route_info.parent = parent; + dbg_msg->data.route_info.hopcount = hopcount; + dbg_msg->data.route_info.metric = metric; + dbg_msg->seqno = statLogReceived; + + if (call SendQueue.enqueue(msg) == SUCCESS) { + post sendTask(); + return SUCCESS; + } else { + statEnqueueFail++; + call MessagePool.put(msg); + return FAIL; + } + } + } + /* Used for DBG_1 */ + command error_t CollectionDebug.logEventSimple(uint8_t type, uint16_t arg) { + statLogReceived++; + if (call MessagePool.empty()) { + return FAIL; + } else { + message_t* msg = call MessagePool.get(); + CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg); + memset(dbg_msg, 0, len); + + dbg_msg->type = type; + dbg_msg->data.arg = arg; + dbg_msg->seqno = statLogReceived; + + if (call SendQueue.enqueue(msg) == SUCCESS) { + post sendTask(); + return SUCCESS; + } else { + statEnqueueFail++; + call MessagePool.put(msg); + return FAIL; + } + } + } + /* Used for DBG_2, DBG_3 */ + command error_t CollectionDebug.logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3) { + statLogReceived++; + if (call MessagePool.empty()) { + return FAIL; + } else { + message_t* msg = call MessagePool.get(); + CollectionDebugMsg* dbg_msg = call UARTSend.getPayload(msg); + memset(dbg_msg, 0, len); + + dbg_msg->type = type; + dbg_msg->data.dbg.a = arg1; + dbg_msg->data.dbg.b = arg2; + dbg_msg->data.dbg.c = arg3; + dbg_msg->seqno = statLogReceived; + + if (call SendQueue.enqueue(msg) == SUCCESS) { + post sendTask(); + return SUCCESS; + } else { + statEnqueueFail++; + call MessagePool.put(msg); + return FAIL; + } + } + } + +} + diff --git a/tos/lib/net/UnicastNameFreeRouting.nc b/tos/lib/net/UnicastNameFreeRouting.nc new file mode 100644 index 00000000..db21a298 --- /dev/null +++ b/tos/lib/net/UnicastNameFreeRouting.nc @@ -0,0 +1,54 @@ +/* $Id$ */ +/* + * "Copyright (c) 2006 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright. + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the University of California nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * REGENTS OF THE UNVERSITY OF CALIFORNIA OR ITS CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +/** + * Provides a single next hop on a name-free protocol. + * + * @author Philip Levis + * @date $Date$ + */ +interface UnicastNameFreeRouting { + + /** + * Get the address of the best next hop set to the destination. + * If there is not best next hop, the address is the local address. + * @return : The next best hop, or the local address if there is no route. + */ + command am_addr_t nextHop(); + command bool hasRoute(); + + event void routeFound(); + event void noRoute(); +} + diff --git a/tos/lib/net/ctp/.cvsignore b/tos/lib/net/ctp/.cvsignore new file mode 100644 index 00000000..a01ee289 --- /dev/null +++ b/tos/lib/net/ctp/.cvsignore @@ -0,0 +1 @@ +.*.swp diff --git a/tos/lib/net/ctp/Collection.h b/tos/lib/net/ctp/Collection.h new file mode 100644 index 00000000..e20da694 --- /dev/null +++ b/tos/lib/net/ctp/Collection.h @@ -0,0 +1,40 @@ +/* $Id$ */ +/* + * "Copyright (c) 2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ + +/* + * @author Rodrigo Fonseca + * @date $Date$ + */ +#ifndef COLLECTION_H +#define COLLECTION_H + +enum { + AM_COLLECTION_DATA = 20, + AM_COLLECTION_CONTROL = 21, + AM_COLLECTION_DEBUG = 22, +}; + +typedef uint8_t collection_id_t; +typedef nx_uint8_t nx_collection_id_t; + +#endif diff --git a/tos/lib/net/ctp/CollectionC.nc b/tos/lib/net/ctp/CollectionC.nc new file mode 100644 index 00000000..bca0c793 --- /dev/null +++ b/tos/lib/net/ctp/CollectionC.nc @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "Ctp.h" + +/** + * A data collection service that uses a tree routing protocol + * to deliver data to collection roots, following TEP 119. + * + * @author Rodrigo Fonseca + * @author Omprakash Gnawali + * @author Kyle Jamieson + * @author Philip Levis + */ + + +configuration CollectionC { + provides { + interface StdControl; + interface Send[uint8_t client]; + interface Receive[collection_id_t id]; + interface Receive as Snoop[collection_id_t]; + interface Intercept[collection_id_t id]; + + interface Packet; + interface CollectionPacket; + interface CtpPacket; + + interface CtpInfo; + interface CtpCongestion; + interface RootControl; + } + + uses { + interface CollectionId[uint8_t client]; + interface CollectionDebug; + } +} + +implementation { + components CtpP; + + StdControl = CtpP; + Send = CtpP; + Receive = CtpP.Receive; + Snoop = CtpP.Snoop; + Intercept = CtpP; + + Packet = CtpP; + CollectionPacket = CtpP; + CtpPacket = CtpP; + + CtpInfo = CtpP; + CtpCongestion = CtpP; + RootControl = CtpP; + + CollectionId = CtpP; + CollectionDebug = CtpP; +} + diff --git a/tos/lib/net/ctp/CollectionSenderC.nc b/tos/lib/net/ctp/CollectionSenderC.nc new file mode 100644 index 00000000..9fae7b13 --- /dev/null +++ b/tos/lib/net/ctp/CollectionSenderC.nc @@ -0,0 +1,22 @@ +/** + * The virtualized collection sender abstraction. + * + * @author Kyle Jamieson + * @author Philip Levis + * @date April 25 2006 + * @see TinyOS Net2-WG + */ + +#include + +generic configuration CollectionSenderC(collection_id_t collectid) { + provides { + interface Send; + interface Packet; + } +} +implementation { + components new CollectionSenderP(collectid, unique(UQ_CTP_CLIENT)); + Send = CollectionSenderP; + Packet = CollectionSenderP; +} diff --git a/tos/lib/net/ctp/CollectionSenderP.nc b/tos/lib/net/ctp/CollectionSenderP.nc new file mode 100644 index 00000000..9ca2279a --- /dev/null +++ b/tos/lib/net/ctp/CollectionSenderP.nc @@ -0,0 +1,18 @@ +#include "Collection.h" + +generic configuration +CollectionSenderP(collection_id_t collectid, uint8_t clientid) { + provides { + interface Send; + interface Packet; + } +} + +implementation { + components CollectionC as Collector; + components new CollectionIdP(collectid); + + Send = Collector.Send[clientid]; + Packet = Collector.Packet; + Collector.CollectionId[clientid] -> CollectionIdP; +} diff --git a/tos/lib/net/ctp/Ctp.h b/tos/lib/net/ctp/Ctp.h new file mode 100644 index 00000000..5ba6a0b7 --- /dev/null +++ b/tos/lib/net/ctp/Ctp.h @@ -0,0 +1,82 @@ +/* $Id$ */ + +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Header file that declares the AM types, message formats, and + * constants for the TinyOS reference implementation of the + * Collection Tree Protocol (CTP), as documented in TEP 123. + * + * @author Philip Levis + * @date $Date$ + */ + +#ifndef CTP_H +#define CTP_H + +#include +#include + +#define UQ_CTP_CLIENT "CtpSenderC.CollectId" + +enum { + // AM types: + AM_CTP_DATA = 23, + AM_CTP_ROUTING = 24, + AM_CTP_DEBUG = 25, + + // CTP Options: + CTP_OPT_PULL = 0x80, // TEP 123: P field + CTP_OPT_ECN = 0x40, // TEP 123: C field +}; + +typedef nx_uint8_t nx_ctp_options_t; +typedef uint8_t ctp_options_t; + +typedef nx_struct { + nx_ctp_options_t options; + nx_uint8_t thl; + nx_uint16_t etx; + nx_am_addr_t origin; + nx_uint8_t originSeqNo; + nx_collection_id_t type; + nx_uint8_t data[0]; +} ctp_data_header_t; + +typedef nx_struct { + nx_ctp_options_t options; + nx_am_addr_t parent; + nx_uint16_t etx; + nx_uint8_t data[0]; +} ctp_routing_header_t; + +#endif diff --git a/tos/lib/net/ctp/CtpCongestion.nc b/tos/lib/net/ctp/CtpCongestion.nc new file mode 100644 index 00000000..a1561e8e --- /dev/null +++ b/tos/lib/net/ctp/CtpCongestion.nc @@ -0,0 +1,15 @@ +interface CtpCongestion { + + /* Returns the current state of congestion from the provider. Ctp may be + * congested because its internal queue is congested or because the receive + * client called isCongested with TRUE. */ + + command bool isCongested(); + + /* Idempotent call to let the provider know whether a client is congested. + * If not previously congested, Ctp will take measures to slow down. + * Ctp has an internal congested condition as well. The result of isCongested + * is a logical OR with the parameter set here and the internal congestion. + */ + command void setClientCongested(bool congested); +} diff --git a/tos/lib/net/ctp/CtpDebug.nc b/tos/lib/net/ctp/CtpDebug.nc new file mode 100644 index 00000000..23d5fcbc --- /dev/null +++ b/tos/lib/net/ctp/CtpDebug.nc @@ -0,0 +1,69 @@ +/* $Id$*/ +/* + * "Copyright (c) 2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ + +/** + * The CollectionDebug is an interface for sending debugging events to + * a logging infrastructure. An implementer can choose to send the event + * information to different destinations. Primary examples can include: + *
      + *
    • logging to the UART, in case of a testbed of network-connected + * nodes; + *
    • logging to flash, if the logs are to be retrieved later + *
    • logging to the standard output, in the case of TOSSIM. + *
    + * + * The interface does not specify in what format the log is to be produced, + * or if other information, like timestamps, should be added, and this is + * up to the implementer. + * + * Some commands are generic, like Event, EventSimple, and EventDbg, while others + * are for more specific events related to collection, like EventRoute and EventMsg. + * + + * @author Rodrigo Fonseca + * @author Kyle Jamieson + * @date $Date$ + */ + +interface CollectionDebug { + /* Log the occurrence of an event of type type */ + command error_t logEvent(uint8_t type); + + /* Log the occurrence of an event and a single parameter */ + command error_t logEventSimple(uint8_t type, uint16_t arg); + + /* Log the occurrence of an event and 3 16bit parameters */ + command error_t logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3); + + /* Log the occurrence of an event related to forwarding a message. + * This is intended to allow following the same message as it goes from one + * hop to the next + */ + command error_t logEventMsg(uint8_t type, uint16_t msg, am_addr_t origin, am_addr_t node); + + /* Log the occurrence of an event related to a route update message, + * such as a node receiving a route, updating its own route information, + * or looking at a particular entry in its routing table. + */ + command error_t logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t metric); +} diff --git a/tos/lib/net/ctp/CtpDebugMsg.h b/tos/lib/net/ctp/CtpDebugMsg.h new file mode 100644 index 00000000..7f42826f --- /dev/null +++ b/tos/lib/net/ctp/CtpDebugMsg.h @@ -0,0 +1,78 @@ +#ifndef _COLLECTION_UART_MSG +#define _COLLECTION_UART_MSG + +#include "AM.h" + +//Comment format -> :meaning:args +enum { + NET_C_DEBUG_STARTED = 0xDE, + + NET_C_FE_MSG_POOL_EMPTY = 0x10, //::no args + NET_C_FE_SEND_QUEUE_FULL = 0x11, //::no args + NET_C_FE_NO_ROUTE = 0x12, //::no args + NET_C_FE_SUBSEND_OFF = 0x13, + NET_C_FE_SUBSEND_BUSY = 0x14, + NET_C_FE_BAD_SENDDONE = 0x15, + NET_C_FE_QENTRY_POOL_EMPTY = 0x16, + NET_C_FE_SUBSEND_SIZE = 0x17, + NET_C_FE_LOOP_DETECTED = 0x18, + NET_C_FE_SEND_BUSY = 0x19, + + NET_C_FE_SENDQUEUE_EMPTY = 0x50, + NET_C_FE_PUT_MSGPOOL_ERR = 0x51, + NET_C_FE_PUT_QEPOOL_ERR = 0x52, + NET_C_FE_GET_MSGPOOL_ERR = 0x53, + NET_C_FE_GET_QEPOOL_ERR = 0x54, + + NET_C_FE_SENT_MSG = 0x20, //:app. send :msg uid, origin, next_hop + NET_C_FE_RCV_MSG = 0x21, //:next hop receive:msg uid, origin, last_hop + NET_C_FE_FWD_MSG = 0x22, //:fwd msg :msg uid, origin, next_hop + NET_C_FE_DST_MSG = 0x23, //:base app. recv :msg_uid, origin, last_hop + NET_C_FE_SENDDONE_FAIL = 0x24, + NET_C_FE_SENDDONE_WAITACK = 0x25, + NET_C_FE_SENDDONE_FAIL_ACK_SEND = 0x26, + NET_C_FE_SENDDONE_FAIL_ACK_FWD = 0x27, + NET_C_FE_DUPLICATE_CACHE = 0x28, //dropped duplicate packet seen in cache + NET_C_FE_DUPLICATE_QUEUE = 0x29, //dropped duplicate packet seen in queue + NET_C_FE_DUPLICATE_CACHE_AT_SEND = 0x2A, //dropped duplicate packet seen in cache + NET_C_FE_CONGESTION_SENDWAIT = 0x2B, // sendTask deferring for congested parent + NET_C_FE_CONGESTION_BEGIN = 0x2C, // + NET_C_FE_CONGESTION_END = 0x2D, // congestion over: reason is arg; + // arg=1 => overheard parent's + // ECN cleared. + // arg=0 => timeout. + NET_C_TREE_NO_ROUTE = 0x30, //: :no args + NET_C_TREE_NEW_PARENT = 0x31, //: :parent_id, hopcount, metric + NET_C_TREE_ROUTE_INFO = 0x32, //:periodic:parent_id, hopcount, metric + NET_C_TREE_SENT_BEACON = 0x33, + NET_C_TREE_RCV_BEACON = 0x34, + + NET_C_DBG_1 = 0x40, //:any :uint16_t a + NET_C_DBG_2 = 0x41, //:any :uint16_t a, b, c + NET_C_DBG_3 = 0x42, //:any :uint16_t a, b, c +}; + +typedef nx_struct CollectionDebugMsg { + nx_uint8_t type; + nx_union { + nx_uint16_t arg; + nx_struct { + nx_uint16_t msg_uid; + nx_am_addr_t origin; + nx_am_addr_t other_node; + } msg; + nx_struct { + nx_am_addr_t parent; + nx_uint8_t hopcount; + nx_uint16_t metric; + } route_info; + nx_struct { + nx_uint16_t a; + nx_uint16_t b; + nx_uint16_t c; + } dbg; + } data; + nx_uint16_t seqno; +} CollectionDebugMsg; + +#endif diff --git a/tos/lib/net/ctp/CtpForwardingEngine.h b/tos/lib/net/ctp/CtpForwardingEngine.h new file mode 100644 index 00000000..f79f6720 --- /dev/null +++ b/tos/lib/net/ctp/CtpForwardingEngine.h @@ -0,0 +1,118 @@ +#ifndef FORWARDING_ENGINE_H +#define FORWARDING_ENGINE_H + +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +/** + * Author: Philip Levis + * Author: Kyle Jamieson + * Author: Omprakash Gnawali + * Author: Rodrigo Fonseca + */ + +/* + * These timings are in milliseconds, and are used by + * ForwardingEngineP. Each pair of values represents a range of + * [OFFSET - (OFFSET + WINDOW)]. The ForwardingEngine uses these + * values to determine when to send the next packet after an + * event. FAIL refers to a send fail (an error from the radio below), + * NOACK refers to the previous packet not being acknowledged, + * OK refers to an acknowledged packet, and LOOPY refers to when + * a loop is detected. + * + * These timings are defined in terms of packet times. Currently, + * two values are defined: for CC2420-based platforms (4ms) and + * all other platfoms (32ms). + */ + +enum { +#if PLATFORM_MICAZ || PLATFORM_TELOSA || PLATFORM_TELOSB || PLATFORM_TMOTE + FORWARD_PACKET_TIME = 4, +#else + FORWARD_PACKET_TIME = 32, +#endif +}; + +enum { + SENDDONE_FAIL_OFFSET = 512, + SENDDONE_NOACK_OFFSET = FORWARD_PACKET_TIME << 2, + SENDDONE_OK_OFFSET = FORWARD_PACKET_TIME << 2, + LOOPY_OFFSET = FORWARD_PACKET_TIME << 4, + SENDDONE_FAIL_WINDOW = SENDDONE_FAIL_OFFSET - 1, + LOOPY_WINDOW = LOOPY_OFFSET - 1, + SENDDONE_NOACK_WINDOW = SENDDONE_NOACK_OFFSET - 1, + SENDDONE_OK_WINDOW = SENDDONE_OK_OFFSET - 1, + CONGESTED_WAIT_OFFSET = FORWARD_PACKET_TIME << 2, + CONGESTED_WAIT_WINDOW = CONGESTED_WAIT_OFFSET - 1, +}; + + +/* + * The number of times the ForwardingEngine will try to + * transmit a packet before giving up if the link layer + * supports acknowledgments. If the link layer does + * not support acknowledgments it sends the packet once. + */ +enum { + MAX_RETRIES = 30 +}; + +/* + * The network header that the ForwardingEngine introduces. + * This header will change for the TinyOS 2.0 full release + * (it needs several optimizations). + */ +typedef nx_struct { + nx_uint8_t control; + nx_am_addr_t origin; + nx_uint8_t seqno; + nx_uint8_t collectid; + nx_uint16_t gradient; +} network_header_t; + +/* + * An element in the ForwardingEngine send queue. + * The client field keeps track of which send client + * submitted the packet or if the packet is being forwarded + * from another node (client == 255). Retries keeps track + * of how many times the packet has been transmitted. + */ +typedef struct { + message_t *msg; + uint8_t client; + uint8_t retries; +} fe_queue_entry_t; + +#endif diff --git a/tos/lib/net/ctp/CtpForwardingEngineP.nc b/tos/lib/net/ctp/CtpForwardingEngineP.nc new file mode 100644 index 00000000..f62ac97e --- /dev/null +++ b/tos/lib/net/ctp/CtpForwardingEngineP.nc @@ -0,0 +1,1014 @@ +/* $Id$ */ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * The ForwardingEngine is responsible for queueing and scheduling outgoing + * packets in a collection protocol. It maintains a pool of forwarding messages + * and a packet send + * queue. A ForwardingEngine with a forwarding message pool of size F + * and C CollectionSenderC clients has a send queue of size + * F + C. This implementation has a large number of configuration + * constants, which can be found in ForwardingEngine.h. + * + *

    Packets in the send queue are sent in FIFO order, with head-of-line + * blocking. Because this is a tree collection protocol, all packets are going + * to the same destination, and so the ForwardingEngine does not distinguish + * packets from one another: packets from CollectionSenderC clients are + * treated identically to forwarded packets.

    + * + *

    If ForwardingEngine is on top of a link layer that supports + * synchronous acknowledgments, it enables them and retransmits packets + * when they are not acked. It transmits a packet up to MAX_RETRIES times + * before giving up and dropping the packet.

    + * + *

    The ForwardingEngine detects routing loops and tries to correct + * them. It assumes that the collection tree is based on a gradient, + * such as hop count or estimated transmissions. When the ForwardingEngine + * sends a packet to the next hop, it puts the local gradient value in + * the packet header. If a node receives a packet to forward whose + * gradient value is less than its own, then the gradient is not monotonically + * decreasing and there may be a routing loop. When the ForwardingEngine + * receives such a packet, it tells the RoutingEngine to advertise its + * gradient value soon, with the hope that the advertisement will update + * the node who just sent a packet and break the loop. + * + *

    ForwardingEngine times its packet transmissions. It differentiates + * between four transmission cases: forwarding, success, ack failure, + * and loop detection. In each case, the + * ForwardingEngine waits a randomized period of time before sending the next + * packet. This approach assumes that the network is operating at low + * utilization; its goal is to prevent correlated traffic -- such as + * nodes along a route forwarding packets -- from interfering with itself. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    CaseCC2420 Wait (ms)Other Wait (ms)Description
    ForwardingImmediateImmediateWhen the ForwardingEngine receives a packet to forward and it is not + * already sending a packet (queue is empty). In this case, it immediately + * forwards the packet.
    Success16-31128-255When the ForwardingEngine successfully sends a packet to the next + * hop, it waits this long before sending the next packet in the queue. + *
    Ack Failure8-15128-255If the link layer supports acks and the ForwardingEngine did not + * receive an acknowledgment from the next hop, it waits this long before + * trying a retransmission. If the packet has exceeded the retransmission + * count, ForwardingEngine drops the packet and uses the Success timer instead.
    Loop Detection32-63512-1023If the ForwardingEngine is asked to forward a packet from a node that + * believes it is closer to the root, the ForwardingEngine pauses its + * transmissions for this interval and triggers the RoutingEngine to + * send an update. The goal is to let the gradient become consistent before + * sending packets, in order to prevent routing loops from consuming + * bandwidth and energy.
    + * + *

    The times above are all for CC2420-based platforms. The timings for + * other platforms depend on their bit rates, as they are based on packet + * transmission times.

    + + * @author Philip Levis + * @author Kyle Jamieson + * @date $Date$ + */ + +#include +#include + +generic module CtpForwardingEngineP() { + provides { + interface Init; + interface StdControl; + interface Send[uint8_t client]; + interface Receive[collection_id_t id]; + interface Receive as Snoop[collection_id_t id]; + interface Intercept[collection_id_t id]; + interface Packet; + interface CollectionPacket; + interface CtpPacket; + interface CtpCongestion; + } + uses { + interface AMSend as SubSend; + interface Receive as SubReceive; + interface Receive as SubSnoop; + interface Packet as SubPacket; + interface UnicastNameFreeRouting; + interface SplitControl as RadioControl; + interface Queue as SendQueue; + interface Pool as QEntryPool; + interface Pool as MessagePool; + interface Timer as RetxmitTimer; + + interface LinkEstimator; + + // Counts down from the last time we heard from our parent; used + // to expire local state about parent congestion. + interface Timer as CongestionTimer; + + interface Cache as SentCache; + interface CtpInfo; + interface PacketAcknowledgements; + interface Random; + interface RootControl; + interface CollectionId[uint8_t client]; + interface AMPacket; + interface CollectionDebug; + interface Leds; + } +} +implementation { + /* Helper functions to start the given timer with a random number + * masked by the given mask and added to the given offset. + */ + static void startRetxmitTimer(uint16_t mask, uint16_t offset); + static void startCongestionTimer(uint16_t mask, uint16_t offset); + + /* Indicates whether our client is congested */ + bool clientCongested = FALSE; + + /* Tracks our parent's congestion state. */ + bool parentCongested = FALSE; + + /* Keeps track of whether the routing layer is running; if not, + * it will not send packets. */ + bool running = FALSE; + + /* Keeps track of whether the radio is on; no sense sending packets + * if the radio is off. */ + bool radioOn = FALSE; + + /* Keeps track of whether an ack is pending on an outgoing packet, + * so that the engine can work unreliably when the data-link layer + * does not support acks. */ + bool ackPending = FALSE; + + /* Keeps track of whether the packet on the head of the queue + * is being used, and control access to the data-link layer.*/ + bool sending = FALSE; + + /* Keep track of the last parent address we sent to, so that + unacked packets to an old parent are not incorrectly attributed + to a new parent. */ + am_addr_t lastParent; + + /* Network-level sequence number, so that receivers + * can distinguish retransmissions from different packets. */ + uint8_t seqno; + + enum { + CLIENT_COUNT = uniqueCount(UQ_CTP_CLIENT) + }; + + /* Each sending client has its own reserved queue entry. + If the client has a packet pending, its queue entry is in the + queue, and its clientPtr is NULL. If the client is idle, + its queue entry is pointed to by clientPtrs. */ + + fe_queue_entry_t clientEntries[CLIENT_COUNT]; + fe_queue_entry_t* clientPtrs[CLIENT_COUNT]; + + /* The loopback message is for when a collection roots calls + Send.send. Since Send passes a pointer but Receive allows + buffer swaps, the forwarder copies the sent packet into + the loopbackMsgPtr and performs a buffer swap with it. + See sendTask(). */ + + message_t loopbackMsg; + message_t* loopbackMsgPtr; + + command error_t Init.init() { + int i; + for (i = 0; i < CLIENT_COUNT; i++) { + clientPtrs[i] = clientEntries + i; + dbg("Forwarder", "clientPtrs[%hhu] = %p\n", i, clientPtrs[i]); + } + loopbackMsgPtr = &loopbackMsg; + lastParent = call AMPacket.address(); + seqno = 0; + return SUCCESS; + } + + command error_t StdControl.start() { + running = TRUE; + return SUCCESS; + } + + command error_t StdControl.stop() { + running = FALSE; + return SUCCESS; + } + + /* sendTask is where the first phase of all send logic + * exists (the second phase is in SubSend.sendDone()). */ + task void sendTask(); + + /* ForwardingEngine keeps track of whether the underlying + radio is powered on. If not, it enqueues packets; + when it turns on, it then starts sending packets. */ + event void RadioControl.startDone(error_t err) { + if (err == SUCCESS) { + radioOn = TRUE; + if (!call SendQueue.empty()) { + post sendTask(); + } + } + } + + /* + * If the ForwardingEngine has stopped sending packets because + * these has been no route, then as soon as one is found, start + * sending packets. + */ + event void UnicastNameFreeRouting.routeFound() { + post sendTask(); + } + + event void UnicastNameFreeRouting.noRoute() { + // Depend on the sendTask to take care of this case; + // if there is no route the component will just resume + // operation on the routeFound event + } + + event void RadioControl.stopDone(error_t err) { + if (err == SUCCESS) { + radioOn = FALSE; + } + } + + ctp_data_header_t* getHeader(message_t* m) { + return (ctp_data_header_t*)call SubPacket.getPayload(m, NULL); + } + + /* + * The send call from a client. Return EBUSY if the client is busy + * (clientPtrs is NULL), otherwise configure its queue entry + * and put it in the send queue. If the ForwardingEngine is not + * already sending packets (the RetxmitTimer isn't running), post + * sendTask. It could be that the engine is running and sendTask + * has already been posted, but the post-once semantics make this + * not matter. + */ + command error_t Send.send[uint8_t client](message_t* msg, uint8_t len) { + ctp_data_header_t* hdr; + fe_queue_entry_t *qe; + dbg("Forwarder", "%s: sending packet from client %hhu: %x, len %hhu\n", __FUNCTION__, client, msg, len); + if (!running) {return EOFF;} + if (len > call Send.maxPayloadLength[client]()) {return ESIZE;} + + call Packet.setPayloadLength(msg, len); + hdr = getHeader(msg); + hdr->origin = TOS_NODE_ID; + hdr->originSeqNo = seqno++; + hdr->type = call CollectionId.fetch[client](); + hdr->thl = 0; + + if (clientPtrs[client] == NULL) { + dbg("Forwarder", "%s: send failed as client is busy.\n", __FUNCTION__); + return EBUSY; + } + + qe = clientPtrs[client]; + qe->msg = msg; + qe->client = client; + qe->retries = MAX_RETRIES; + dbg("Forwarder", "%s: queue entry for %hhu is %hhu deep\n", __FUNCTION__, client, call SendQueue.size()); + if (call SendQueue.enqueue(qe) == SUCCESS) { + if (radioOn && !call RetxmitTimer.isRunning()) { + post sendTask(); + } + clientPtrs[client] = NULL; + return SUCCESS; + } + else { + dbg("Forwarder", + "%s: send failed as packet could not be enqueued.\n", + __FUNCTION__); + + // send a debug message to the uart + call CollectionDebug.logEvent(NET_C_FE_SEND_QUEUE_FULL); + + // Return the pool entry, as it's not for me... + return FAIL; + } + } + + command error_t Send.cancel[uint8_t client](message_t* msg) { + // cancel not implemented. will require being able + // to pull entries out of the queue. + return FAIL; + } + + command uint8_t Send.maxPayloadLength[uint8_t client]() { + return call Packet.maxPayloadLength(); + } + + command void* Send.getPayload[uint8_t client](message_t* msg) { + return call Packet.getPayload(msg, NULL); + } + + /* + * These is where all of the send logic is. When the ForwardingEngine + * wants to send a packet, it posts this task. The send logic is + * independent of whether it is a forwarded packet or a packet from + * a send client. + * + * The task first checks that there is a packet to send and that + * there is a valid route. It then marshals the relevant arguments + * and prepares the packet for sending. If the node is a collection + * root, it signals Receive with the loopback message. Otherwise, + * it sets the packet to be acknowledged and sends it. It does not + * remove the packet from the send queue: while sending, the + * packet being sent is at the head of the queue; a packet is dequeued + * in the sendDone handler, either due to retransmission failure + * or to a successful send. + */ + + task void sendTask() { + dbg("Forwarder", "%s: Trying to send a packet. Queue size is %hhu.\n", __FUNCTION__, call SendQueue.size()); + if (sending) { + dbg("Forwarder", "%s: busy, don't send\n", __FUNCTION__); + call CollectionDebug.logEvent(NET_C_FE_SEND_BUSY); + return; + } + else if (call SendQueue.empty()) { + dbg("Forwarder", "%s: queue empty, don't send\n", __FUNCTION__); + call CollectionDebug.logEvent(NET_C_FE_SENDQUEUE_EMPTY); + return; + } + else if (!call RootControl.isRoot() && + !call UnicastNameFreeRouting.hasRoute()) { + dbg("Forwarder", "%s: no route, don't send, start retry timer\n", __FUNCTION__); + call RetxmitTimer.startOneShot(10000); + + // send a debug message to the uart + call CollectionDebug.logEvent(NET_C_FE_NO_ROUTE); + + return; + } + /* + else if (parentCongested) { + // Do nothing; the congestion timer is necessarily set which + // will clear parentCongested and repost sendTask(). + dbg("Forwarder", "%s: sendTask deferring for congested parent\n", + __FUNCTION__); + call CollectionDebug.logEvent(NET_C_FE_CONGESTION_SENDWAIT); + } + */ + else { + error_t subsendResult; + fe_queue_entry_t* qe = call SendQueue.head(); + uint8_t payloadLen = call SubPacket.payloadLength(qe->msg); + am_addr_t dest = call UnicastNameFreeRouting.nextHop(); + uint16_t gradient; + + if (call CtpInfo.isNeighborCongested(dest)) { + // Our parent is congested. We should wait. + // Don't repost the task, CongestionTimer will do the job + if (! parentCongested ) { + parentCongested = TRUE; + call CollectionDebug.logEvent(NET_C_FE_CONGESTION_BEGIN); + } + if (! call CongestionTimer.isRunning()) { + startCongestionTimer(CONGESTED_WAIT_WINDOW, CONGESTED_WAIT_OFFSET); + } + dbg("Forwarder", "%s: sendTask deferring for congested parent\n", + __FUNCTION__); + //call CollectionDebug.logEvent(NET_C_FE_CONGESTION_SENDWAIT); + return; + } + if (parentCongested) { + parentCongested = FALSE; + call CollectionDebug.logEvent(NET_C_FE_CONGESTION_END); + } + // Once we are here, we have decided to send the packet. + if (call SentCache.lookup(qe->msg)) { + call CollectionDebug.logEvent(NET_C_FE_DUPLICATE_CACHE_AT_SEND); + call SendQueue.dequeue(); + post sendTask(); + return; + } + /* If our current parent is not the same as the last parent + we sent do, then reset the count of unacked packets: don't + penalize a new parent for the failures of a prior one.*/ + if (dest != lastParent) { + qe->retries = MAX_RETRIES; + lastParent = dest; + } + + dbg("Forwarder", "Sending queue entry %p\n", qe); + if (call RootControl.isRoot()) { + collection_id_t collectid = getHeader(qe->msg)->type; + memcpy(loopbackMsgPtr, qe->msg, sizeof(message_t)); + ackPending = FALSE; + + dbg("Forwarder", "%s: I'm a root, so loopback and signal receive.\n", __FUNCTION__); + loopbackMsgPtr = signal Receive.receive[collectid](loopbackMsgPtr, + call Packet.getPayload(loopbackMsgPtr, NULL), + call Packet.payloadLength(loopbackMsgPtr)); + signal SubSend.sendDone(qe->msg, SUCCESS); + return; + } + + // Loop-detection functionality: + if (call CtpInfo.getEtx(&gradient) != SUCCESS) { + // If we have no metric, set our gradient conservatively so + // that other nodes don't automatically drop our packets. + gradient = 0; + } + call CtpPacket.setEtx(qe->msg, gradient); + + ackPending = (call PacketAcknowledgements.requestAck(qe->msg) == SUCCESS); + + // Set or clear the congestion bit on *outgoing* packets. + if (call CtpCongestion.isCongested()) + call CtpPacket.setOption(qe->msg, CTP_OPT_ECN); + else + call CtpPacket.clearOption(qe->msg, CTP_OPT_ECN); + + subsendResult = call SubSend.send(dest, qe->msg, payloadLen); + if (subsendResult == SUCCESS) { + // Successfully submitted to the data-link layer. + sending = TRUE; + dbg("Forwarder", "%s: subsend succeeded with %p.\n", __FUNCTION__, qe->msg); + if (qe->client < CLIENT_COUNT) { + dbg("Forwarder", "%s: client packet.\n", __FUNCTION__); + } + else { + dbg("Forwarder", "%s: forwarded packet.\n", __FUNCTION__); + } + return; + } + else if (subsendResult == EOFF) { + // The radio has been turned off underneath us. Assume that + // this is for the best. When the radio is turned back on, we'll + // handle a startDone event and resume sending. + radioOn = FALSE; + dbg("Forwarder", "%s: subsend failed from EOFF.\n", __FUNCTION__); + // send a debug message to the uart + call CollectionDebug.logEvent(NET_C_FE_SUBSEND_OFF); + } + else if (subsendResult == EBUSY) { + // This shouldn't happen, as we sit on top of a client and + // control our own output; it means we're trying to + // double-send (bug). This means we expect a sendDone, so just + // wait for that: when the sendDone comes in, // we'll try + // sending this packet again. + dbg("Forwarder", "%s: subsend failed from EBUSY.\n", __FUNCTION__); + // send a debug message to the uart + call CollectionDebug.logEvent(NET_C_FE_SUBSEND_BUSY); + } + else if (subsendResult == ESIZE) { + dbg("Forwarder", "%s: subsend failed from ESIZE: truncate packet.\n", __FUNCTION__); + call Packet.setPayloadLength(qe->msg, call Packet.maxPayloadLength()); + post sendTask(); + call CollectionDebug.logEvent(NET_C_FE_SUBSEND_SIZE); + } + } + } + + void sendDoneBug() { + // send a debug message to the uart + call CollectionDebug.logEvent(NET_C_FE_BAD_SENDDONE); + } + + /* + * The second phase of a send operation; based on whether the transmission was + * successful, the ForwardingEngine either stops sending or starts the + * RetxmitTimer with an interval based on what has occured. If the send was + * successful or the maximum number of retransmissions has been reached, then + * the ForwardingEngine dequeues the current packet. If the packet is from a + * client it signals Send.sendDone(); if it is a forwarded packet it returns + * the packet and queue entry to their respective pools. + * + */ + + event void SubSend.sendDone(message_t* msg, error_t error) { + fe_queue_entry_t *qe = call SendQueue.head(); + dbg("Forwarder", "%s to %hu and %hhu\n", __FUNCTION__, call AMPacket.destination(msg), error); + if (qe == NULL || qe->msg != msg) { + dbg("Forwarder", "%s: BUG: not our packet (%p != %p)!\n", __FUNCTION__, msg, qe->msg); + sendDoneBug(); // Not our packet, something is very wrong... + return; + } + else if (error != SUCCESS) { + // Immediate retransmission is the worst thing to do. + dbg("Forwarder", "%s: send failed\n", __FUNCTION__); + call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_FAIL, + call CollectionPacket.getSequenceNumber(msg), + call CollectionPacket.getOrigin(msg), + call AMPacket.destination(msg)); + startRetxmitTimer(SENDDONE_FAIL_WINDOW, SENDDONE_FAIL_OFFSET); + } + else if (ackPending && !call PacketAcknowledgements.wasAcked(msg)) { + // AckPending is for case when DL cannot support acks. + call LinkEstimator.txNoAck(call AMPacket.destination(msg)); + call CtpInfo.recomputeRoutes(); + if (--qe->retries) { + dbg("Forwarder", "%s: not acked\n", __FUNCTION__); + call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_WAITACK, + call CollectionPacket.getSequenceNumber(msg), + call CollectionPacket.getOrigin(msg), + call AMPacket.destination(msg)); + startRetxmitTimer(SENDDONE_NOACK_WINDOW, SENDDONE_NOACK_OFFSET); + } else { + //max retries, dropping packet + if (qe->client < CLIENT_COUNT) { + clientPtrs[qe->client] = qe; + signal Send.sendDone[qe->client](msg, FAIL); + call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_FAIL_ACK_SEND, + call CollectionPacket.getSequenceNumber(msg), + call CollectionPacket.getOrigin(msg), + call AMPacket.destination(msg)); + } else { + if (call MessagePool.put(qe->msg) != SUCCESS) + call CollectionDebug.logEvent(NET_C_FE_PUT_MSGPOOL_ERR); + if (call QEntryPool.put(qe) != SUCCESS) + call CollectionDebug.logEvent(NET_C_FE_PUT_QEPOOL_ERR); + call CollectionDebug.logEventMsg(NET_C_FE_SENDDONE_FAIL_ACK_FWD, + call CollectionPacket.getSequenceNumber(msg), + call CollectionPacket.getOrigin(msg), + call AMPacket.destination(msg)); + } + call SendQueue.dequeue(); + sending = FALSE; + startRetxmitTimer(SENDDONE_OK_WINDOW, SENDDONE_OK_OFFSET); + } + } + else if (qe->client < CLIENT_COUNT) { + ctp_data_header_t* hdr; + uint8_t client = qe->client; + dbg("Forwarder", "%s: our packet for client %hhu, remove %p from queue\n", + __FUNCTION__, client, qe); + call CollectionDebug.logEventMsg(NET_C_FE_SENT_MSG, + call CollectionPacket.getSequenceNumber(msg), + call CollectionPacket.getOrigin(msg), + call AMPacket.destination(msg)); + call LinkEstimator.txAck(call AMPacket.destination(msg)); + clientPtrs[client] = qe; + hdr = getHeader(qe->msg); + call SendQueue.dequeue(); + signal Send.sendDone[client](msg, SUCCESS); + sending = FALSE; + startRetxmitTimer(SENDDONE_OK_WINDOW, SENDDONE_OK_OFFSET); + } + else if (call MessagePool.size() < call MessagePool.maxSize()) { + // A successfully forwarded packet. + dbg("Forwarder,Route", "%s: successfully forwarded packet (client: %hhu), message pool is %hhu/%hhu.\n", __FUNCTION__, qe->client, call MessagePool.size(), call MessagePool.maxSize()); + call CollectionDebug.logEventMsg(NET_C_FE_FWD_MSG, + call CollectionPacket.getSequenceNumber(msg), + call CollectionPacket.getOrigin(msg), + call AMPacket.destination(msg)); + call LinkEstimator.txAck(call AMPacket.destination(msg)); + call SentCache.insert(qe->msg); + call SendQueue.dequeue(); + if (call MessagePool.put(qe->msg) != SUCCESS) + call CollectionDebug.logEvent(NET_C_FE_PUT_MSGPOOL_ERR); + if (call QEntryPool.put(qe) != SUCCESS) + call CollectionDebug.logEvent(NET_C_FE_PUT_QEPOOL_ERR); + sending = FALSE; + startRetxmitTimer(SENDDONE_OK_WINDOW, SENDDONE_OK_OFFSET); + call Leds.led2Toggle(); + } + else { + dbg("Forwarder", "%s: BUG: we have a pool entry, but the pool is full, client is %hhu.\n", __FUNCTION__, qe->client); + sendDoneBug(); // It's a forwarded packet, but there's no room the pool; + // someone has double-stored a pointer somewhere and we have nowhere + // to put this, so we have to leak it... + } + } + + /* + * Function for preparing a packet for forwarding. Performs + * a buffer swap from the message pool. If there are no free + * message in the pool, it returns the passed message and does not + * put it on the send queue. + */ + message_t* forward(message_t* m) { + if (call MessagePool.empty()) { + dbg("Route", "%s cannot forward, message pool empty.\n", __FUNCTION__); + // send a debug message to the uart + call CollectionDebug.logEvent(NET_C_FE_MSG_POOL_EMPTY); + } + else if (call QEntryPool.empty()) { + dbg("Route", "%s cannot forward, queue entry pool empty.\n", + __FUNCTION__); + // send a debug message to the uart + call CollectionDebug.logEvent(NET_C_FE_QENTRY_POOL_EMPTY); + } + else { + message_t* newMsg; + fe_queue_entry_t *qe; + uint16_t gradient; + + qe = call QEntryPool.get(); + if (qe == NULL) { + call CollectionDebug.logEvent(NET_C_FE_GET_MSGPOOL_ERR); + return m; + } + + newMsg = call MessagePool.get(); + if (newMsg == NULL) { + call CollectionDebug.logEvent(NET_C_FE_GET_QEPOOL_ERR); + return m; + } + + memset(newMsg, 0, sizeof(message_t)); + memset(m->metadata, 0, sizeof(message_metadata_t)); + + qe->msg = m; + qe->client = 0xff; + qe->retries = MAX_RETRIES; + + + if (call SendQueue.enqueue(qe) == SUCCESS) { + dbg("Forwarder,Route", "%s forwarding packet %p with queue size %hhu\n", __FUNCTION__, m, call SendQueue.size()); + // Loop-detection code: + if (call CtpInfo.getEtx(&gradient) == SUCCESS) { + // We only check for loops if we know our own metric + if (call CtpPacket.getEtx(m) < gradient) { + // The incoming packet's metric (gradient) is less than our + // own gradient. Trigger a route update and backoff. + call CtpInfo.triggerImmediateRouteUpdate(); + startRetxmitTimer(LOOPY_WINDOW, LOOPY_OFFSET); + call CollectionDebug.logEventMsg(NET_C_FE_LOOP_DETECTED, + call CollectionPacket.getSequenceNumber(m), + call CollectionPacket.getOrigin(m), + call AMPacket.destination(m)); + } + } + + if (!call RetxmitTimer.isRunning()) { + // sendTask is only immediately posted if we don't detect a + // loop. + post sendTask(); + } + + // Successful function exit point: + return newMsg; + } else { + // There was a problem enqueuing to the send queue. + if (call MessagePool.put(newMsg) != SUCCESS) + call CollectionDebug.logEvent(NET_C_FE_PUT_MSGPOOL_ERR); + if (call QEntryPool.put(qe) != SUCCESS) + call CollectionDebug.logEvent(NET_C_FE_PUT_QEPOOL_ERR); + } + } + + // NB: at this point, we have a resource acquistion problem. + // Trigger an immediate route update, log the event, and drop the + // packet on the floor. + call CtpInfo.triggerImmediateRouteUpdate(); + call CollectionDebug.logEvent(NET_C_FE_SEND_QUEUE_FULL); + return m; + } + + /* + * Received a message to forward. Check whether it is a duplicate by + * checking the packets currently in the queue as well as the + * send history cache (in case we recently forwarded this packet). + * The cache is important as nodes immediately forward packets + * but wait a period before retransmitting after an ack failure. + * If this node is a root, signal receive. + */ + event message_t* + SubReceive.receive(message_t* msg, void* payload, uint8_t len) { + uint8_t netlen; + collection_id_t collectid; + bool duplicate = FALSE; + fe_queue_entry_t* qe; + uint8_t i, thl; + + + collectid = call CtpPacket.getType(msg); + + // Update the THL here, since it has lived another hop, and so + // that the root sees the correct THL. + thl = call CtpPacket.getThl(msg); + thl++; + call CtpPacket.setThl(msg, thl); + + call CollectionDebug.logEventMsg(NET_C_FE_RCV_MSG, + call CollectionPacket.getSequenceNumber(msg), + call CollectionPacket.getOrigin(msg), + call AMPacket.destination(msg)); + if (len > call SubSend.maxPayloadLength()) { + return msg; + } + + //See if we remember having seen this packet + //We look in the sent cache ... + if (call SentCache.lookup(msg)) { + call CollectionDebug.logEvent(NET_C_FE_DUPLICATE_CACHE); + return msg; + } + //... and in the queue for duplicates + if (call SendQueue.size() > 0) { + for (i = call SendQueue.size(); --i;) { + qe = call SendQueue.element(i); + if (call CtpPacket.matchInstance(qe->msg, msg)) { + duplicate = TRUE; + break; + } + } + } + + if (duplicate) { + call CollectionDebug.logEvent(NET_C_FE_DUPLICATE_QUEUE); + return msg; + } + + // If I'm the root, signal receive. + else if (call RootControl.isRoot()) + return signal Receive.receive[collectid](msg, + call Packet.getPayload(msg, &netlen), + call Packet.payloadLength(msg)); + // I'm on the routing path and Intercept indicates that I + // should not forward the packet. + else if (!signal Intercept.forward[collectid](msg, + call Packet.getPayload(msg, &netlen), + call Packet.payloadLength(msg))) + return msg; + else { + dbg("Route", "Forwarding packet from %hu.\n", getHeader(msg)->origin); + return forward(msg); + } + } + + command void* + Receive.getPayload[collection_id_t id](message_t* msg, uint8_t* len) { + return call Packet.getPayload(msg, NULL); + } + + command uint8_t + Receive.payloadLength[collection_id_t id](message_t *msg) { + return call Packet.payloadLength(msg); + } + + command void * + Snoop.getPayload[collection_id_t id](message_t *msg, uint8_t *len) { + return call Packet.getPayload(msg, NULL); + } + + command uint8_t Snoop.payloadLength[collection_id_t id](message_t *msg) { + return call Packet.payloadLength(msg); + } + + event message_t* + SubSnoop.receive(message_t* msg, void *payload, uint8_t len) { + //am_addr_t parent = call UnicastNameFreeRouting.nextHop(); + am_addr_t proximalSrc = call AMPacket.source(msg); + + // Check for the pull bit (P) [TEP123] and act accordingly. This + // check is made for all packets, not just ones addressed to us. + if (call CtpPacket.option(msg, CTP_OPT_PULL)) + call CtpInfo.triggerRouteUpdate(); + + call CtpInfo.setNeighborCongested(proximalSrc, call CtpPacket.option(msg, CTP_OPT_ECN)); + return signal Snoop.receive[call CtpPacket.getType(msg)] + (msg, payload + sizeof(ctp_data_header_t), + len - sizeof(ctp_data_header_t)); + } + + event void RetxmitTimer.fired() { + sending = FALSE; + post sendTask(); + } + + event void CongestionTimer.fired() { + //parentCongested = FALSE; + //call CollectionDebug.logEventSimple(NET_C_FE_CONGESTION_END, 0); + post sendTask(); + } + + + command bool CtpCongestion.isCongested() { + // A simple predicate for now to determine congestion state of + // this node. + bool congested = (call SendQueue.size() + 2 >= call SendQueue.maxSize()) ? + TRUE : FALSE; + return ((congested || clientCongested)?TRUE:FALSE); + } + + command void CtpCongestion.setClientCongested(bool congested) { + bool wasCongested = call CtpCongestion.isCongested(); + clientCongested = congested; + if (!wasCongested && congested) { + call CtpInfo.triggerImmediateRouteUpdate(); + } else if (wasCongested && ! (call CtpCongestion.isCongested())) { + call CtpInfo.triggerRouteUpdate(); + } + } + + command void Packet.clear(message_t* msg) { + call SubPacket.clear(msg); + } + + command uint8_t Packet.payloadLength(message_t* msg) { + return call SubPacket.payloadLength(msg) - sizeof(ctp_data_header_t); + } + + command void Packet.setPayloadLength(message_t* msg, uint8_t len) { + call SubPacket.setPayloadLength(msg, len + sizeof(ctp_data_header_t)); + } + + command uint8_t Packet.maxPayloadLength() { + return call SubPacket.maxPayloadLength() - sizeof(ctp_data_header_t); + } + + command void* Packet.getPayload(message_t* msg, uint8_t* len) { + uint8_t* payload = call SubPacket.getPayload(msg, len); + if (len != NULL) { + *len -= sizeof(ctp_data_header_t); + } + return payload + sizeof(ctp_data_header_t); + } + + command am_addr_t CollectionPacket.getOrigin(message_t* msg) {return getHeader(msg)->origin;} + + command collection_id_t CollectionPacket.getType(message_t* msg) {return getHeader(msg)->type;} + command uint8_t CollectionPacket.getSequenceNumber(message_t* msg) {return getHeader(msg)->originSeqNo;} + command void CollectionPacket.setOrigin(message_t* msg, am_addr_t addr) {getHeader(msg)->origin = addr;} + command void CollectionPacket.setType(message_t* msg, collection_id_t id) {getHeader(msg)->type = id;} + command void CollectionPacket.setSequenceNumber(message_t* msg, uint8_t _seqno) {getHeader(msg)->originSeqNo = _seqno;} + + //command ctp_options_t CtpPacket.getOptions(message_t* msg) {return getHeader(msg)->options;} + + command uint8_t CtpPacket.getType(message_t* msg) {return getHeader(msg)->type;} + command am_addr_t CtpPacket.getOrigin(message_t* msg) {return getHeader(msg)->origin;} + command uint16_t CtpPacket.getEtx(message_t* msg) {return getHeader(msg)->etx;} + command uint8_t CtpPacket.getSequenceNumber(message_t* msg) {return getHeader(msg)->originSeqNo;} + command uint8_t CtpPacket.getThl(message_t* msg) {return getHeader(msg)->thl;} + + command void CtpPacket.setThl(message_t* msg, uint8_t thl) {getHeader(msg)->thl = thl;} + command void CtpPacket.setOrigin(message_t* msg, am_addr_t addr) {getHeader(msg)->origin = addr;} + command void CtpPacket.setType(message_t* msg, uint8_t id) {getHeader(msg)->type = id;} + + command bool CtpPacket.option(message_t* msg, ctp_options_t opt) { + return ((getHeader(msg)->options & opt) == opt) ? TRUE : FALSE; + } + + command void CtpPacket.setOption(message_t* msg, ctp_options_t opt) { + getHeader(msg)->options |= opt; + } + + command void CtpPacket.clearOption(message_t* msg, ctp_options_t opt) { + getHeader(msg)->options &= ~opt; + } + + command void CtpPacket.setEtx(message_t* msg, uint16_t e) {getHeader(msg)->etx = e;} + command void CtpPacket.setSequenceNumber(message_t* msg, uint8_t _seqno) {getHeader(msg)->originSeqNo = _seqno;} + + // A CTP packet ID is based on the origin and the THL field, to + // implement duplicate suppression as described in TEP 123. + + command bool CtpPacket.matchInstance(message_t* m1, message_t* m2) { + return (call CtpPacket.getOrigin(m1) == call CtpPacket.getOrigin(m2) && + call CtpPacket.getSequenceNumber(m1) == call CtpPacket.getSequenceNumber(m2) && + call CtpPacket.getThl(m1) == call CtpPacket.getThl(m2) && + call CtpPacket.getType(m1) == call CtpPacket.getType(m2)); + } + + command bool CtpPacket.matchPacket(message_t* m1, message_t* m2) { + return (call CtpPacket.getOrigin(m1) == call CtpPacket.getOrigin(m2) && + call CtpPacket.getSequenceNumber(m1) == call CtpPacket.getSequenceNumber(m2) && + call CtpPacket.getType(m1) == call CtpPacket.getType(m2)); + } + + default event void + Send.sendDone[uint8_t client](message_t *msg, error_t error) { + } + + default event bool + Intercept.forward[collection_id_t collectid](message_t* msg, void* payload, + uint16_t len) { + return TRUE; + } + + default event message_t * + Receive.receive[collection_id_t collectid](message_t *msg, void *payload, + uint8_t len) { + return msg; + } + + default event message_t * + Snoop.receive[collection_id_t collectid](message_t *msg, void *payload, + uint8_t len) { + return msg; + } + + default command collection_id_t CollectionId.fetch[uint8_t client]() { + return 0; + } + + static void startRetxmitTimer(uint16_t mask, uint16_t offset) { + uint16_t r = call Random.rand16(); + r &= mask; + r += offset; + call RetxmitTimer.startOneShot(r); + dbg("Forwarder", "Rexmit timer will fire in %hu ms\n", r); + } + + static void startCongestionTimer(uint16_t mask, uint16_t offset) { + uint16_t r = call Random.rand16(); + r &= mask; + r += offset; + call CongestionTimer.startOneShot(r); + dbg("Forwarder", "Congestion timer will fire in %hu ms\n", r); + } + + /* signalled when this neighbor is evicted from the neighbor table */ + event void LinkEstimator.evicted(am_addr_t neighbor) { + } + + + /* Default implementations for CollectionDebug calls. + * These allow CollectionDebug not to be wired to anything if debugging + * is not desired. */ + + default command error_t CollectionDebug.logEvent(uint8_t type) { + return SUCCESS; + } + default command error_t CollectionDebug.logEventSimple(uint8_t type, uint16_t arg) { + return SUCCESS; + } + default command error_t CollectionDebug.logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3) { + return SUCCESS; + } + default command error_t CollectionDebug.logEventMsg(uint8_t type, uint16_t msg, am_addr_t origin, am_addr_t node) { + return SUCCESS; + } + default command error_t CollectionDebug.logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t metric) { + return SUCCESS; + } + +} + +/* Rodrigo. This is an alternative + event void CtpInfo.ParentCongested(bool congested) { + if (congested) { + // We've overheard our parent's ECN bit set. + startCongestionTimer(CONGESTED_WAIT_WINDOW, CONGESTED_WAIT_OFFSET); + parentCongested = TRUE; + call CollectionDebug.logEvent(NET_C_FE_CONGESTION_BEGIN); + } else { + // We've overheard our parent's ECN bit cleared. + call CongestionTimer.stop(); + parentCongested = FALSE; + call CollectionDebug.logEventSimple(NET_C_FE_CONGESTION_END, 1); + post sendTask(); + } + } +*/ + diff --git a/tos/lib/net/ctp/CtpInfo.nc b/tos/lib/net/ctp/CtpInfo.nc new file mode 100644 index 00000000..57c275ef --- /dev/null +++ b/tos/lib/net/ctp/CtpInfo.nc @@ -0,0 +1,86 @@ +/* $Id$ */ +/* + * "Copyright (c) 2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ + +/* + * @author Rodrigo Fonseca + * @author Philip Levis + * @date $Date$ + * @see Net2-WG + */ + + +interface CtpInfo { + + /** + * Get the parent of the node in the tree. The pointer is allocated + * by the caller. If the parent is invalid, return FAIL. The + * caller MUST NOT use the value in parent if the return is not + * SUCCESS. + */ + + command error_t getParent(am_addr_t* parent); + + /** + * Get the path quality metric for the current path to the root + * through the current parent. The pointer is allocated by the + * caller. If the parent is invalid, return FAIL (no info). The + * caller MUST NOT use the value in parent if the return is not + * SUCCESS. + */ + + command error_t getEtx(uint16_t* etx); + + /** + * This informs the routing engine that sending a beacon soon is + * advisable, e.g., in response to a pull bit. + */ + + command void triggerRouteUpdate(); + + /** + * This informs the routing engine that sending a beacon as soon + * as possible is advisable, e.g., due to queue overflow or + * a detected loop. + */ + command void triggerImmediateRouteUpdate(); + + /** + * Tell the routing engine it might want to recompute its routes. + */ + command void recomputeRoutes(); + + /** + * Informs the routing engine that a neighbor is congested + */ + command void setNeighborCongested(am_addr_t n, bool congested); + + /** + * Returns the currently known state about a neighbor's congestion state + */ + command bool isNeighborCongested(am_addr_t n); + + command uint8_t numNeighbors(); + command uint16_t getNeighborLinkQuality(uint8_t neighbor); + command uint16_t getNeighborRouteQuality(uint8_t neighbor); + command am_addr_t getNeighborAddr(uint8_t neighbor); +} diff --git a/tos/lib/net/ctp/CtpP.nc b/tos/lib/net/ctp/CtpP.nc new file mode 100644 index 00000000..7f73f447 --- /dev/null +++ b/tos/lib/net/ctp/CtpP.nc @@ -0,0 +1,185 @@ +/* + * "Copyright (c) 2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "Ctp.h" + +/** + * A data collection service that uses a tree routing protocol + * to deliver data to collection roots, following TEP 119. + * + * @author Rodrigo Fonseca + * @author Omprakash Gnawali + * @author Kyle Jamieson + * @author Philip Levis + */ + + +configuration CtpP { + provides { + interface StdControl; + interface Send[uint8_t client]; + interface Receive[collection_id_t id]; + interface Receive as Snoop[collection_id_t]; + interface Intercept[collection_id_t id]; + + interface Packet; + interface CollectionPacket; + interface CtpPacket; + + interface CtpInfo; + interface LinkEstimator; + interface CtpCongestion; + interface RootControl; + } + + uses { + interface CollectionId[uint8_t client]; + interface CollectionDebug; + } +} + +implementation { + enum { + CLIENT_COUNT = uniqueCount(UQ_CTP_CLIENT), + FORWARD_COUNT = 5, + TREE_ROUTING_TABLE_SIZE = 10, + QUEUE_SIZE = CLIENT_COUNT + FORWARD_COUNT, + CACHE_SIZE = 4, + }; + + components ActiveMessageC; + components new CtpForwardingEngineP() as Forwarder; + components MainC, LedsC; + + Send = Forwarder; + StdControl = Forwarder; + Receive = Forwarder.Receive; + Snoop = Forwarder.Snoop; + Intercept = Forwarder; + Packet = Forwarder; + CollectionId = Forwarder; + CollectionPacket = Forwarder; + CtpPacket = Forwarder; + CtpCongestion = Forwarder; + + components new PoolC(message_t, FORWARD_COUNT) as MessagePoolP; + components new PoolC(fe_queue_entry_t, FORWARD_COUNT) as QEntryPoolP; + Forwarder.QEntryPool -> QEntryPoolP; + Forwarder.MessagePool -> MessagePoolP; + + components new QueueC(fe_queue_entry_t*, QUEUE_SIZE) as SendQueueP; + Forwarder.SendQueue -> SendQueueP; + + components new LruCtpMsgCacheC(CACHE_SIZE) as SentCacheP; + Forwarder.SentCache -> SentCacheP; + + components new TimerMilliC() as RoutingBeaconTimer; + components new TimerMilliC() as RouteUpdateTimer; + components LinkEstimatorP as Estimator; + Forwarder.LinkEstimator -> Estimator; + + components new AMSenderC(AM_CTP_DATA); + components new AMReceiverC(AM_CTP_DATA); + components new AMSnooperC(AM_CTP_DATA); + + components new CtpRoutingEngineP(TREE_ROUTING_TABLE_SIZE, 1, 1024) as Router; + StdControl = Router; + StdControl = Estimator; + RootControl = Router; + MainC.SoftwareInit -> Router; + Router.BeaconSend -> Estimator.Send; + Router.BeaconReceive -> Estimator.Receive; + Router.LinkEstimator -> Estimator.LinkEstimator; + Router.LinkSrcPacket -> Estimator.LinkSrcPacket; + Router.AMPacket -> ActiveMessageC; + Router.RadioControl -> ActiveMessageC; + Router.BeaconTimer -> RoutingBeaconTimer; + Router.RouteTimer -> RouteUpdateTimer; + Router.CollectionDebug = CollectionDebug; + Forwarder.CollectionDebug = CollectionDebug; + Forwarder.CtpInfo -> Router; + Router.CtpCongestion -> Forwarder; + CtpInfo = Router; + + components new TimerMilliC() as RetxmitTimer; + Forwarder.RetxmitTimer -> RetxmitTimer; + + components new TimerMilliC() as CongestionTimer; + Forwarder.CongestionTimer -> CongestionTimer; + + components RandomC; + Router.Random -> RandomC; + Forwarder.Random -> RandomC; + + MainC.SoftwareInit -> Forwarder; + Forwarder.SubSend -> AMSenderC; + Forwarder.SubReceive -> AMReceiverC; + Forwarder.SubSnoop -> AMSnooperC; + Forwarder.SubPacket -> AMSenderC; + Forwarder.RootControl -> Router; + Forwarder.UnicastNameFreeRouting -> Router.Routing; + Forwarder.RadioControl -> ActiveMessageC; + Forwarder.PacketAcknowledgements -> AMSenderC.Acks; + Forwarder.AMPacket -> AMSenderC; + Forwarder.Leds -> LedsC; + + components new AMSenderC(AM_CTP_ROUTING) as SendControl; + components new AMReceiverC(AM_CTP_ROUTING) as ReceiveControl; + + LinkEstimator = Estimator; + + Estimator.AMSend -> SendControl; + Estimator.SubReceive -> ReceiveControl; + Estimator.SubPacket -> SendControl; + Estimator.SubAMPacket -> SendControl; + MainC.SoftwareInit -> Estimator; +} diff --git a/tos/lib/net/ctp/CtpPacket.nc b/tos/lib/net/ctp/CtpPacket.nc new file mode 100644 index 00000000..41c24025 --- /dev/null +++ b/tos/lib/net/ctp/CtpPacket.nc @@ -0,0 +1,70 @@ +/* $Id$ */ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * ADT for CTP data frames. + * + * @author Philip Levis + * @author Kyle Jamieson + * @date $Date$ + */ + +#include + +interface CtpPacket { + // Sets the given options bit. + command void setOption(message_t* msg, ctp_options_t option); + + // Clears the given options bit. + command void clearOption(message_t* msg, ctp_options_t option); + + // Returns TRUE iff all of the given options bits are set. + command bool option(message_t* msg, ctp_options_t opt); + + command uint8_t getThl(message_t* msg); + command void setThl(message_t* msg, uint8_t thl); + + command uint16_t getEtx(message_t* msg); + command void setEtx(message_t* msg, uint16_t etx); + + command am_addr_t getOrigin(message_t* msg); + command void setOrigin(message_t* msg, am_addr_t addr); + + command uint8_t getSequenceNumber(message_t* msg); + command void setSequenceNumber(message_t* msg, uint8_t seqno); + + command uint8_t getType(message_t* msg); + command void setType(message_t* msg, uint8_t id); + + command bool matchInstance(message_t* m1, message_t* m2); + command bool matchPacket(message_t* m1, message_t* m2); +} diff --git a/tos/lib/net/ctp/CtpRoutingEngineP.nc b/tos/lib/net/ctp/CtpRoutingEngineP.nc new file mode 100644 index 00000000..0044233b --- /dev/null +++ b/tos/lib/net/ctp/CtpRoutingEngineP.nc @@ -0,0 +1,780 @@ +#include +#include +#include +/* $Id$ */ +/* + * "Copyright (c) 2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ + +/** + * The TreeRoutingEngine is responsible for computing the routes for + * collection. It builds a set of trees rooted at specific nodes (roots) and + * maintains these trees using information provided by the link estimator on + * the quality of one hop links. + * + *

    Each node is part of only one tree at any given time, but there is no + * difference from the node's point of view of which tree it is part. In other + * words, a message is sent towards a root, but which one is not + * specified. It is assumed that the roots will work together to have all data + * aggregated later if need be. The tree routing engine's responsibility is + * for each node to find the path with the least number of transmissions to + * any one root. + * + *

    The tree is proactively maintained by periodic beacons sent by each + * node. These beacons are jittered in time to prevent synchronizations in the + * network. All nodes maintain the same average beacon sending rate + * (defined by BEACON_INTERVAL +- 50%). The beacon contains the node's parent, + * the current hopcount, and the cumulative path quality metric. The metric is + * defined as the parent's metric plus the bidirectional quality of the link + * between the current node and its parent. The metric represents the + * expected number of transmissions along the path to the root, and is 0 by + * definition at the root. + * + *

    Every time a node receives an update from a neighbor it records the + * information if the node is part of the neighbor table. The neighbor table + * keeps the best candidates for being parents i.e., the nodes with the best + * path metric. The neighbor table does not store the full path metric, + * though. It stores the parent's path metric, and the link quality to the + * parent is only added when the information is needed: (i) when choosing a + * parent and (ii) when choosing a route. The nodes in the neighbor table are + * a subset of the nodes in the link estimator table, as a node is not + * admitted in the neighbor table with an estimate of infinity. + * + *

    There are two uses for the neighbor table, as mentioned above. The first + * one is to select a parent. The parent is just the neighbor with the best + * path metric. It serves to define the node's own path metric and hopcount, + * and the set of child-parent links is what defines the tree. In a sense the + * tree is defined to form a coherent propagation substrate for the path + * metrics. The parent is (re)-selected periodically, immediately before a + * node sends its own beacon, in the updateRouteTask. + * + *

    The second use is to actually choose a next hop towards any root at + * message forwarding time. This need not be the current parent, even though + * it is currently implemented as such. + * + *

    The operation of the routing engine has two main tasks and one main + * event: updateRouteTask is called periodically and chooses a new parent; + * sendBeaconTask broadcasts the current route information to the neighbors. + * The main event is the receiving of a neighbor's beacon, which updates the + * neighbor table. + * + *

    The interface with the ForwardingEngine occurs through the nextHop() + * call. + * + *

    Any node can become a root, and routed messages from a subset of the + * network will be routed towards it. The RootControl interface allows + * setting, unsetting, and querying the root state of a node. By convention, + * when a node is root its hopcount and metric are 0, and the parent is + * itself. A root always has a valid route, to itself. + * + * @author Rodrigo Fonseca + * @author Philip Levis (added trickle-like updates) + * Acknowledgment: based on MintRoute, MultiHopLQI, BVR tree construction, Berkeley's MTree + * + * @date $Date$ + * @see Net2-WG + */ + +generic module CtpRoutingEngineP(uint8_t routingTableSize, uint16_t minInterval, uint16_t maxInterval) { + provides { + interface UnicastNameFreeRouting as Routing; + interface RootControl; + interface CtpInfo; + interface StdControl; + interface CtpRoutingPacket; + interface Init; + } + uses { + interface AMSend as BeaconSend; + interface Receive as BeaconReceive; + interface LinkEstimator; + interface AMPacket; + interface LinkSrcPacket; + interface SplitControl as RadioControl; + interface Timer as BeaconTimer; + interface Timer as RouteTimer; + interface Random; + interface CollectionDebug; + interface CtpCongestion; + } +} + + +implementation { + + bool ECNOff = TRUE; + + /* Keeps track of whether the radio is on. No sense updating or sending + * beacons if radio is off */ + bool radioOn = FALSE; + /* Controls whether the node's periodic timer will fire. The node will not + * send any beacon, and will not update the route. Start and stop control this. */ + bool running = FALSE; + /* Guards the beacon buffer: only one beacon being sent at a time */ + bool sending = FALSE; + + /* Tells updateNeighbor that the parent was just evicted.*/ + bool justEvicted = FALSE; + + route_info_t routeInfo; + bool state_is_root; + am_addr_t my_ll_addr; + + message_t beaconMsgBuffer; + ctp_routing_header_t* beaconMsg; + + /* routing table -- routing info about neighbors */ + routing_table_entry routingTable[routingTableSize]; + uint8_t routingTableActive; + + /* statistics */ + uint32_t parentChanges; + /* end statistics */ + + uint32_t routeUpdateTimerCount; + + // Maximimum it takes to hear four beacons + enum { + DEATH_TEST_INTERVAL = (maxInterval * 4) / (BEACON_INTERVAL / 1024), + }; + + // forward declarations + void routingTableInit(); + uint8_t routingTableFind(am_addr_t); + error_t routingTableUpdateEntry(am_addr_t, am_addr_t , uint16_t); + error_t routingTableEvict(am_addr_t neighbor); + + uint16_t currentInterval = minInterval; + uint32_t t; + bool tHasPassed; + + void chooseAdvertiseTime() { + t = currentInterval; + t *= 512; // * 1024 / 2 + t += call Random.rand32() % t; + tHasPassed = FALSE; + call BeaconTimer.stop(); + call BeaconTimer.startOneShot(t); + } + + void resetInterval() { + currentInterval = minInterval; + chooseAdvertiseTime(); + } + + void decayInterval() { + if (!state_is_root) { + currentInterval *= 2; + if (currentInterval > maxInterval) { + currentInterval = maxInterval; + } + } + chooseAdvertiseTime(); + } + + void remainingInterval() { + uint32_t remaining = currentInterval; + remaining *= 1024; + remaining -= t; + tHasPassed = TRUE; + call BeaconTimer.startPeriodic(t); + } + + command error_t Init.init() { + uint8_t maxLength; + routeUpdateTimerCount = 0; + radioOn = FALSE; + running = FALSE; + parentChanges = 0; + state_is_root = 0; + routeInfoInit(&routeInfo); + routingTableInit(); + my_ll_addr = call AMPacket.address(); + beaconMsg = call BeaconSend.getPayload(&beaconMsgBuffer); + maxLength = call BeaconSend.maxPayloadLength(); + dbg("TreeRoutingCtl","TreeRouting initialized. (used payload:%d max payload:%d!\n", + sizeof(beaconMsg), maxLength); + return SUCCESS; + } + + command error_t StdControl.start() { + //start will (re)start the sending of messages + if (!running) { + running = TRUE; + resetInterval(); + call RouteTimer.startPeriodic(BEACON_INTERVAL); + dbg("TreeRoutingCtl","%s running: %d radioOn: %d\n", __FUNCTION__, running, radioOn); + } + return SUCCESS; + } + + command error_t StdControl.stop() { + running = FALSE; + dbg("TreeRoutingCtl","%s running: %d radioOn: %d\n", __FUNCTION__, running, radioOn); + return SUCCESS; + } + + event void RadioControl.startDone(error_t error) { + radioOn = TRUE; + dbg("TreeRoutingCtl","%s running: %d radioOn: %d\n", __FUNCTION__, running, radioOn); + if (running) { + uint16_t nextInt; + nextInt = call Random.rand16() % BEACON_INTERVAL; + nextInt += BEACON_INTERVAL >> 1; + call BeaconTimer.startOneShot(nextInt); + } + } + + event void RadioControl.stopDone(error_t error) { + radioOn = FALSE; + dbg("TreeRoutingCtl","%s running: %d radioOn: %d\n", __FUNCTION__, running, radioOn); + } + + /* Is this quality measure better than the minimum threshold? */ + // Implemented assuming quality is EETX + bool passLinkEtxThreshold(uint16_t etx) { + return TRUE; + return (etx < ETX_THRESHOLD); + } + + /* Converts the output of the link estimator to path metric + * units, that can be *added* to form path metric measures */ + uint16_t evaluateEtx(uint8_t quality) { + //dbg("TreeRouting","%s %d -> %d\n",__FUNCTION__,quality, quality+10); + return (quality + 10); + } + + /* updates the routing information, using the info that has been received + * from neighbor beacons. Two things can cause this info to change: + * neighbor beacons, changes in link estimates, including neighbor eviction */ + /* TODO: take into account congested state to select parents */ + task void updateRouteTask() { + uint8_t i; + routing_table_entry* entry; + routing_table_entry* best; + uint16_t minEtx; + uint16_t currentEtx; + uint16_t linkEtx, pathEtx; + + if (state_is_root) + return; + + best = NULL; + /* Minimum etx found among neighbors, initially infinity */ + minEtx = MAX_METRIC; + /* Metric through current parent, initially infinity */ + currentEtx = MAX_METRIC; + + dbg("TreeRouting","%s\n",__FUNCTION__); + + /* Find best path in table, other than our current */ + for (i = 0; i < routingTableActive; i++) { + entry = &routingTable[i]; + + // Avoid bad entries and 1-hop loops + if (entry->info.parent == INVALID_ADDR || entry->info.parent == my_ll_addr) { + dbg("TreeRouting", + "routingTable[%d]: neighbor: [id: %d parent: %d etx: NO ROUTE]\n", + i, entry->neighbor, entry->info.parent); + continue; + } + /* Compute this neighbor's path metric */ + linkEtx = evaluateEtx(call LinkEstimator.getLinkQuality(entry->neighbor)); + dbg("TreeRouting", + "routingTable[%d]: neighbor: [id: %d parent: %d etx: %d]\n", + i, entry->neighbor, entry->info.parent, linkEtx); + pathEtx = linkEtx + entry->info.etx; + /* Operations specific to the current parent */ + if (entry->neighbor == routeInfo.parent) { + dbg("TreeRouting", " already parent.\n"); + currentEtx = pathEtx; + /* update routeInfo with parent's current info */ + atomic { + routeInfo.etx = entry->info.etx; + routeInfo.congested = entry->info.congested; + } + continue; + } + /* Ignore links that are bad */ + if (!passLinkEtxThreshold(linkEtx)) { + dbg("TreeRouting", " did not pass threshold.\n"); + continue; + } + + if (pathEtx < minEtx) { + minEtx = pathEtx; + best = entry; + } + } + + //call CollectionDebug.logEventDbg(NET_C_DBG_3, routeInfo.parent, currentEtx, minEtx); + + /* Now choose between the current parent and the best neighbor */ + if (minEtx != MAX_METRIC) { + if (currentEtx == MAX_METRIC || + minEtx + PARENT_SWITCH_THRESHOLD < currentEtx) { + // routeInfo.metric will not store the composed metric. + // since the linkMetric may change, we will compose whenever + // we need it: i. when choosing a parent (here); + // ii. when choosing a next hop + parentChanges++; + resetInterval(); + dbg("TreeRouting","Changed parent. from %d to %d\n", routeInfo.parent, best->neighbor); + call CollectionDebug.logEventRoute(NET_C_TREE_NEW_PARENT, best->neighbor, 0, best->info.etx); + call LinkEstimator.unpinNeighbor(routeInfo.parent); + call LinkEstimator.pinNeighbor(best->neighbor); + call LinkEstimator.clearDLQ(best->neighbor); + atomic { + routeInfo.parent = best->neighbor; + routeInfo.etx = best->info.etx; + routeInfo.congested = best->info.congested; + } + } + } + + /* Finally, tell people what happened: */ + /* We can only loose a route to a parent if it has been evicted. If it hasn't + * been just evicted then we already did not have a route */ + if (justEvicted && routeInfo.parent == INVALID_ADDR) + signal Routing.noRoute(); + /* On the other hand, if we didn't have a parent (no currentEtx) and now we + * do, then we signal route found. The exception is if we just evicted the + * parent and immediately found a replacement route: we don't signal in this + * case */ + else if (!justEvicted && + currentEtx == MAX_METRIC && + minEtx != MAX_METRIC) + signal Routing.routeFound(); + justEvicted = FALSE; + } + + + + /* send a beacon advertising this node's routeInfo */ + // only posted if running and radioOn + task void sendBeaconTask() { + error_t eval; + if (sending) { + return; + } + + beaconMsg->options = 0; + + /* Congestion notification: am I congested? */ + if (call CtpCongestion.isCongested()) { + beaconMsg->options |= CTP_OPT_ECN; + } + + beaconMsg->parent = routeInfo.parent; + if (state_is_root) { + beaconMsg->etx = routeInfo.etx; + } + else if (routeInfo.parent == INVALID_ADDR) { + beaconMsg->etx = routeInfo.etx; + beaconMsg->options |= CTP_OPT_PULL; + } else { + beaconMsg->etx = routeInfo.etx + + evaluateEtx(call LinkEstimator.getLinkQuality(routeInfo.parent)); + } + + dbg("TreeRouting", "%s parent: %d etx: %d\n", + __FUNCTION__, + beaconMsg->parent, + beaconMsg->etx); + call CollectionDebug.logEventRoute(NET_C_TREE_SENT_BEACON, beaconMsg->parent, 0, beaconMsg->etx); + + eval = call BeaconSend.send(AM_BROADCAST_ADDR, + &beaconMsgBuffer, + sizeof(ctp_routing_header_t)); + if (eval == SUCCESS) { + sending = TRUE; + } else if (eval == EOFF) { + radioOn = FALSE; + dbg("TreeRoutingCtl","%s running: %d radioOn: %d\n", __FUNCTION__, running, radioOn); + } + } + + event void BeaconSend.sendDone(message_t* msg, error_t error) { + if ((msg != &beaconMsgBuffer) || !sending) { + //something smells bad around here + return; + } + sending = FALSE; + } + + event void RouteTimer.fired() { + if (radioOn && running) { + post updateRouteTask(); + } + } + + event void BeaconTimer.fired() { + if (radioOn && running) { + if (!tHasPassed) { + post updateRouteTask(); //always send the most up to date info + post sendBeaconTask(); + dbg("RoutingTimer", "Beacon timer fired at %s\n", sim_time_string()); + remainingInterval(); + } + else { + decayInterval(); + } + } + } + + + ctp_routing_header_t* getHeader(message_t* m) { + return (ctp_routing_header_t*)call BeaconReceive.getPayload(m, NULL); + } + + + /* Handle the receiving of beacon messages from the neighbors. We update the + * table, but wait for the next route update to choose a new parent */ + event message_t* BeaconReceive.receive(message_t* msg, void* payload, uint8_t len) { + am_addr_t from; + ctp_routing_header_t* rcvBeacon; + bool congested; + + // Received a beacon, but it's not from us. + if (len != sizeof(ctp_routing_header_t)) { + dbg("LITest", "%s, received beacon of size %hhu, expected %i\n", + __FUNCTION__, + len, + (int)sizeof(ctp_routing_header_t)); + + return msg; + } + + //need to get the am_addr_t of the source + from = call LinkSrcPacket.getSrc(msg); + rcvBeacon = (ctp_routing_header_t*)payload; + congested = call CtpRoutingPacket.getOption(msg, CTP_OPT_ECN); + + dbg("TreeRouting","%s from: %d [ parent: %d etx: %d]\n", + __FUNCTION__, from, + rcvBeacon->parent, rcvBeacon->etx); + //call CollectionDebug.logEventRoute(NET_C_TREE_RCV_BEACON, rcvBeacon->parent, 0, rcvBeacon->etx); + + //update neighbor table + if (rcvBeacon->parent != INVALID_ADDR) { + + /* If this node is a root, request a forced insert in the link + * estimator table and pin the node. */ + if (rcvBeacon->etx == 0) { + dbg("TreeRouting","from a root, inserting if not in table\n"); + call LinkEstimator.insertNeighbor(from); + call LinkEstimator.pinNeighbor(from); + } + //TODO: also, if better than my current parent's path etx, insert + + routingTableUpdateEntry(from, rcvBeacon->parent, rcvBeacon->etx); + call CtpInfo.setNeighborCongested(from, congested); + } + + if (call CtpRoutingPacket.getOption(msg, CTP_OPT_PULL)) { + resetInterval(); + } + //post updateRouteTask(); + return msg; + } + + /* Signals that a neighbor is no longer reachable. need special care if + * that neighbor is our parent */ + event void LinkEstimator.evicted(am_addr_t neighbor) { + routingTableEvict(neighbor); + dbg("TreeRouting","%s\n",__FUNCTION__); + if (routeInfo.parent == neighbor) { + routeInfoInit(&routeInfo); + justEvicted = TRUE; + post updateRouteTask(); + } + } + + /* Interface UnicastNameFreeRouting */ + /* Simple implementation: return the current routeInfo */ + command am_addr_t Routing.nextHop() { + return routeInfo.parent; + } + command bool Routing.hasRoute() { + return (routeInfo.parent != INVALID_ADDR); + } + + /* CtpInfo interface */ + command error_t CtpInfo.getParent(am_addr_t* parent) { + if (parent == NULL) + return FAIL; + if (routeInfo.parent == INVALID_ADDR) + return FAIL; + *parent = routeInfo.parent; + return SUCCESS; + } + + command error_t CtpInfo.getEtx(uint16_t* etx) { + if (etx == NULL) + return FAIL; + if (routeInfo.parent == INVALID_ADDR) + return FAIL; + *etx = routeInfo.etx; + return SUCCESS; + } + + command void CtpInfo.recomputeRoutes() { + post updateRouteTask(); + } + + command void CtpInfo.triggerRouteUpdate() { + // Random time in interval 64-127ms + uint16_t time = call Random.rand16(); + time &= 0x3f; + time += 64; + if (call BeaconTimer.gett0() + call BeaconTimer.getdt() - + call BeaconTimer.getNow() >= time) { + call BeaconTimer.stop(); + call BeaconTimer.startOneShot(time); + } + } + + command void CtpInfo.triggerImmediateRouteUpdate() { + // Random time in interval 4-11ms + uint16_t time = call Random.rand16(); + time &= 0x7; + time += 4; + call BeaconTimer.stop(); + call BeaconTimer.startOneShot(time); + } + + command void CtpInfo.setNeighborCongested(am_addr_t n, bool congested) { + uint8_t idx; + idx = routingTableFind(n); + if (idx < routingTableActive) { + routingTable[idx].info.congested = congested; + } + /* TODO: (this only makes sense if routeUpdateTask takes congestion into + * account for selecting routes.) + * if (routeInfo.congested && !congested) + * post routeUpdateTask() + * else if (routeInfo.parent == n && congested) { + * post routeUpdateTask() + * + */ + } + + command bool CtpInfo.isNeighborCongested(am_addr_t n) { + uint8_t idx; + + if (ECNOff) + return FALSE; + + idx = routingTableFind(n); + if (idx < routingTableActive) { + return routingTable[idx].info.congested; + } + return FALSE; + } + + /* RootControl interface */ + /** sets the current node as a root, if not already a root */ + /* returns FAIL if it's not possible for some reason */ + command error_t RootControl.setRoot() { + bool route_found = FALSE; + route_found = (routeInfo.parent == INVALID_ADDR); + atomic { + state_is_root = 1; + routeInfo.parent = my_ll_addr; //myself + routeInfo.etx = 0; + } + if (route_found) + signal Routing.routeFound(); + dbg("TreeRouting","%s I'm a root now!\n",__FUNCTION__); + call CollectionDebug.logEventRoute(NET_C_TREE_NEW_PARENT, routeInfo.parent, 0, routeInfo.etx); + return SUCCESS; + } + + command error_t RootControl.unsetRoot() { + atomic { + state_is_root = 0; + routeInfoInit(&routeInfo); + } + dbg("TreeRouting","%s I'm not a root now!\n",__FUNCTION__); + post updateRouteTask(); + return SUCCESS; + } + + command bool RootControl.isRoot() { + return state_is_root; + } + + default event void Routing.noRoute() { + } + + default event void Routing.routeFound() { + } + + + /************************************************************/ + /* Routing Table Functions */ + + /* The routing table keeps info about neighbor's route_info, + * and is used when choosing a parent. + * The table is simple: + * - not fragmented (all entries in 0..routingTableActive) + * - not ordered + * - no replacement: eviction follows the LinkEstimator table + */ + + void routingTableInit() { + routingTableActive = 0; + } + + /* Returns the index of parent in the table or + * routingTableActive if not found */ + uint8_t routingTableFind(am_addr_t neighbor) { + uint8_t i; + if (neighbor == INVALID_ADDR) + return routingTableActive; + for (i = 0; i < routingTableActive; i++) { + if (routingTable[i].neighbor == neighbor) + break; + } + return i; + } + + + error_t routingTableUpdateEntry(am_addr_t from, am_addr_t parent, uint16_t etx) { + uint8_t idx; + uint16_t linkEtx; + linkEtx = evaluateEtx(call LinkEstimator.getLinkQuality(from)); + + idx = routingTableFind(from); + if (idx == routingTableSize) { + //not found and table is full + //if (passLinkEtxThreshold(linkEtx)) + //TODO: add replacement here, replace the worst + //} + dbg("TreeRouting", "%s FAIL, table full\n", __FUNCTION__); + return FAIL; + } + else if (idx == routingTableActive) { + //not found and there is space + if (passLinkEtxThreshold(linkEtx)) { + atomic { + routingTable[idx].neighbor = from; + routingTable[idx].info.parent = parent; + routingTable[idx].info.etx = etx; + routingTable[idx].info.haveHeard = 1; + routingTableActive++; + } + dbg("TreeRouting", "%s OK, new entry\n", __FUNCTION__); + } else { + dbg("TreeRouting", "%s Fail, link quality (%hu) below threshold\n", __FUNCTION__, linkEtx); + } + } else { + //found, just update + atomic { + routingTable[idx].neighbor = from; + routingTable[idx].info.parent = parent; + routingTable[idx].info.etx = etx; + routingTable[idx].info.haveHeard = 1; + } + dbg("TreeRouting", "%s OK, updated entry\n", __FUNCTION__); + } + return SUCCESS; + } + + /* if this gets expensive, introduce indirection through an array of pointers */ + error_t routingTableEvict(am_addr_t neighbor) { + uint8_t idx,i; + idx = routingTableFind(neighbor); + if (idx == routingTableActive) + return FAIL; + routingTableActive--; + for (i = idx; i < routingTableActive; i++) { + routingTable[i] = routingTable[i+1]; + } + return SUCCESS; + } + /*********** end routing table functions ***************/ + + /* Default implementations for CollectionDebug calls. + * These allow CollectionDebug not to be wired to anything if debugging + * is not desired. */ + + default command error_t CollectionDebug.logEvent(uint8_t type) { + return SUCCESS; + } + default command error_t CollectionDebug.logEventSimple(uint8_t type, uint16_t arg) { + return SUCCESS; + } + default command error_t CollectionDebug.logEventDbg(uint8_t type, uint16_t arg1, uint16_t arg2, uint16_t arg3) { + return SUCCESS; + } + default command error_t CollectionDebug.logEventMsg(uint8_t type, uint16_t msg, am_addr_t origin, am_addr_t node) { + return SUCCESS; + } + default command error_t CollectionDebug.logEventRoute(uint8_t type, am_addr_t parent, uint8_t hopcount, uint16_t etx) { + return SUCCESS; + } + + command bool CtpRoutingPacket.getOption(message_t* msg, ctp_options_t opt) { + return ((getHeader(msg)->options & opt) == opt) ? TRUE : FALSE; + } + + command void CtpRoutingPacket.setOption(message_t* msg, ctp_options_t opt) { + getHeader(msg)->options |= opt; + } + + command void CtpRoutingPacket.clearOption(message_t* msg, ctp_options_t opt) { + getHeader(msg)->options &= ~opt; + } + + command void CtpRoutingPacket.clearOptions(message_t* msg) { + getHeader(msg)->options = 0; + } + + + command am_addr_t CtpRoutingPacket.getParent(message_t* msg) { + return getHeader(msg)->parent; + } + command void CtpRoutingPacket.setParent(message_t* msg, am_addr_t addr) { + getHeader(msg)->parent = addr; + } + + command uint16_t CtpRoutingPacket.getEtx(message_t* msg) { + return getHeader(msg)->etx; + } + command void CtpRoutingPacket.setEtx(message_t* msg, uint8_t etx) { + getHeader(msg)->etx = etx; + } + + command uint8_t CtpInfo.numNeighbors() { + return routingTableActive; + } + command uint16_t CtpInfo.getNeighborLinkQuality(uint8_t n) { + return (n < routingTableActive)? call LinkEstimator.getLinkQuality(routingTable[n].neighbor):0xffff; + } + command uint16_t CtpInfo.getNeighborRouteQuality(uint8_t n) { + return (n < routingTableActive)? call LinkEstimator.getLinkQuality(routingTable[n].neighbor) + routingTable[n].info.etx:0xfffff; + } + command am_addr_t CtpInfo.getNeighborAddr(uint8_t n) { + return (n < routingTableActive)? routingTable[n].neighbor:AM_BROADCAST_ADDR; + } + +} diff --git a/tos/lib/net/ctp/CtpRoutingPacket.nc b/tos/lib/net/ctp/CtpRoutingPacket.nc new file mode 100644 index 00000000..5fa376c4 --- /dev/null +++ b/tos/lib/net/ctp/CtpRoutingPacket.nc @@ -0,0 +1,58 @@ +/* $Id$ */ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * ADT for CTP routing frames. + * + * @author Philip Levis + * @author Kyle Jamieson + * @date $Date$ + */ + +#include + +interface CtpRoutingPacket { + + /* Allow individual options to be read, set, and reset independently */ + command bool getOption(message_t* msg, ctp_options_t opt); + command void setOption(message_t* msg, ctp_options_t opt); + command void clearOption(message_t* msg, ctp_options_t opt); + + /* Clear all options */ + command void clearOptions(message_t* msg); + + command am_addr_t getParent(message_t* msg); + command void setParent(message_t* msg, am_addr_t addr); + + command uint16_t getEtx(message_t* msg); + command void setEtx(message_t* msg, uint8_t etx); +} diff --git a/tos/lib/net/ctp/CtpSenderC.nc b/tos/lib/net/ctp/CtpSenderC.nc new file mode 100644 index 00000000..7a0eea30 --- /dev/null +++ b/tos/lib/net/ctp/CtpSenderC.nc @@ -0,0 +1,58 @@ +/* $Id$ */ +/* + * Copyright (c) 2006 Massachusetts Institute of Technology (MIT). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Massachusetts Institute of Technology nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * MASSACHUSETTS INSITIUTE OF TECHNOLOGY OR ITS CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +/** + * The virtualized collection sender abstraction. + * + * @author Kyle Jamieson + * @author Philip Levis + * @date April 25 2006 + * @see TinyOS Net2-WG + */ + +#include "Collection.h" +#include "Ctp.h" + +generic configuration CtpSenderC(collection_id_t collectid) { + provides { + interface Send; + interface Packet; + } +} + +implementation { + components new CtpSenderP(collectid, unique(UQ_CTP_CLIENT)); + Send = CtpSenderP; + Packet = CtpSenderP; +} diff --git a/tos/lib/net/ctp/CtpSenderP.nc b/tos/lib/net/ctp/CtpSenderP.nc new file mode 100644 index 00000000..293bc904 --- /dev/null +++ b/tos/lib/net/ctp/CtpSenderP.nc @@ -0,0 +1,51 @@ +/* $Id$ */ +/* + * Copyright (c) 2006 Massachusetts Institute of Technology (MIT). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Massachusetts Institute of Technology nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * MASSACHUSETTS INSITIUTE OF TECHNOLOGY OR ITS CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +#include "Collection.h" + +generic configuration CtpSenderP(collection_id_t collectid, uint8_t clientid) { + provides { + interface Send; + interface Packet; + } +} + +implementation { + components CtpC as Collector; + components new CollectionIdP(collectid); + + Send = Collector.Send[clientid]; + Packet = Collector.Packet; + Collector.CollectionId[clientid] -> CollectionIdP; +} diff --git a/tos/lib/net/ctp/LruCtpMsgCacheC.nc b/tos/lib/net/ctp/LruCtpMsgCacheC.nc new file mode 100644 index 00000000..f1f3106e --- /dev/null +++ b/tos/lib/net/ctp/LruCtpMsgCacheC.nc @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * An LRU cache CTP packet instances, where insertion represents use. + * + * @author Philip Levis + */ + +generic configuration LruCtpMsgCacheC(uint8_t CACHE_SIZE) { + provides interface Cache; +} +implementation { + components MainC, new LruCtpMsgCacheP(CACHE_SIZE) as CacheP; + components CtpP; + Cache = CacheP; + CacheP.CtpPacket -> CtpP; + MainC.SoftwareInit -> CacheP; +} diff --git a/tos/lib/net/ctp/LruCtpMsgCacheP.nc b/tos/lib/net/ctp/LruCtpMsgCacheP.nc new file mode 100644 index 00000000..b4fd8299 --- /dev/null +++ b/tos/lib/net/ctp/LruCtpMsgCacheP.nc @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2006 Stanford University. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Stanford University nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD + * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * An LRU cache that stores the signature of a CTP packet instance. + * An insert operation indicates "use". Inserting an element not in + * the cache will replace the oldest, and inserting an element already + * in the cache will refresh its age. + * + * @author Philip Levis + */ + +#include + +generic module LruCtpMsgCacheP(uint8_t size) { + provides { + interface Init; + interface Cache; + } + uses { + interface CtpPacket; + } +} +implementation { + typedef struct { + am_addr_t origin; + uint8_t seqno; + collection_id_t type; + uint8_t thl; + } ctp_packet_sig_t; + + ctp_packet_sig_t cache[size]; + uint8_t first; + uint8_t count; + + command error_t Init.init() { + first = 0; + count = 0; + return SUCCESS; + } + + void printCache() { +#ifdef TOSSIM + int i; + dbg("Cache","Cache:"); + for (i = 0; i < count; i++) { + dbg_clear("Cache", " %04x %02x %02x %02x", cache[i].origin, cache[i].seqno, cache[i].type, cache[i].thl); + if (i == first) + dbg_clear("Cache","*"); + } + dbg_clear("Cache","\n"); +#endif + } + + /* if key is in cache returns the index (offset by first), otherwise returns count */ + uint8_t lookup(message_t* m) { + uint8_t i; + uint8_t idx; + for (i = 0; i < count; i++) { + idx = (i + first) % size; + if (call CtpPacket.getOrigin(m) == cache[idx].origin && + call CtpPacket.getSequenceNumber(m) == cache[idx].seqno && + call CtpPacket.getThl(m) == cache[idx].thl && + call CtpPacket.getType(m) == cache[idx].type) { + break; + } + } + return i; + } + + /* remove the entry with index i (relative to first) */ + void remove(uint8_t i) { + uint8_t j; + if (i >= count) + return; + if (i == 0) { + //shift all by moving first + first = (first + 1) % size; + } else { + //shift everyone down + for (j = i; j < count; j++) { + memcpy(&cache[(j + first) % size], &cache[(j + first + 1) % size], sizeof(ctp_packet_sig_t)); + } + } + count--; + } + + command void Cache.insert(message_t* m) { + uint8_t i; + if (count == size ) { + //remove someone. If item not in + //cache, remove the first item. + //otherwise remove the item temporarily for + //reinsertion. This moves the item up in the + //LRU stack. + i = lookup(m); + remove(i % count); + } + //now count < size + cache[(first + count) % size].origin = call CtpPacket.getOrigin(m); + cache[(first + count) % size].seqno = call CtpPacket.getSequenceNumber(m); + cache[(first + count) % size].thl = call CtpPacket.getThl(m); + cache[(first + count) % size].type = call CtpPacket.getType(m); + count++; + } + + command bool Cache.lookup(message_t* m) { + return (lookup(m) < count); + } + + command void Cache.flush() { + call Init.init(); + } + +} diff --git a/tos/lib/net/ctp/TreeRouting.h b/tos/lib/net/ctp/TreeRouting.h new file mode 100644 index 00000000..66b44d76 --- /dev/null +++ b/tos/lib/net/ctp/TreeRouting.h @@ -0,0 +1,33 @@ +#ifndef _TREE_ROUTING_H +#define _TREE_ROUTING_H + +enum { + AM_TREE_ROUTING_CONTROL = 0xCE, + BEACON_INTERVAL = 8192, + INVALID_ADDR = TOS_BCAST_ADDR, + ETX_THRESHOLD = 50, // link quality=20% -> ETX=5 -> Metric=50 + PARENT_SWITCH_THRESHOLD = 15, + MAX_METRIC = 0xFFFF, +}; + + +typedef struct { + am_addr_t parent; + uint16_t etx; + bool haveHeard; + bool congested; +} route_info_t; + +typedef struct { + am_addr_t neighbor; + route_info_t info; +} routing_table_entry; + +inline void routeInfoInit(route_info_t *ri) { + ri->parent = INVALID_ADDR; + ri->etx = 0; + ri->haveHeard = 0; + ri->congested = FALSE; +} + +#endif diff --git a/tos/lib/net/le/LinkEstimator.h b/tos/lib/net/le/LinkEstimator.h new file mode 100644 index 00000000..3e7394a5 --- /dev/null +++ b/tos/lib/net/le/LinkEstimator.h @@ -0,0 +1,121 @@ +/* $Id$ */ +/* + * "Copyright (c) 2006 University of Southern California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written + * agreement is hereby granted, provided that the above copyright + * notice, the following two paragraphs and the author appear in all + * copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF SOUTHERN CALIFORNIA BE LIABLE TO + * ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS + * DOCUMENTATION, EVEN IF THE UNIVERSITY OF SOUTHERN CALIFORNIA HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF SOUTHERN CALIFORNIA SPECIFICALLY DISCLAIMS ANY + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE + * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF + * SOUTHERN CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, + * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ + +#ifndef LINK_ESITIMATOR_H +#define LINK_ESITIMATOR_H +/* + @ author Omprakash Gnawali + @ Created: June 08, 2006 + */ + +// Number of entries in the neighbor table +#define NEIGHBOR_TABLE_SIZE 10 + +// Masks for the flag field in the link estimation header +enum { + // use last four bits to keep track of + // how many footer entries there are + NUM_ENTRIES_FLAG = 15, +}; + +// The first byte of each outgoing packet is a control byte +// Bits 4..7 reserved for routing and other protocols +// Bits 0..3 is used by the link estimator to encode the +// number of linkest entries in the packet + +// link estimator header added to +// every message passing through the link estimator +typedef nx_struct linkest_header { + nx_uint8_t flags; + nx_uint8_t seq; +} linkest_header_t; + + +// for outgoing link estimator message +// so that we can compute bi-directional quality +typedef nx_struct neighbor_stat_entry { + nx_am_addr_t ll_addr; + nx_uint8_t inquality; +} neighbor_stat_entry_t; + +// we put the above neighbor entry in the footer +typedef nx_struct linkest_footer { + neighbor_stat_entry_t neighborList[1]; +} linkest_footer_t; + + +// Flags for the neighbor table entry +enum { + VALID_ENTRY = 0x1, + // A link becomes mature after BLQ_PKT_WINDOW + // packets are received and an estimate is computed + MATURE_ENTRY = 0x2, + // Flag to indicate that this link has received the + // first sequence number + INIT_ENTRY = 0x4, + // The upper layer has requested that this link be pinned + // Useful if we don't want to lose the root from the table + PINNED_ENTRY = 0x8 +}; + + +// neighbor table entry +typedef struct neighbor_table_entry { + // link layer address of the neighbor + am_addr_t ll_addr; + // last beacon sequence number received from this neighbor + uint8_t lastseq; + // number of beacons received after last beacon estimator update + // the update happens every BLQ_PKT_WINDOW beacon packets + uint8_t rcvcnt; + // number of beacon packets missed after last beacon estimator update + uint8_t failcnt; + // flags to describe the state of this entry + uint8_t flags; + // MAXAGE-inage gives the number of update rounds we haven't been able + // update the inbound beacon estimator + uint8_t inage; + // MAXAGE-outage gives the number of update rounds we haven't received + // the outbound link quality + uint8_t outage; + // inbound and outbound link qualities in the range [1..255] + // 1 bad, 255 good + uint8_t inquality; + uint8_t outquality; + // EETX for the link to this neighbor. This is the quality returned to + // the users of the link estimator + uint16_t eetx; + // Number of data packets successfully sent (ack'd) to this neighbor + // since the last data estimator update round. This update happens + // every DLQ_PKT_WINDOW data packets + uint8_t data_success; + // The total number of data packets transmission attempt to this neighbor + // since the last data estimator update round. + uint8_t data_total; +} neighbor_table_entry_t; + + +#endif diff --git a/tos/lib/net/le/LinkEstimator.nc b/tos/lib/net/le/LinkEstimator.nc new file mode 100644 index 00000000..8e7a5df4 --- /dev/null +++ b/tos/lib/net/le/LinkEstimator.nc @@ -0,0 +1,70 @@ +/* $Id$ */ +/* + * "Copyright (c) 2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ + +/** Provides an additive quality measure for a neighbor. The + * provided quality increases when the true link quality increases. + * @author Rodrigo Fonseca + * @author Omprakash Gnawali + * @date $Date$ + */ + +/* Quality of a link is defined by the implementor of this interface. + * It could be ETX, PRR, etc. + */ + +interface LinkEstimator { + + /* get bi-directional link quality for link to the neighbor */ + command uint8_t getLinkQuality(uint16_t neighbor); + + /* get quality of the link from neighbor to this node */ + command uint8_t getReverseQuality(uint16_t neighbor); + + /* get quality of the link from this node to the neighbor */ + command uint8_t getForwardQuality(uint16_t neighbor); + + /* insert this neighbor into the neighbor table */ + command error_t insertNeighbor(am_addr_t neighbor); + + /* pin a neighbor so that it does not get evicted */ + command error_t pinNeighbor(am_addr_t neighbor); + + /* pin a neighbor so that it does not get evicted */ + command error_t unpinNeighbor(am_addr_t neighbor); + + /* called when an acknowledgement is received; sign of a successful + data transmission; to update forward link quality */ + command error_t txAck(am_addr_t neighbor); + + /* called when an acknowledgement is not received; could be due to + data pkt or acknowledgement loss; to update forward link quality */ + command error_t txNoAck(am_addr_t neighbor); + + /* called when the parent changes; clear state about data-driven link quality */ + command error_t clearDLQ(am_addr_t neighbor); + + /* signal when this neighbor is evicted from the neighbor table */ + event void evicted(am_addr_t neighbor); +} + + diff --git a/tos/lib/net/le/LinkEstimatorC.nc b/tos/lib/net/le/LinkEstimatorC.nc new file mode 100644 index 00000000..0aecacef --- /dev/null +++ b/tos/lib/net/le/LinkEstimatorC.nc @@ -0,0 +1,34 @@ +/* $Id$ */ +/* + * "Copyright (c) 2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ + +/** The public component of the link estimator that provides the + * quality to and from a neighbor + * + * @author Rodrigo Fonseca + * @date $Date$ + */ +configuration LinkEstimatorC { + provides { + interface LinkEstimator; + } +} diff --git a/tos/lib/net/le/LinkEstimatorDummyP.nc b/tos/lib/net/le/LinkEstimatorDummyP.nc new file mode 100644 index 00000000..2cc6de13 --- /dev/null +++ b/tos/lib/net/le/LinkEstimatorDummyP.nc @@ -0,0 +1,175 @@ +/* $Id$ */ +/* + * "Copyright (c) 2006 University of Southern California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written + * agreement is hereby granted, provided that the above copyright + * notice, the following two paragraphs and the author appear in all + * copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF SOUTHERN CALIFORNIA BE LIABLE TO + * ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS + * DOCUMENTATION, EVEN IF THE UNIVERSITY OF SOUTHERN CALIFORNIA HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF SOUTHERN CALIFORNIA SPECIFICALLY DISCLAIMS ANY + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE + * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF + * SOUTHERN CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, + * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ + +/* + @ author Omprakash Gnawali + @ Created: April 24, 2006 + */ + + +#include "Timer.h" + +module LinkEstimatorDummyP { + provides { + interface AMSend as Send; + interface Receive; + interface LinkEstimator; + interface Init; + interface Packet; + interface LinkSrcPacket; + } + + uses { + interface AMSend; + interface AMPacket as SubAMPacket; + interface Packet as SubPacket; + interface Receive as SubReceive; + interface Timer; + } +} + +implementation { + + // link estimator header added to + // every message passing thru' the link estimator + typedef nx_struct linkest_header { + nx_am_addr_t ll_addr; + } linkest_header_t; + + linkest_header_t* getHeader(message_t* m) { + return (linkest_header_t*)call SubPacket.getPayload(m, NULL); + } + + + uint8_t addLinkEstHeaderAndFooter(message_t *msg, uint8_t len) { + uint8_t newlen; + linkest_header_t *hdr; + dbg("LI", "newlen1 = %d\n", len); + newlen = len + sizeof(linkest_header_t); + call Packet.setPayloadLength(msg, newlen); + hdr = getHeader(msg); + + hdr->ll_addr = call SubAMPacket.address(); + dbg("LI", "newlen2 = %d\n", newlen); + return newlen; + } + + command error_t Init.init() { + return SUCCESS; + } + + event void Timer.fired() { } + + // EETX (Extra Expected number of Transmission) + // EETX = ETX - 1 + // computeEETX returns EETX*10 + + command uint8_t LinkEstimator.getLinkQuality(uint16_t neighbor) { + return 2; + } + + command uint8_t LinkEstimator.getReverseQuality(uint16_t neighbor) { + return 1; + } + + command uint8_t LinkEstimator.getForwardQuality(uint16_t neighbor) { + return 1; + } + + command am_addr_t LinkSrcPacket.getSrc(message_t* msg) { + linkest_header_t* hdr = getHeader(msg); + return hdr->ll_addr; + } + + command error_t Send.send(am_addr_t addr, message_t* msg, uint8_t len) { + uint8_t newlen; + newlen = addLinkEstHeaderAndFooter(msg, len); + return call AMSend.send(addr, msg, newlen); + } + + event void AMSend.sendDone(message_t* msg, error_t error ) { + return signal Send.sendDone(msg, error); + } + + command uint8_t Send.cancel(message_t* msg) { + return call AMSend.cancel(msg); + } + + command uint8_t Send.maxPayloadLength() { + return call Packet.maxPayloadLength(); + } + + command void* Send.getPayload(message_t* msg) { + return call Packet.getPayload(msg, NULL); + } + + event message_t* SubReceive.receive(message_t* msg, + void* payload, + uint8_t len) { + if (call SubAMPacket.destination(msg) == AM_BROADCAST_ADDR) { + linkest_header_t* hdr = getHeader(msg); + dbg("LI", "Got pkt from link: %d\n", hdr->ll_addr); + } + + return signal Receive.receive(msg, + call Packet.getPayload(msg, NULL), + call Packet.payloadLength(msg)); + } + + command void* Receive.getPayload(message_t* msg, uint8_t* len) { + return call Packet.getPayload(msg, len); + } + + command uint8_t Receive.payloadLength(message_t* msg) { + return call Packet.payloadLength(msg); + } + + command void Packet.clear(message_t* msg) { + call SubPacket.clear(msg); + } + + command uint8_t Packet.payloadLength(message_t* msg) { + return call SubPacket.payloadLength(msg) - sizeof(linkest_header_t); + } + + command void Packet.setPayloadLength(message_t* msg, uint8_t len) { + call SubPacket.setPayloadLength(msg, len + sizeof(linkest_header_t)); + } + + command uint8_t Packet.maxPayloadLength() { + return call SubPacket.maxPayloadLength() - sizeof(linkest_header_t); + } + + command void* Packet.getPayload(message_t* msg, uint8_t* len) { + uint8_t* payload = call SubPacket.getPayload(msg, len); + if (len != NULL) { + *len -= sizeof(linkest_header_t); + } + return payload + sizeof(linkest_header_t); + } + +} + diff --git a/tos/lib/net/le/LinkEstimatorP.nc b/tos/lib/net/le/LinkEstimatorP.nc new file mode 100644 index 00000000..2fee9a1d --- /dev/null +++ b/tos/lib/net/le/LinkEstimatorP.nc @@ -0,0 +1,741 @@ +/* $Id$ */ +/* + * "Copyright (c) 2006 University of Southern California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written + * agreement is hereby granted, provided that the above copyright + * notice, the following two paragraphs and the author appear in all + * copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF SOUTHERN CALIFORNIA BE LIABLE TO + * ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL + * DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS + * DOCUMENTATION, EVEN IF THE UNIVERSITY OF SOUTHERN CALIFORNIA HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF SOUTHERN CALIFORNIA SPECIFICALLY DISCLAIMS ANY + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE + * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF + * SOUTHERN CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, + * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ + +/* + @ author Omprakash Gnawali + @ Created: April 24, 2006 + */ + +#include "LinkEstimator.h" + +module LinkEstimatorP { + provides { + interface StdControl; + interface AMSend as Send; + interface Receive; + interface LinkEstimator; + interface Init; + interface Packet; + interface LinkSrcPacket; + } + + uses { + interface AMSend; + interface AMPacket as SubAMPacket; + interface Packet as SubPacket; + interface Receive as SubReceive; + } +} + +implementation { + + // configure the link estimator and some constants + enum { + // If the eetx estimate is below this threshold + // do not evict a link + EVICT_EETX_THRESHOLD = 55, + // maximum link update rounds before we expire the link + MAX_AGE = 6, + // if received sequence number if larger than the last sequence + // number by this gap, we reinitialize the link + MAX_PKT_GAP = 10, + BEST_EETX = 0, + INVALID_RVAL = 0xff, + INVALID_NEIGHBOR_ADDR = 0xff, + INFINITY = 0xff, + // decay the link estimate using this alpha + // we use a denominator of 10, so this corresponds to 0.2 + ALPHA = 2, + // number of packets to wait before computing a new + // DLQ (Data-driven Link Quality) + DLQ_PKT_WINDOW = 5, + // number of beacons to wait before computing a new + // BLQ (Beacon-driven Link Quality) + BLQ_PKT_WINDOW = 3, + // largest EETX value that we feed into the link quality EWMA + // a value of 60 corresponds to having to make six transmissions + // to successfully receive one acknowledgement + LARGE_EETX_VALUE = 60 + }; + + // keep information about links from the neighbors + neighbor_table_entry_t NeighborTable[NEIGHBOR_TABLE_SIZE]; + // link estimation sequence, increment every time a beacon is sent + uint8_t linkEstSeq = 0; + // if there is not enough room in the packet to put all the neighbor table + // entries, in order to do round robin we need to remember which entry + // we sent in the last beacon + uint8_t prevSentIdx = 0; + + // get the link estimation header in the packet + linkest_header_t* getHeader(message_t* m) { + return (linkest_header_t*)call SubPacket.getPayload(m, NULL); + } + + // get the link estimation footer (neighbor entries) in the packet + linkest_footer_t* getFooter(message_t* m, uint8_t len) { + return (linkest_footer_t*)(len + (uint8_t *)call Packet.getPayload(m,NULL)); + } + + // add the link estimation header (seq no) and link estimation + // footer (neighbor entries) in the packet. Call just before sending + // the packet. + uint8_t addLinkEstHeaderAndFooter(message_t *msg, uint8_t len) { + uint8_t newlen; + linkest_header_t *hdr; + linkest_footer_t *footer; + uint8_t i, j, k; + uint8_t maxEntries, newPrevSentIdx; + dbg("LI", "newlen1 = %d\n", len); + hdr = getHeader(msg); + footer = getFooter(msg, len); + + maxEntries = ((call SubPacket.maxPayloadLength() - len - sizeof(linkest_header_t)) + / sizeof(linkest_footer_t)); + + // Depending on the number of bits used to store the number + // of entries, we can encode up to NUM_ENTRIES_FLAG using those bits + if (maxEntries > NUM_ENTRIES_FLAG) { + maxEntries = NUM_ENTRIES_FLAG; + } + dbg("LI", "Max payload is: %d, maxEntries is: %d\n", call SubPacket.maxPayloadLength(), maxEntries); + + j = 0; + newPrevSentIdx = 0; + for (i = 0; i < NEIGHBOR_TABLE_SIZE && j < maxEntries; i++) { + k = (prevSentIdx + i + 1) % NEIGHBOR_TABLE_SIZE; + if (NeighborTable[k].flags & VALID_ENTRY) { + footer->neighborList[j].ll_addr = NeighborTable[k].ll_addr; + footer->neighborList[j].inquality = NeighborTable[k].inquality; + newPrevSentIdx = k; + dbg("LI", "Loaded on footer: %d %d %d\n", j, footer->neighborList[j].ll_addr, + footer->neighborList[j].inquality); + j++; + } + } + prevSentIdx = newPrevSentIdx; + + hdr->seq = linkEstSeq++; + hdr->flags = 0; + hdr->flags |= (NUM_ENTRIES_FLAG & j); + newlen = sizeof(linkest_header_t) + len + j*sizeof(linkest_footer_t); + dbg("LI", "newlen2 = %d\n", newlen); + return newlen; + } + + + // initialize the given entry in the table for neighbor ll_addr + void initNeighborIdx(uint8_t i, am_addr_t ll_addr) { + neighbor_table_entry_t *ne; + ne = &NeighborTable[i]; + ne->ll_addr = ll_addr; + ne->lastseq = 0; + ne->rcvcnt = 0; + ne->failcnt = 0; + ne->flags = (INIT_ENTRY | VALID_ENTRY); + ne->inage = MAX_AGE; + ne->outage = MAX_AGE; + ne->inquality = 0; + ne->outquality = 0; + ne->eetx = 0; + } + + // find the index to the entry for neighbor ll_addr + uint8_t findIdx(am_addr_t ll_addr) { + uint8_t i; + for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { + if (NeighborTable[i].flags & VALID_ENTRY) { + if (NeighborTable[i].ll_addr == ll_addr) { + return i; + } + } + } + return INVALID_RVAL; + } + + // find an empty slot in the neighbor table + uint8_t findEmptyNeighborIdx() { + uint8_t i; + for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { + if (NeighborTable[i].flags & VALID_ENTRY) { + } else { + return i; + } + } + return INVALID_RVAL; + } + + // find the index to the worst neighbor if the eetx + // estimate is greater than the given threshold + uint8_t findWorstNeighborIdx(uint8_t thresholdEETX) { + uint8_t i, worstNeighborIdx; + uint16_t worstEETX, thisEETX; + + worstNeighborIdx = INVALID_RVAL; + worstEETX = 0; + for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { + if (!(NeighborTable[i].flags & VALID_ENTRY)) { + dbg("LI", "Invalid so continuing\n"); + continue; + } + if (!(NeighborTable[i].flags & MATURE_ENTRY)) { + dbg("LI", "Not mature, so continuing\n"); + continue; + } + if (NeighborTable[i].flags & PINNED_ENTRY) { + dbg("LI", "Pinned entry, so continuing\n"); + continue; + } + thisEETX = NeighborTable[i].eetx; + if (thisEETX >= worstEETX) { + worstNeighborIdx = i; + worstEETX = thisEETX; + } + } + if (worstEETX >= thresholdEETX) { + return worstNeighborIdx; + } else { + return INVALID_RVAL; + } + } + + // update the quality of the link link: self->neighbor + // this is found in the entries in the footer of incoming message + void updateReverseQuality(am_addr_t neighbor, uint8_t outquality) { + uint8_t idx; + idx = findIdx(neighbor); + if (idx != INVALID_RVAL) { + NeighborTable[idx].outquality = outquality; + NeighborTable[idx].outage = MAX_AGE; + } + } + + // update the EETX estimator + // called when new beacon estimate is done + // also called when new DEETX estimate is done + void updateEETX(neighbor_table_entry_t *ne, uint16_t newEst) { + ne->eetx = (ALPHA * ne->eetx + (10 - ALPHA) * newEst)/10; + } + + + // update data driven EETX + void updateDEETX(neighbor_table_entry_t *ne) { + uint16_t estETX; + + if (ne->data_success == 0) { + // if there were no successful packet transmission in the + // last window, assign a large EETX estimate + estETX = LARGE_EETX_VALUE; + } else { + estETX = (10 * ne->data_total) / ne->data_success - 10; + } + updateEETX(ne, estETX); + ne->data_success = 0; + ne->data_total = 0; + } + + + // EETX (Extra Expected number of Transmission) + // EETX = ETX - 1 + // computeEETX returns EETX*10 + uint8_t computeEETX(uint8_t q1) { + uint16_t q; + if (q1 > 0) { + q = 2550 / q1 - 10; + if (q > 255) { + q = INFINITY; + } + return (uint8_t)q; + } else { + return INFINITY; + } + } + + // BidirETX = 1 / (q1*q2) + // BidirEETX = BidirETX - 1 + // computeBidirEETX return BidirEETX*10 + uint8_t computeBidirEETX(uint8_t q1, uint8_t q2) { + uint16_t q; + if ((q1 > 0) && (q2 > 0)) { + q = 65025u / q1; + q = (10*q) / q2 - 10; + if (q > 255) { + q = LARGE_EETX_VALUE; + } + return (uint8_t)q; + } else { + return LARGE_EETX_VALUE; + } + } + + // update the inbound link quality by + // munging receive, fail count since last update + void updateNeighborTableEst(am_addr_t n) { + uint8_t i, totalPkt; + neighbor_table_entry_t *ne; + uint8_t newEst; + uint8_t minPkt; + + minPkt = BLQ_PKT_WINDOW; + dbg("LI", "%s\n", __FUNCTION__); + for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { + ne = &NeighborTable[i]; + if (ne->ll_addr == n) { + if (ne->flags & VALID_ENTRY) { + if (ne->inage > 0) + ne->inage--; + if (ne->outage > 0) + ne->outage--; + + if ((ne->inage == 0) && (ne->outage == 0)) { + ne->flags ^= VALID_ENTRY; + ne->inquality = ne->outquality = 0; + } else { + dbg("LI", "Making link: %d mature\n", i); + ne->flags |= MATURE_ENTRY; + totalPkt = ne->rcvcnt + ne->failcnt; + dbg("LI", "MinPkt: %d, totalPkt: %d\n", minPkt, totalPkt); + if (totalPkt < minPkt) { + totalPkt = minPkt; + } + if (totalPkt == 0) { + ne->inquality = (ALPHA * ne->inquality) / 10; + } else { + newEst = (255 * ne->rcvcnt) / totalPkt; + dbg("LI,LITest", " %hu: %hhu -> %hhu", ne->ll_addr, ne->inquality, (ALPHA * ne->inquality + (10-ALPHA) * newEst)/10); + ne->inquality = (ALPHA * ne->inquality + (10-ALPHA) * newEst)/10; + } + ne->rcvcnt = 0; + ne->failcnt = 0; + } + updateEETX(ne, computeBidirEETX(ne->inquality, ne->outquality)); + } + else { + dbg("LI", " - entry %i is invalid.\n", (int)i); + } + } + } + } + + + // we received seq from the neighbor in idx + // update the last seen seq, receive and fail count + // refresh the age + void updateNeighborEntryIdx(uint8_t idx, uint8_t seq) { + uint8_t packetGap; + + if (NeighborTable[idx].flags & INIT_ENTRY) { + dbg("LI", "Init entry update\n"); + NeighborTable[idx].lastseq = seq; + NeighborTable[idx].flags &= ~INIT_ENTRY; + } + + packetGap = seq - NeighborTable[idx].lastseq; + dbg("LI", "updateNeighborEntryIdx: prevseq %d, curseq %d, gap %d\n", + NeighborTable[idx].lastseq, seq, packetGap); + NeighborTable[idx].lastseq = seq; + NeighborTable[idx].rcvcnt++; + NeighborTable[idx].inage = MAX_AGE; + if (packetGap > 0) { + NeighborTable[idx].failcnt += packetGap - 1; + } + if (packetGap > MAX_PKT_GAP) { + NeighborTable[idx].failcnt = 0; + NeighborTable[idx].rcvcnt = 1; + NeighborTable[idx].outage = 0; + NeighborTable[idx].outquality = 0; + NeighborTable[idx].inquality = 0; + } + + if (NeighborTable[idx].rcvcnt >= BLQ_PKT_WINDOW) { + updateNeighborTableEst(NeighborTable[idx].ll_addr); + } + + } + + + + // print the neighbor table. for debugging. + void print_neighbor_table() { + uint8_t i; + neighbor_table_entry_t *ne; + for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) { + ne = &NeighborTable[i]; + if (ne->flags & VALID_ENTRY) { + dbg("LI,LITest", "%d:%d inQ=%d, inA=%d, outQ=%d, outA=%d, rcv=%d, fail=%d, biQ=%d\n", + i, ne->ll_addr, ne->inquality, ne->inage, ne->outquality, ne->outage, + ne->rcvcnt, ne->failcnt, computeBidirEETX(ne->inquality, ne->outquality)); + } + } + } + + // print the packet. for debugging. + void print_packet(message_t* msg, uint8_t len) { + uint8_t i; + uint8_t* b; + + b = (uint8_t *)msg->data; + for(i=0; iself + command uint8_t LinkEstimator.getReverseQuality(am_addr_t neighbor) { + uint8_t idx; + idx = findIdx(neighbor); + if (idx == INVALID_RVAL) { + return INFINITY; + } else { + return computeEETX(NeighborTable[idx].inquality); + }; + } + + // return the quality of the link: self->neighbor + command uint8_t LinkEstimator.getForwardQuality(am_addr_t neighbor) { + uint8_t idx; + idx = findIdx(neighbor); + if (idx == INVALID_RVAL) { + return INFINITY; + } else { + return computeEETX(NeighborTable[idx].outquality); + }; + } + + // insert the neighbor at any cost (if there is a room for it) + // even if eviction of a perfectly fine neighbor is called for + command error_t LinkEstimator.insertNeighbor(am_addr_t neighbor) { + uint8_t nidx; + + nidx = findIdx(neighbor); + if (nidx != INVALID_RVAL) { + dbg("LI", "insert: Found the entry, no need to insert\n"); + return SUCCESS; + } + + nidx = findEmptyNeighborIdx(); + if (nidx != INVALID_RVAL) { + dbg("LI", "insert: inserted into the empty slot\n"); + initNeighborIdx(nidx, neighbor); + return SUCCESS; + } else { + nidx = findWorstNeighborIdx(BEST_EETX); + if (nidx != INVALID_RVAL) { + dbg("LI", "insert: inserted by replacing an entry for neighbor: %d\n", + NeighborTable[nidx].ll_addr); + signal LinkEstimator.evicted(NeighborTable[nidx].ll_addr); + initNeighborIdx(nidx, neighbor); + return SUCCESS; + } + } + return FAIL; + } + + // pin a neighbor so that it does not get evicted + command error_t LinkEstimator.pinNeighbor(am_addr_t neighbor) { + uint8_t nidx = findIdx(neighbor); + if (nidx == INVALID_RVAL) { + return FAIL; + } + NeighborTable[nidx].flags |= PINNED_ENTRY; + return SUCCESS; + } + + // pin a neighbor so that it does not get evicted + command error_t LinkEstimator.unpinNeighbor(am_addr_t neighbor) { + uint8_t nidx = findIdx(neighbor); + if (nidx == INVALID_RVAL) { + return FAIL; + } + NeighborTable[nidx].flags &= ~PINNED_ENTRY; + return SUCCESS; + } + + + // called when an acknowledgement is received; sign of a successful + // data transmission; to update forward link quality + command error_t LinkEstimator.txAck(am_addr_t neighbor) { + neighbor_table_entry_t *ne; + uint8_t nidx = findIdx(neighbor); + if (nidx == INVALID_RVAL) { + return FAIL; + } + ne = &NeighborTable[nidx]; + ne->data_success++; + ne->data_total++; + if (ne->data_total >= DLQ_PKT_WINDOW) { + updateDEETX(ne); + } + return SUCCESS; + } + + // called when an acknowledgement is not received; could be due to + // data pkt or acknowledgement loss; to update forward link quality + command error_t LinkEstimator.txNoAck(am_addr_t neighbor) { + neighbor_table_entry_t *ne; + uint8_t nidx = findIdx(neighbor); + if (nidx == INVALID_RVAL) { + return FAIL; + } + + ne = &NeighborTable[nidx]; + ne->data_total++; + if (ne->data_total >= DLQ_PKT_WINDOW) { + updateDEETX(ne); + } + return SUCCESS; + } + + // called when the parent changes; clear state about data-driven link quality + command error_t LinkEstimator.clearDLQ(am_addr_t neighbor) { + neighbor_table_entry_t *ne; + uint8_t nidx = findIdx(neighbor); + if (nidx == INVALID_RVAL) { + return FAIL; + } + ne = &NeighborTable[nidx]; + ne->data_total = 0; + ne->data_success = 0; + return SUCCESS; + } + + + // get the link layer source address for the incoming packet + command am_addr_t LinkSrcPacket.getSrc(message_t* msg) { + return call SubAMPacket.source(msg); + } + + // user of link estimator calls send here + // slap the header and footer before sending the message + command error_t Send.send(am_addr_t addr, message_t* msg, uint8_t len) { + uint8_t newlen; + newlen = addLinkEstHeaderAndFooter(msg, len); + dbg("LITest", "%s packet of length %hhu became %hhu\n", __FUNCTION__, len, newlen); + dbg("LI", "Sending seq: %d\n", linkEstSeq); + print_packet(msg, newlen); + return call AMSend.send(addr, msg, newlen); + } + + // done sending the message that originated by + // the user of this component + event void AMSend.sendDone(message_t* msg, error_t error ) { + return signal Send.sendDone(msg, error); + } + + // cascade the calls down + command uint8_t Send.cancel(message_t* msg) { + return call AMSend.cancel(msg); + } + + command uint8_t Send.maxPayloadLength() { + return call Packet.maxPayloadLength(); + } + + command void* Send.getPayload(message_t* msg) { + return call Packet.getPayload(msg, NULL); + } + + // called when link estimator generator packet or + // packets from upper layer that are wired to pass through + // link estimator is received + void processReceivedMessage(message_t* msg, void* payload, uint8_t len) { + uint8_t nidx; + uint8_t num_entries; + + dbg("LI", "LI receiving packet, buf addr: %x\n", payload); + print_packet(msg, len); + + if (call SubAMPacket.destination(msg) == AM_BROADCAST_ADDR) { + linkest_header_t* hdr = getHeader(msg); + linkest_footer_t* footer; + am_addr_t ll_addr; + + ll_addr = call SubAMPacket.source(msg); + + dbg("LI", "Got seq: %d from link: %d\n", hdr->seq, ll_addr); + + num_entries = hdr->flags & NUM_ENTRIES_FLAG; + print_neighbor_table(); + + // update neighbor table with this information + // find the neighbor + // if found + // update the entry + // else + // find an empty entry + // if found + // initialize the entry + // else + // find a bad neighbor to be evicted + // if found + // evict the neighbor and init the entry + // else + // we can not accommodate this neighbor in the table + nidx = findIdx(ll_addr); + if (nidx != INVALID_RVAL) { + dbg("LI", "Found the entry so updating\n"); + updateNeighborEntryIdx(nidx, hdr->seq); + } else { + nidx = findEmptyNeighborIdx(); + if (nidx != INVALID_RVAL) { + dbg("LI", "Found an empty entry\n"); + initNeighborIdx(nidx, ll_addr); + updateNeighborEntryIdx(nidx, hdr->seq); + } else { + nidx = findWorstNeighborIdx(EVICT_EETX_THRESHOLD); + if (nidx != INVALID_RVAL) { + dbg("LI", "Evicted neighbor %d at idx %d\n", + NeighborTable[nidx].ll_addr, nidx); + signal LinkEstimator.evicted(NeighborTable[nidx].ll_addr); + initNeighborIdx(nidx, ll_addr); + } else { + dbg("LI", "No room in the table\n"); + } + } + } + + if ((nidx != INVALID_RVAL) && (num_entries > 0)) { + dbg("LI", "Number of footer entries: %d\n", num_entries); + footer = (linkest_footer_t*) ((uint8_t *)call SubPacket.getPayload(msg, NULL) + + call SubPacket.payloadLength(msg) + - num_entries*sizeof(linkest_footer_t)); + { + uint8_t i, my_ll_addr; + my_ll_addr = call SubAMPacket.address(); + for (i = 0; i < num_entries; i++) { + dbg("LI", "%d %d %d\n", i, footer->neighborList[i].ll_addr, + footer->neighborList[i].inquality); + if (footer->neighborList[i].ll_addr == my_ll_addr) { + updateReverseQuality(ll_addr, footer->neighborList[i].inquality); + } + } + } + } + print_neighbor_table(); + } + + + } + + // new messages are received here + // update the neighbor table with the header + // and footer in the message + // then signal the user of this component + event message_t* SubReceive.receive(message_t* msg, + void* payload, + uint8_t len) { + dbg("LI", "Received upper packet. Will signal up\n"); + processReceivedMessage(msg, payload, len); + return signal Receive.receive(msg, + call Packet.getPayload(msg, NULL), + call Packet.payloadLength(msg)); + } + + command void* Receive.getPayload(message_t* msg, uint8_t* len) { + return call Packet.getPayload(msg, len); + } + + command uint8_t Receive.payloadLength(message_t* msg) { + return call Packet.payloadLength(msg); + } + + command void Packet.clear(message_t* msg) { + call SubPacket.clear(msg); + } + + // subtract the space occupied by the link estimation + // header and footer from the incoming payload size + command uint8_t Packet.payloadLength(message_t* msg) { + linkest_header_t *hdr; + hdr = getHeader(msg); + return call SubPacket.payloadLength(msg) + - sizeof(linkest_header_t) + - sizeof(linkest_footer_t)*(NUM_ENTRIES_FLAG & hdr->flags); + } + + // account for the space used by header and footer + // while setting the payload length + command void Packet.setPayloadLength(message_t* msg, uint8_t len) { + linkest_header_t *hdr; + hdr = getHeader(msg); + call SubPacket.setPayloadLength(msg, + len + + sizeof(linkest_header_t) + + sizeof(linkest_footer_t)*(NUM_ENTRIES_FLAG & hdr->flags)); + } + + command uint8_t Packet.maxPayloadLength() { + return call SubPacket.maxPayloadLength() - sizeof(linkest_header_t); + } + + // application payload pointer is just past the link estimation header + command void* Packet.getPayload(message_t* msg, uint8_t* len) { + uint8_t* payload = call SubPacket.getPayload(msg, len); + linkest_header_t *hdr; + hdr = getHeader(msg); + if (len != NULL) { + *len = *len - sizeof(linkest_header_t) - sizeof(linkest_footer_t)*(NUM_ENTRIES_FLAG & hdr->flags); + } + return payload + sizeof(linkest_header_t); + } +} + diff --git a/tos/lib/net/le/LinkSrcPacket.nc b/tos/lib/net/le/LinkSrcPacket.nc new file mode 100644 index 00000000..f19433fc --- /dev/null +++ b/tos/lib/net/le/LinkSrcPacket.nc @@ -0,0 +1,35 @@ +/* $Id$ */ +/* + * "Copyright (c) 2005 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ + +/* + * @author Rodrigo Fonseca + * Based on MintRoute, by Philip Buonadonna, Alec Woo, Terence Tong, Crossbow + * @date $Date$ + */ + +// Om: added the keyword "command" + +interface LinkSrcPacket { + /** Returns the am_addr of the link this message came from */ + command am_addr_t getSrc(message_t* msg); +} diff --git a/tos/lib/printf/PrintfC.nc b/tos/lib/printf/PrintfC.nc new file mode 100644 index 00000000..ec3ae397 --- /dev/null +++ b/tos/lib/printf/PrintfC.nc @@ -0,0 +1,52 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +#include "printf.h" + +configuration PrintfC { + provides { + interface SplitControl as PrintfControl; + interface PrintfFlush; + } +} +implementation { + components SerialActiveMessageC; + components new SerialAMSenderC(AM_PRINTFMSG); + components PrintfP; + components LedsC; + + PrintfControl = PrintfP; + PrintfFlush = PrintfP; + + PrintfP.Leds -> LedsC; + PrintfP.SerialControl -> SerialActiveMessageC; + PrintfP.AMSend -> SerialAMSenderC; + PrintfP.Packet -> SerialAMSenderC; +} + diff --git a/tos/lib/printf/PrintfFlush.nc b/tos/lib/printf/PrintfFlush.nc new file mode 100644 index 00000000..64b247fe --- /dev/null +++ b/tos/lib/printf/PrintfFlush.nc @@ -0,0 +1,36 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +#include "printf.h" + +interface PrintfFlush +{ + command error_t flush(); + event void flushDone(error_t error); +} diff --git a/tos/lib/printf/PrintfP.nc b/tos/lib/printf/PrintfP.nc new file mode 100644 index 00000000..608c4ea7 --- /dev/null +++ b/tos/lib/printf/PrintfP.nc @@ -0,0 +1,164 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +#include "printf.h" + +#ifdef _H_atmega128hardware_H +static int uart_putchar(char c, FILE *stream); +static FILE atm128_stdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); +#endif + +module PrintfP { + provides { + interface SplitControl as PrintfControl; + interface PrintfFlush; + } + uses { + interface SplitControl as SerialControl; + interface Leds; + interface AMSend; + interface Packet; + } +} +implementation { + + enum { + S_STARTED, + S_STOPPED, + S_FLUSHING, + }; + + message_t printfMsg; + nx_uint8_t buffer[PRINTF_BUFFER_SIZE]; + norace nx_uint8_t* next_byte; + uint8_t state = S_STOPPED; + uint8_t bytes_left_to_flush; + uint8_t length_to_send; + + task void retrySend() { + if(call AMSend.send(AM_BROADCAST_ADDR, &printfMsg, sizeof(PrintfMsg)) != SUCCESS) + post retrySend(); + } + + void sendNext() { + PrintfMsg* m = (PrintfMsg*)call Packet.getPayload(&printfMsg, NULL); + length_to_send = (bytes_left_to_flush < sizeof(PrintfMsg)) ? bytes_left_to_flush : sizeof(PrintfMsg); + memset(m->buffer, 0, sizeof(printfMsg)); + memcpy(m->buffer, (uint8_t*)next_byte, length_to_send); + if(call AMSend.send(AM_BROADCAST_ADDR, &printfMsg, sizeof(PrintfMsg)) != SUCCESS) + post retrySend(); + else { + bytes_left_to_flush -= length_to_send; + next_byte += length_to_send; + } + } + + command error_t PrintfControl.start() { + if(state == S_STOPPED) + return call SerialControl.start(); + return FAIL; + } + + command error_t PrintfControl.stop() { + if(state == S_STARTED) + return call SerialControl.stop(); + return FAIL; + } + + event void SerialControl.startDone(error_t error) { + if(error != SUCCESS) { + signal PrintfControl.startDone(error); + return; + } +#ifdef _H_atmega128hardware_H + stdout = &atm128_stdout; +#endif + atomic { + memset(buffer, 0, sizeof(buffer)); + next_byte = buffer; + bytes_left_to_flush = 0; + length_to_send = 0; + state = S_STARTED; + } + signal PrintfControl.startDone(error); + } + + event void SerialControl.stopDone(error_t error) { + if(error != SUCCESS) { + signal PrintfControl.stopDone(error); + return; + } + atomic state = S_STOPPED; + signal PrintfControl.stopDone(error); + } + + command error_t PrintfFlush.flush() { + atomic { + if(state == S_STARTED && (next_byte > buffer)) { + state = S_FLUSHING; + bytes_left_to_flush = next_byte - buffer; + next_byte = buffer; + } + else return FAIL; + } + sendNext(); + return SUCCESS; + } + + event void AMSend.sendDone(message_t* msg, error_t error) { + if(error == SUCCESS) { + if(bytes_left_to_flush > 0) + sendNext(); + else { + next_byte = buffer; + bytes_left_to_flush = 0; + length_to_send = 0; + atomic state = S_STARTED; + signal PrintfFlush.flushDone(error); + } + } + else post retrySend(); + } + +#ifdef _H_msp430hardware_h + int putchar(int c) __attribute__((noinline)) @C() @spontaneous() { +#endif +#ifdef _H_atmega128hardware_H + int uart_putchar(char c, FILE *stream) __attribute__((noinline)) @C() @spontaneous() { +#endif + atomic { + if(state == S_STARTED && ((next_byte-buffer+1) < PRINTF_BUFFER_SIZE)) { + *next_byte = c; + next_byte++; + return 0; + } + else return -1; + } + } +} diff --git a/tos/lib/printf/printf.h b/tos/lib/printf/printf.h new file mode 100644 index 00000000..af95c28d --- /dev/null +++ b/tos/lib/printf/printf.h @@ -0,0 +1,47 @@ +/* + * "Copyright (c) 2006 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +#ifndef PRINTF_H +#define PRINTF_H + +#include +#include "message.h" + +#define PRINTF_BUFFER_SIZE 250 + +typedef nx_struct PrintfMsg { + nx_uint8_t buffer[TOSH_DATA_LENGTH]; +} PrintfMsg; + +enum { + AM_PRINTFMSG = 100, +}; + +#endif //PRINTF_H + diff --git a/tos/platforms/eyesIFX/ActiveMessageFilterC.nc b/tos/platforms/eyesIFX/ActiveMessageFilterC.nc new file mode 100644 index 00000000..ebb9a38c --- /dev/null +++ b/tos/platforms/eyesIFX/ActiveMessageFilterC.nc @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * - Revision ------------------------------------------------------------- + * $Revision$ + * $Date$ + * @author: Jan Hauer + * ======================================================================== + */ + + /* This component is the default AM filter component: it does not do anything, + * it uses no RAM and nesC will compile all code away. Its purpose is to allow + * other components to shadow (overwrite) it to implement their own + * filter/statistic component. + */ + +#include "AM.h" +module ActiveMessageFilterC { + provides { + interface AMSend[am_id_t id]; + interface Receive[am_id_t id]; + interface Receive as Snoop[am_id_t id]; + } + uses { + interface AMSend as SubAMSend[am_id_t id]; + interface Receive as SubReceive[am_id_t id]; + interface Receive as SubSnoop[am_id_t id]; + } +} implementation { + + command error_t AMSend.send[am_id_t id](am_addr_t addr, message_t* msg, uint8_t len){ return call SubAMSend.send[id](addr, msg, len);} + command error_t AMSend.cancel[am_id_t id](message_t* msg){ return call SubAMSend.cancel[id](msg);} + command uint8_t AMSend.maxPayloadLength[am_id_t id](){ return call SubAMSend.maxPayloadLength[id]();} + command void* AMSend.getPayload[am_id_t id](message_t* msg){ return call SubAMSend.getPayload[id](msg);} + event void SubAMSend.sendDone[am_id_t id](message_t* msg, error_t error) { signal AMSend.sendDone[id](msg, error); } + default event void AMSend.sendDone[am_id_t id](message_t* msg, error_t error) { return; } + + command void* Receive.getPayload[am_id_t id](message_t* msg, uint8_t* len){ return call SubReceive.getPayload[id](msg, len);} + command uint8_t Receive.payloadLength[am_id_t id](message_t* msg){ return call SubReceive.payloadLength[id](msg);} + event message_t* SubReceive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal Receive.receive[id](msg, payload, len); } + default event message_t* Receive.receive[am_id_t id](message_t* msg, void* payload, uint8_t len){ return msg;} + + command void* Snoop.getPayload[am_id_t id](message_t* msg, uint8_t* len){ return call SubSnoop.getPayload[id](msg, len);} + command uint8_t Snoop.payloadLength[am_id_t id](message_t* msg){ return call SubSnoop.payloadLength[id](msg);} + event message_t* SubSnoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len) { return signal Snoop.receive[id](msg, payload, len); + } + default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* payload, uint8_t len){return msg;} +} diff --git a/tos/platforms/eyesIFX/byte_radio/Uart4b6bPhyC.nc b/tos/platforms/eyesIFX/byte_radio/Uart4b6bPhyC.nc new file mode 100644 index 00000000..364bb494 --- /dev/null +++ b/tos/platforms/eyesIFX/byte_radio/Uart4b6bPhyC.nc @@ -0,0 +1,70 @@ +/* -*- mode:c++; indent-tabs-mode: nil -*- +* Copyright (c) 2006, Technische Universitaet Berlin +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* - Neither the name of the Technische Universitaet Berlin nor the names +* of its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Configuration for the byte radio physical layer. Together with the + * PacketSerializerP the UartPhyP module turns byte streams into packets. + * This one 4b6b encodes/decodes a byte stream + * + * @see PacketSerializerP + * + * @author Philipp Huppertz + */ + +configuration Uart4b6bPhyC +{ + provides{ + interface PhyPacketTx; + interface RadioByteComm as SerializerRadioByteComm; + interface PhyPacketRx; + interface UartPhyControl; + } + uses { + interface RadioByteComm; + } +} +implementation +{ + components + new Alarm32khz16C() as RxByteTimer, + Uart4b6bPhyP, + // PlatformLedsC, + MainC; + + MainC.SoftwareInit -> Uart4b6bPhyP; + PhyPacketRx = Uart4b6bPhyP; + SerializerRadioByteComm = Uart4b6bPhyP; + RadioByteComm = Uart4b6bPhyP; + PhyPacketTx = Uart4b6bPhyP; + UartPhyControl = Uart4b6bPhyP; + + Uart4b6bPhyP.RxByteTimer -> RxByteTimer; +// PlatformLedsC.Led3 <- Uart4b6bPhyP.Led3; +// PlatformLedsC.Led1 <- Uart4b6bPhyP.Led1; +} diff --git a/tos/platforms/eyesIFX/byte_radio/Uart4b6bPhyP.nc b/tos/platforms/eyesIFX/byte_radio/Uart4b6bPhyP.nc new file mode 100644 index 00000000..c91e73f2 --- /dev/null +++ b/tos/platforms/eyesIFX/byte_radio/Uart4b6bPhyP.nc @@ -0,0 +1,379 @@ +/* -*- mode:c++; indent-tabs-mode: nil -*- + * Copyright (c) 2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "code4b6b.h" + +/** + * Implementation of the physical layer for the eyesIFX byte radio. + * Together with the PacketSerializerP this module turns byte streams + * into packets. + * + * @author Andreas Koepke + */ +module Uart4b6bPhyP { + provides { + interface Init; + interface PhyPacketTx; + interface RadioByteComm as SerializerRadioByteComm; + interface PhyPacketRx; + interface UartPhyControl; + } + uses { + interface RadioByteComm; + interface Alarm as RxByteTimer; + // interface GeneralIO as Led3; + } +} +implementation +{ + /* Module Definitions */ + typedef enum { + STATE_PREAMBLE, + STATE_PREAMBLE_CODE, + STATE_SYNC, + STATE_SFD1, + STATE_SFD2, + STATE_SFD3, + STATE_HEADER_DONE, + STATE_DATA_HIGH_OR_SFD, + STATE_DATA_HIGH, + STATE_DATA_MIDDLE, + STATE_DATA_LOW, + STATE_DATA_LOW_FOOTER, + STATE_FOOTER_START, + STATE_FOOTER_DONE + } phyState_t; + + /* constants */ + enum { + PREAMBLE_LENGTH=2, + BYTE_TIME=11, + PREAMBLE_BYTE=0x55, + SYNC_BYTE=0xFF, + SFD_BYTE=0x83 + }; + + /** Module Global Variables */ + phyState_t phyState; // Current Phy state State + uint16_t preambleCount; + uint16_t numPreambles; // Number of preambles to send before the packet + uint8_t byteTime; // max. time between two bytes + uint8_t bufByte; + /* Local Function Declarations */ + void TransmitNextByte(); + void ReceiveNextByte(uint8_t data); + + /* Radio Init */ + command error_t Init.init(){ + atomic { + phyState = STATE_PREAMBLE; + numPreambles = PREAMBLE_LENGTH; + byteTime = BYTE_TIME; + } + return SUCCESS; + } + + async command error_t UartPhyControl.setNumPreambles(uint16_t numPreambleBytes) { + atomic { + numPreambles = numPreambleBytes; + } + return SUCCESS; + } + + command error_t UartPhyControl.setByteTimeout(uint8_t byteTimeout) { + if (call RxByteTimer.isRunning() == TRUE) { + return FAIL; + } else { + byteTime = byteTimeout * 33; + return SUCCESS; + } + } + + async command bool UartPhyControl.isBusy() { + return phyState != STATE_PREAMBLE; + } + + void resetState() { + call RxByteTimer.stop(); + switch(phyState) { + case STATE_PREAMBLE: + case STATE_PREAMBLE_CODE: + case STATE_SFD2: + break; + default: + signal PhyPacketRx.recvFooterDone(FAIL); + break; + } + phyState = STATE_PREAMBLE; + } + + async event void RxByteTimer.fired() { + // no bytes have arrived, so... + resetState(); + } + + async command void PhyPacketTx.sendHeader() { + phyState = STATE_PREAMBLE; + preambleCount = numPreambles; + TransmitNextByte(); + } + + async command void SerializerRadioByteComm.txByte(uint8_t data) { + uint8_t high = nibbleToSixBit[(data & 0xf0) >> 4]; + uint8_t low = nibbleToSixBit[data & 0x0f]; + if(phyState == STATE_DATA_HIGH) { + high <<= 2; + if(low & 0x20) high |= 2; + if(low & 0x10) high |= 1; + bufByte = low << 4; + call RadioByteComm.txByte(high); + phyState = STATE_DATA_MIDDLE; + } + else { + call RadioByteComm.txByte(bufByte | (high >> 2)); + if(high & 0x02) low |= 0x80; + if(high & 0x01) low |= 0x40; + bufByte = low; + phyState = STATE_DATA_LOW; + } + } + + async command bool SerializerRadioByteComm.isTxDone() { + return call RadioByteComm.isTxDone(); + } + + async command void PhyPacketTx.sendFooter() { + if(phyState == STATE_DATA_MIDDLE) { + bufByte |= (nibbleToSixBit[0] >> 2); + phyState = STATE_DATA_LOW_FOOTER; + call RadioByteComm.txByte(bufByte); + } else { + phyState = STATE_FOOTER_START; + TransmitNextByte(); + } + } + + + + /* Radio Recv */ + async command void PhyPacketRx.recvFooter() { + // currently there is no footer + // atomic phyState = STATE_FOOTER_START; + phyState = STATE_PREAMBLE; + call RxByteTimer.stop(); + signal PhyPacketRx.recvFooterDone(SUCCESS); + } + + + /* Tx Done */ + async event void RadioByteComm.txByteReady(error_t error) { + if(error == SUCCESS) { + TransmitNextByte(); + } else { + signal SerializerRadioByteComm.txByteReady(error); + phyState = STATE_PREAMBLE; + } + } + + void TransmitNextByte() { + switch(phyState) { + case STATE_PREAMBLE: + if(preambleCount > 0) { + preambleCount--; + } else { + phyState = STATE_SYNC; + } + call RadioByteComm.txByte(PREAMBLE_BYTE); + break; + case STATE_SYNC: + phyState = STATE_SFD1; + call RadioByteComm.txByte(SYNC_BYTE); + break; + case STATE_SFD1: + phyState = STATE_SFD2; + call RadioByteComm.txByte(SFD_BYTE); + break; + case STATE_SFD2: + phyState = STATE_SFD3; + call RadioByteComm.txByte(SFD_BYTE); + break; + case STATE_SFD3: + phyState = STATE_HEADER_DONE; + call RadioByteComm.txByte(SFD_BYTE); + break; + case STATE_HEADER_DONE: + phyState = STATE_DATA_HIGH; + signal PhyPacketTx.sendHeaderDone(); + break; + case STATE_DATA_HIGH: + signal SerializerRadioByteComm.txByteReady(SUCCESS); + break; + case STATE_DATA_MIDDLE: + signal SerializerRadioByteComm.txByteReady(SUCCESS); + break; + case STATE_DATA_LOW: + call RadioByteComm.txByte(bufByte); + phyState = STATE_DATA_HIGH; + break; + case STATE_DATA_LOW_FOOTER: + phyState = STATE_FOOTER_START; + call RadioByteComm.txByte(bufByte); + break; + case STATE_FOOTER_START: + /* Pseudo-Footer: the MSP430 has two buffers: one for + * transmit, one to store the next byte to be transmitted, + * this footer fills the next-to-transmit buffer, to make + * sure that the last real byte is actually + * transmitted. The byte stored by this call may not be + * transmitted fully or not at all. + */ + phyState = STATE_FOOTER_DONE; + call RadioByteComm.txByte(bufByte); + break; + case STATE_FOOTER_DONE: + phyState = STATE_PREAMBLE; + signal PhyPacketTx.sendFooterDone(); + break; + default: + break; + } + } + + /* Rx Done */ + async event void RadioByteComm.rxByteReady(uint8_t data) { + call RxByteTimer.start(byteTime); + ReceiveNextByte(data); + } + + /* Receive the next Byte from the USART */ + void ReceiveNextByte(uint8_t data) { + uint8_t decodedByte; + uint8_t low; + uint8_t high; + if((data == SFD_BYTE) && (phyState != STATE_SFD2) && (phyState != STATE_DATA_HIGH_OR_SFD)) { + resetState(); + phyState = STATE_SFD1; + call RxByteTimer.start(byteTime<<1); + } + switch(phyState) { + case STATE_PREAMBLE: + low = data & 0xf; + high = data >> 4; + if((low > 0) && (low < 0xf) && (high > 0) && (high < 0xf)) + phyState = STATE_PREAMBLE_CODE; + break; + case STATE_PREAMBLE_CODE: + low = data & 0xf; + high = data >> 4; + if((low == 0) || (low == 0xf) || (high == 0) || (high == 0xf)) + phyState = STATE_PREAMBLE; + break; + case STATE_SFD1: + phyState = STATE_SFD2; + break; + case STATE_SFD2: + if(data == SFD_BYTE) { + call RxByteTimer.start(byteTime<<1); + signal PhyPacketRx.recvHeaderDone(SUCCESS); + phyState = STATE_DATA_HIGH_OR_SFD; + } + else { + resetState(); + } + break; + case STATE_DATA_HIGH_OR_SFD: + if(data != SFD_BYTE) { + decodedByte = sixBitToNibble[data >> 2]; + if(decodedByte != ILLEGAL_CODE) { + bufByte = decodedByte << 2; + bufByte |= data & 0x03; + bufByte <<= 2; + phyState = STATE_DATA_MIDDLE; + } + else { + resetState(); + } + } + else { + phyState = STATE_DATA_HIGH; + } + break; + case STATE_DATA_HIGH: + decodedByte = sixBitToNibble[data >> 2]; + if(decodedByte != ILLEGAL_CODE) { + bufByte = decodedByte << 2; + bufByte |= data & 0x03; + bufByte <<= 2; + phyState = STATE_DATA_MIDDLE; + } + else { + resetState(); + } + break; + case STATE_DATA_MIDDLE: + decodedByte = sixBitToNibble[((bufByte & 0x0f)<<2) | (data >> 4)]; + if(decodedByte != ILLEGAL_CODE) { + phyState = STATE_DATA_LOW; + signal SerializerRadioByteComm.rxByteReady((bufByte & 0xf0) | decodedByte); + bufByte = (data & 0x0f) << 2; + } + else { + resetState(); + } + break; + case STATE_DATA_LOW: + decodedByte = sixBitToNibble[bufByte | (data >> 6)]; + if(decodedByte != ILLEGAL_CODE) { + bufByte = (decodedByte << 4); + decodedByte = sixBitToNibble[data & 0x3f]; + if(decodedByte != ILLEGAL_CODE) { + phyState = STATE_DATA_HIGH; + signal SerializerRadioByteComm.rxByteReady(bufByte | decodedByte); + } + else { + resetState(); + } + } + else { + resetState(); + } + break; + // maybe there will be a time.... we will need this. but for now there is no footer + //case STATE_FOOTER_START: + //phyState = STATE_FOOTER_DONE; + //break; + //case STATE_FOOTER_DONE: + //phyState = STATE_NULL; + //signal PhyPacketRx.recvFooterDone(TRUE); + //break; + default: + break; + } + } +} diff --git a/tos/platforms/eyesIFX/byte_radio/UartManchPhyC.nc b/tos/platforms/eyesIFX/byte_radio/UartManchPhyC.nc new file mode 100644 index 00000000..df0ef43a --- /dev/null +++ b/tos/platforms/eyesIFX/byte_radio/UartManchPhyC.nc @@ -0,0 +1,77 @@ +/* +* Copyright (c) 2006, Technische Universitaet Berlin +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* - Neither the name of the Technische Universitaet Berlin nor the names +* of its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* - Description --------------------------------------------------------- +* +* - Revision ------------------------------------------------------------- +* $Revision$ +* $Date$ +* @author: Philipp Huppertz +* ======================================================================== +*/ + +/** + * Configuration for the byte radio physical layer. Together with the + * PacketSerializerP the UartPhyP module turns byte streams into packets. + * + * @see PacketSerializerP + * + * @author Philipp Huppertz + */ + +configuration UartManchPhyC +{ + provides{ + interface PhyPacketTx; + interface RadioByteComm as SerializerRadioByteComm; + interface PhyPacketRx; + interface UartPhyControl; + } + uses { + interface RadioByteComm; + } +} +implementation +{ + components + new Alarm32khz16C() as RxByteTimer, + UartManchPhyP, +// PlatformLedsC, + MainC; + + MainC.SoftwareInit -> UartManchPhyP; + PhyPacketRx = UartManchPhyP; + SerializerRadioByteComm = UartManchPhyP; + RadioByteComm = UartManchPhyP; + PhyPacketTx = UartManchPhyP; + UartPhyControl = UartManchPhyP; + + UartManchPhyP.RxByteTimer -> RxByteTimer; +// PlatformLedsC.Led0 <- UartManchPhyP.Led0; +// PlatformLedsC.Led1 <- UartManchPhyP.Led1; +} diff --git a/tos/platforms/eyesIFX/byte_radio/UartManchPhyP.nc b/tos/platforms/eyesIFX/byte_radio/UartManchPhyP.nc new file mode 100644 index 00000000..3021ff79 --- /dev/null +++ b/tos/platforms/eyesIFX/byte_radio/UartManchPhyP.nc @@ -0,0 +1,328 @@ +/* -*- mode:c++; indent-tabs-mode: nil -*- + * Copyright (c) 2004, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * - Description --------------------------------------------------------- + * + * - Revision ------------------------------------------------------------- + * $Revision$ + * $Date$ + * @author: Kevin Klues (klues@tkn.tu-berlin.de) + * @author: Philipp Huppertz + * ======================================================================== + */ + +#include "manchester.h" + +/** + * Implementation of the physical layer for the eyesIFX byte radio. + * Together with the PacketSerializerP this module turns byte streams + * into packets. + * + * @author Kevin Klues + * @author Philipp Huppertz + */ +module UartManchPhyP { + provides { + interface Init; + interface PhyPacketTx; + interface RadioByteComm as SerializerRadioByteComm; + interface PhyPacketRx; + interface UartPhyControl; + } + uses { + interface RadioByteComm; + interface Alarm as RxByteTimer; + } +} +implementation +{ + /* Module Definitions */ + typedef enum { + STATE_PREAMBLE, + STATE_PREAMBLE_MANCHESTER, + STATE_SYNC, + STATE_SFD, + STATE_HEADER_DONE, + STATE_DATA_HIGH, + STATE_DATA_LOW, + STATE_FOOTER_START, + STATE_FOOTER_DONE + } phyState_t; + +#define PREAMBLE_LENGTH 4 +#define BYTE_TIME 18 +#define PREAMBLE_BYTE 0x55 +#define SYNC_BYTE 0xFF +#define SFD_BYTE 0x50 + + /** Module Global Variables */ + phyState_t phyState; // Current Phy state State + uint16_t preambleCount; + uint16_t numPreambles; // Number of preambles to send before the packet + uint8_t byteTime; // max. time between two bytes + uint8_t bufByte; + + /* Local Function Declarations */ + void TransmitNextByte(); + void ReceiveNextByte(uint8_t data); + + /* Radio Init */ + command error_t Init.init(){ + atomic { + phyState = STATE_PREAMBLE; + numPreambles = PREAMBLE_LENGTH; + byteTime = BYTE_TIME; + } + return SUCCESS; + } + + async command error_t UartPhyControl.setNumPreambles(uint16_t numPreambleBytes) { + atomic { + numPreambles = numPreambleBytes; + } + return SUCCESS; + } + + command error_t UartPhyControl.setByteTimeout(uint8_t byteTimeout) { + if (call RxByteTimer.isRunning() == TRUE) { + return FAIL; + } else { + atomic byteTime = byteTimeout * 33; + return SUCCESS; + } + } + + async command bool UartPhyControl.isBusy() { + return phyState != STATE_PREAMBLE; + } + + void resetState() { + atomic { + call RxByteTimer.stop(); + switch(phyState) { + case STATE_SYNC: + case STATE_SFD: + signal PhyPacketRx.recvHeaderDone(FAIL); + break; + case STATE_DATA_HIGH: + case STATE_DATA_LOW: + case STATE_FOOTER_START: + signal PhyPacketRx.recvFooterDone(FAIL); + break; + default: + break; + } + phyState = STATE_PREAMBLE; + } + } + + async event void RxByteTimer.fired() { + // no bytes have arrived, so... + resetState(); + } + + async command void PhyPacketTx.sendHeader() { + atomic { + phyState = STATE_PREAMBLE; + preambleCount = numPreambles; + } + TransmitNextByte(); + } + + async command void SerializerRadioByteComm.txByte(uint8_t data) { + bufByte = data; + call RadioByteComm.txByte(manchesterEncodeNibble((bufByte & 0xf0) >> 4)); + phyState = STATE_DATA_LOW; + } + + async command bool SerializerRadioByteComm.isTxDone() { + return call RadioByteComm.isTxDone(); + } + + async command void PhyPacketTx.sendFooter() { + atomic phyState = STATE_FOOTER_START; + TransmitNextByte(); + } + + + /* Radio Recv */ + async command void PhyPacketRx.recvFooter() { + // currently there is no footer + // atomic phyState = STATE_FOOTER_START; + atomic { + phyState = STATE_PREAMBLE; + } + call RxByteTimer.stop(); + signal PhyPacketRx.recvFooterDone(SUCCESS); + } + + + /* Tx Done */ + async event void RadioByteComm.txByteReady(error_t error) { + if(error == SUCCESS) { + TransmitNextByte(); + } else { + atomic { + signal SerializerRadioByteComm.txByteReady(error); + phyState = STATE_PREAMBLE; + } + } + } + + void TransmitNextByte() { + atomic { + switch(phyState) { + case STATE_PREAMBLE: + if(preambleCount > 0) { + preambleCount--; + } else { + phyState = STATE_SYNC; + } + call RadioByteComm.txByte(PREAMBLE_BYTE); + break; + case STATE_SYNC: + phyState = STATE_SFD; + call RadioByteComm.txByte(SYNC_BYTE); + break; + case STATE_SFD: + phyState = STATE_HEADER_DONE; + call RadioByteComm.txByte(SFD_BYTE); + break; + case STATE_HEADER_DONE: + phyState = STATE_DATA_HIGH; + signal PhyPacketTx.sendHeaderDone(); + break; + case STATE_DATA_HIGH: + signal SerializerRadioByteComm.txByteReady(SUCCESS); + break; + case STATE_DATA_LOW: + call RadioByteComm.txByte(manchesterEncodeNibble(bufByte & 0x0f)); + phyState = STATE_DATA_HIGH; + break; + case STATE_FOOTER_START: + /* Pseudo-Footer: the MSP430 has two buffers: one for + * transmit, one to store the next byte to be transmitted, + * this footer fills the next-to-transmit buffer, to make + * sure that the last real byte is actually + * transmitted. The byte stored by this call may not be + * transmitted fully or not at all. + */ + phyState = STATE_FOOTER_DONE; + call RadioByteComm.txByte(manchesterEncodeNibble(bufByte & 0x0f)); + break; + case STATE_FOOTER_DONE: + phyState = STATE_PREAMBLE; + signal PhyPacketTx.sendFooterDone(); + break; + default: + break; + } + } + } + + /* Rx Done */ + async event void RadioByteComm.rxByteReady(uint8_t data) { + call RxByteTimer.start(byteTime); + ReceiveNextByte(data); + } + + /* Receive the next Byte from the USART */ + void ReceiveNextByte(uint8_t data) { + uint8_t decodedByte; + atomic { + switch(phyState) { + case STATE_SYNC: + if(data != PREAMBLE_BYTE) { + if (data == SFD_BYTE) { + signal PhyPacketRx.recvHeaderDone(SUCCESS); + phyState = STATE_DATA_HIGH; + } else { + phyState = STATE_SFD; + } + } + break; + case STATE_SFD: + if (data == SFD_BYTE) { + signal PhyPacketRx.recvHeaderDone(SUCCESS); + phyState = STATE_DATA_HIGH; + } else { + phyState = STATE_PREAMBLE; + } + break; + case STATE_PREAMBLE: + if(data == PREAMBLE_BYTE) { + phyState = STATE_SYNC; + } + else if(manchesterDecodeByte(data) != 0xff) { + phyState = STATE_PREAMBLE_MANCHESTER; + } + break; + case STATE_PREAMBLE_MANCHESTER: + if(data == PREAMBLE_BYTE) { + phyState = STATE_SYNC; + } + else if(manchesterDecodeByte(data) == 0xff) { + phyState = STATE_PREAMBLE; + } + break; + case STATE_DATA_HIGH: + decodedByte = manchesterDecodeByte(data); + if(decodedByte != 0xff) { + bufByte = decodedByte << 4; + phyState = STATE_DATA_LOW; + } + else { + resetState(); + } + break; + case STATE_DATA_LOW: + decodedByte = manchesterDecodeByte(data); + if(decodedByte != 0xff) { + bufByte |= decodedByte; + phyState = STATE_DATA_HIGH; + signal SerializerRadioByteComm.rxByteReady(bufByte); + } + else { + resetState(); + } + break; + // maybe there will be a time.... we will need this. but for now there is no footer + //case STATE_FOOTER_START: + //phyState = STATE_FOOTER_DONE; + //break; + //case STATE_FOOTER_DONE: + //phyState = STATE_NULL; + //signal PhyPacketRx.recvFooterDone(TRUE); + //break; + default: + break; + } + } + } + +} diff --git a/tos/platforms/eyesIFX/byte_radio/code4b6b.h b/tos/platforms/eyesIFX/byte_radio/code4b6b.h new file mode 100644 index 00000000..f376f86b --- /dev/null +++ b/tos/platforms/eyesIFX/byte_radio/code4b6b.h @@ -0,0 +1,130 @@ +/* -*- mode:c++; indent-tabs-mode: nil -*- + * Copyright (c) 2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * provide functions to encode/decode a 4b 6b stream + * @author Andreas Koepke + * Book: RF Monolithics, Inc: ASH Transceiver Designer's Guide, Okt 2002. + * http://www.rfm.com/products/tr_des24.pdf + */ + +#ifndef CODE_4B_6B_H +#define CODE_4B_6B_H + +enum { + ILLEGAL_CODE = 0xff +}; + +const uint8_t nibbleToSixBit[] = { + 13, // 001101 + 14, // 001110 + 19, // 010011 + 21, // 010101 + 22, // 010110 + 25, // 011001 + 26, // 011010 + 28, // 011100 + 35, // 100011 + 37, // 100101 + 38, // 100110 + 41, // 101001 + 42, // 101010 + 44, // 101100 + 50, // 110010 + 52 // 110100 +}; + +const uint8_t sixBitToNibble[] = { + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + 0x00, + 0x01, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + 0x02, + ILLEGAL_CODE, + 0x03, + 0x04, + ILLEGAL_CODE, + ILLEGAL_CODE, + 0x05, + 0x06, + ILLEGAL_CODE, + 0x07, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + 0x08, + ILLEGAL_CODE, + 0x09, + 0x0a, + ILLEGAL_CODE, + ILLEGAL_CODE, + 0x0b, + 0x0c, + ILLEGAL_CODE, + 0x0d, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + 0x0e, + ILLEGAL_CODE, + 0x0f, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE, + ILLEGAL_CODE +}; + +#endif diff --git a/tos/platforms/eyesIFX/chips/msp430/Msp430Timer32khzMapC.nc b/tos/platforms/eyesIFX/chips/msp430/Msp430Timer32khzMapC.nc new file mode 100644 index 00000000..8c18d511 --- /dev/null +++ b/tos/platforms/eyesIFX/chips/msp430/Msp430Timer32khzMapC.nc @@ -0,0 +1,73 @@ +//$Id$ + +/* "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement + * is hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY + * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + */ + +//@author Cory Sharp + +/* + Msp430Timer32khzMapC presents as paramaterized interfaces all of the 32khz + hardware timers on the MSP430 that are available for compile time allocation + by "new Alarm32khz16C()", "new AlarmMilli32C()", and so on. + + Platforms based on the Msp430 are encouraged to copy in and override this + file, presenting only the hardware timers that are available for allocation + on that platform. +*/ + +configuration Msp430Timer32khzMapC +{ + provides interface Msp430Timer[ uint8_t id ]; + provides interface Msp430TimerControl[ uint8_t id ]; + provides interface Msp430Compare[ uint8_t id ]; +} +implementation +{ + components Msp430TimerC; + + Msp430Timer[0] = Msp430TimerC.TimerB; + Msp430TimerControl[0] = Msp430TimerC.ControlB0; + Msp430Compare[0] = Msp430TimerC.CompareB0; + + Msp430Timer[1] = Msp430TimerC.TimerB; + Msp430TimerControl[1] = Msp430TimerC.ControlB1; + Msp430Compare[1] = Msp430TimerC.CompareB1; + + Msp430Timer[2] = Msp430TimerC.TimerB; + Msp430TimerControl[2] = Msp430TimerC.ControlB2; + Msp430Compare[2] = Msp430TimerC.CompareB2; + + Msp430Timer[3] = Msp430TimerC.TimerB; + Msp430TimerControl[3] = Msp430TimerC.ControlB3; + Msp430Compare[3] = Msp430TimerC.CompareB3; + + Msp430Timer[4] = Msp430TimerC.TimerB; + Msp430TimerControl[4] = Msp430TimerC.ControlB4; + Msp430Compare[4] = Msp430TimerC.CompareB4; + + Msp430Timer[5] = Msp430TimerC.TimerB; + Msp430TimerControl[5] = Msp430TimerC.ControlB5; + Msp430Compare[5] = Msp430TimerC.CompareB5; + + Msp430Timer[6] = Msp430TimerC.TimerB; + Msp430TimerControl[6] = Msp430TimerC.ControlB6; + Msp430Compare[6] = Msp430TimerC.CompareB6; +} + diff --git a/tos/platforms/eyesIFX/chips/msp430/Msp430Uart0C.nc b/tos/platforms/eyesIFX/chips/msp430/Msp430Uart0C.nc new file mode 100644 index 00000000..0cf129cc --- /dev/null +++ b/tos/platforms/eyesIFX/chips/msp430/Msp430Uart0C.nc @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2005-2006 Arched Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * An implementation of the UART on USART0 for the MSP430. + * @author Vlado Handziski + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +#include "msp430usart.h" + +generic configuration Msp430Uart0C() { + + provides interface Resource; provides interface ResourceRequested; + provides interface UartStream; + provides interface UartByte; + provides interface Msp430UartControl as UartControl; + + uses interface Msp430UartConfigure; +} + +implementation { + + enum { + CLIENT_ID = unique( MSP430_UARTO_BUS ), + }; + + components Msp430Uart0P as UartP; + Resource = UartP.Resource[ CLIENT_ID ]; + UartStream = UartP.UartStream; + UartByte = UartP.UartByte; + UartControl = UartP.UartControl[ CLIENT_ID ]; + Msp430UartConfigure = UartP.Msp430UartConfigure[ CLIENT_ID ]; + + components new Msp430Usart0C() as UsartC; + ResourceRequested = UsartC.ResourceRequested; + UartP.ResourceConfigure[ CLIENT_ID ] <- UsartC.ResourceConfigure; + UartP.UsartResource[ CLIENT_ID ] -> UsartC.Resource; + UartP.UsartInterrupts -> UsartC.HplMsp430UsartInterrupts; + +} diff --git a/tos/platforms/eyesIFX/chips/msp430/Msp430Usart0C.nc b/tos/platforms/eyesIFX/chips/msp430/Msp430Usart0C.nc new file mode 100644 index 00000000..e73993dd --- /dev/null +++ b/tos/platforms/eyesIFX/chips/msp430/Msp430Usart0C.nc @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2005-2006 Arched Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Provides an interface for USART0 on the MSP430. + * + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +generic configuration Msp430Usart0C() { + + provides interface Resource; + provides interface ResourceRequested; + provides interface ArbiterInfo; + provides interface HplMsp430Usart; + provides interface HplMsp430UsartInterrupts; + provides interface HplMsp430I2CInterrupts; + + uses interface ResourceConfigure; +} + +implementation { + + enum { + CLIENT_ID = unique( MSP430_HPLUSART0_RESOURCE ), + }; + + components Msp430UsartShare0P as UsartShareP; + + Resource = UsartShareP.Resource[ CLIENT_ID ]; + ResourceRequested = UsartShareP.ResourceRequested[ CLIENT_ID ]; + ResourceConfigure = UsartShareP.ResourceConfigure[ CLIENT_ID ]; + ArbiterInfo = UsartShareP.ArbiterInfo; + HplMsp430UsartInterrupts = UsartShareP.Interrupts[ CLIENT_ID ]; + HplMsp430I2CInterrupts = UsartShareP.I2CInterrupts[ CLIENT_ID ]; + + components HplMsp430Usart0C as UsartC; + HplMsp430Usart = UsartC; + +} diff --git a/tos/platforms/eyesIFX/chips/msp430/Msp430UsartShare0P.nc b/tos/platforms/eyesIFX/chips/msp430/Msp430UsartShare0P.nc new file mode 100644 index 00000000..ff0ca805 --- /dev/null +++ b/tos/platforms/eyesIFX/chips/msp430/Msp430UsartShare0P.nc @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2005-2006 Arched Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author Jonathan Hui + * @version $Revision$ $Date$ + */ + +configuration Msp430UsartShare0P { + + provides interface HplMsp430UsartInterrupts as Interrupts[ uint8_t id ]; + provides interface HplMsp430I2CInterrupts as I2CInterrupts[ uint8_t id ]; + provides interface Resource[ uint8_t id ]; + provides interface ResourceRequested[ uint8_t id ]; + provides interface ArbiterInfo; + + uses interface ResourceConfigure[ uint8_t id ]; +} + +implementation { + + components new Msp430UsartShareP() as UsartShareP; + Interrupts = UsartShareP; + I2CInterrupts = UsartShareP; + UsartShareP.RawInterrupts -> UsartC; + UsartShareP.RawI2CInterrupts -> UsartC; + + components new FcfsArbiterC( MSP430_HPLUSART0_RESOURCE ) as ArbiterC; + Resource = ArbiterC; + ResourceRequested = ArbiterC; + ResourceConfigure = ArbiterC; + ArbiterInfo = ArbiterC; + UsartShareP.ArbiterInfo -> ArbiterC; + +// components new AsyncStdControlDeferredPowerManagerC(1) as PowerManagerC; +// PowerManagerC.ResourceController -> ArbiterC; + + components HplMsp430Usart0C as UsartC; + //PowerManagerC.AsyncStdControl -> UsartC; +} diff --git a/tos/platforms/eyesIFX/chips/tda5250/HplTda5250DataIOC.nc b/tos/platforms/eyesIFX/chips/tda5250/HplTda5250DataIOC.nc new file mode 100644 index 00000000..d5b6ce3e --- /dev/null +++ b/tos/platforms/eyesIFX/chips/tda5250/HplTda5250DataIOC.nc @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2004, Technische Universitat Berlin +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* - Neither the name of the Technische Universitat Berlin nor the names +* of its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* - Revision ------------------------------------------------------------- +* $Revision$ +* $Date$ +* ======================================================================== +*/ + + +/** + * Wiring the TDA5250 with the Msp430 Uart abstraction. + * + * @author Philipp Hupertz (huppertz@tkn.tu-berlin.de) + */ +configuration HplTda5250DataIOC { + provides { + interface Resource; + interface ResourceRequested; + interface UartStream; + interface HplTda5250DataControl as UartDataControl; + } +} +implementation { + + components + new Msp430Uart0C(), + HplTda5250DataIOP; + + Resource = Msp430Uart0C.Resource; + ResourceRequested = Msp430Uart0C.ResourceRequested; + UartStream = Msp430Uart0C.UartStream; + UartDataControl = HplTda5250DataIOP.UartDataControl; + + HplTda5250DataIOP.Msp430UartControl -> Msp430Uart0C.UartControl; + HplTda5250DataIOP.UartResourceConfigure <- Msp430Uart0C.Msp430UartConfigure; +} diff --git a/tos/platforms/eyesIFX/chips/tda5250/HplTda5250DataIOP.nc b/tos/platforms/eyesIFX/chips/tda5250/HplTda5250DataIOP.nc new file mode 100644 index 00000000..97860d47 --- /dev/null +++ b/tos/platforms/eyesIFX/chips/tda5250/HplTda5250DataIOP.nc @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2004, Technische Universitat Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitat Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * - Revision ------------------------------------------------------------- + * $Revision$ + * $Date$ + * ======================================================================== + */ + +#include "msp430usart.h" +#include "tda5250BusResourceSettings.h" + + /** + * Wrapper module for the Msp430 Uart abstraction. + * + * @author Philipp Hupertz (huppertz@tkn.tu-berlin.de) + */ +module HplTda5250DataIOP { + provides { + interface HplTda5250DataControl as UartDataControl; + interface Msp430UartConfigure as UartResourceConfigure; + } + uses { + interface Msp430UartControl; + } +} + +implementation { + + async command error_t UartDataControl.setToTx() { + call Msp430UartControl.setModeTx(); + return SUCCESS; + } + + async command error_t UartDataControl.setToRx() { + call Msp430UartControl.setModeRx(); + return SUCCESS; + } + + async command msp430_uart_config_t* UartResourceConfigure.getConfig() { + return &tda5250_uart_config; + } + +} diff --git a/tos/platforms/eyesIFX/chips/tda5250/Tda5250ASKNFSKFakePinP.nc b/tos/platforms/eyesIFX/chips/tda5250/Tda5250ASKNFSKFakePinP.nc new file mode 100644 index 00000000..08a3995c --- /dev/null +++ b/tos/platforms/eyesIFX/chips/tda5250/Tda5250ASKNFSKFakePinP.nc @@ -0,0 +1,18 @@ +/* +* The ASKNFSK Pin is not connected on the eyes platforms... +*/ + +module Tda5250ASKNFSKFakePinP { + provides interface GeneralIO; +} + +implementation { + async command void GeneralIO.set(){} + async command void GeneralIO.clr(){} + async command void GeneralIO.toggle(){} + async command bool GeneralIO.get(){ return FALSE; } + async command void GeneralIO.makeInput(){} + async command bool GeneralIO.isOutput() { return FALSE; } + async command void GeneralIO.makeOutput(){} + async command bool GeneralIO.isInput() { return FALSE; } +} diff --git a/tos/platforms/eyesIFX/chips/tda5250/tda5250BusResourceSettings.h b/tos/platforms/eyesIFX/chips/tda5250/tda5250BusResourceSettings.h new file mode 100644 index 00000000..38261861 --- /dev/null +++ b/tos/platforms/eyesIFX/chips/tda5250/tda5250BusResourceSettings.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2006, Technische Universitat Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitat Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * - Revision ------------------------------------------------------------- + * $Revision$ + * $Date$ + * ======================================================================== + */ + +#include "msp430usart.h" + +#ifndef TDA5250BUSRESOURCEID_H +#define TDA5250BUSRESOURCEID_H + +enum { + TDA5250_UART_BUS_ID = unique(MSP430_UARTO_BUS) +}; + +msp430_uart_config_t tda5250_uart_config = {ubr: UBR_1MHZ_38400, umctl: UMCTL_1MHZ_38400, ssel: 0x02, pena: 0, pev: 0, spb: 0, clen: 1, listen: 0, mm: 0, ckpl: 0, urxse: 0, urxeie: 1, urxwie: 0}; + + +#endif diff --git a/tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45dbC.nc b/tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45dbC.nc new file mode 100644 index 00000000..860e5efc --- /dev/null +++ b/tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45dbC.nc @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2006, Technische Universitat Berlin +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* - Neither the name of the Technische Universitat Berlin nor the names +* of its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +configuration HplAt45dbC { + provides interface HplAt45db; +} +implementation { + + components new HplAt45dbByteC(9), + new Msp430Spi0C() as Spi, + HplAt45dbP, + HplMsp430GeneralIOC as MspGeneralIO, + new Msp430GpioC() as Select; + + HplAt45db = HplAt45dbByteC; + + HplAt45dbByteC.Resource -> Spi; + HplAt45dbByteC.FlashSpi -> Spi; + HplAt45dbByteC.HplAt45dbByte -> HplAt45dbP; + + Select -> MspGeneralIO.Port17; + HplAt45dbP.Select -> Select; + HplAt45dbP.FlashSpi -> Spi; +} diff --git a/tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45dbP.nc b/tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45dbP.nc new file mode 100644 index 00000000..d752b6bc --- /dev/null +++ b/tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45dbP.nc @@ -0,0 +1,69 @@ +/* +* Copyright (c) 2006, Technische Universitat Berlin +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* - Neither the name of the Technische Universitat Berlin nor the names +* of its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +module HplAt45dbP { + provides { + interface HplAt45dbByte; + } + uses { + interface SpiByte as FlashSpi; + interface GeneralIO as Select; + } +} +implementation +{ + command void HplAt45dbByte.select() { + call Select.clr(); + } + + command void HplAt45dbByte.deselect() { + call Select.set(); + } + + task void idleTask() { + uint8_t status; + status = call FlashSpi.write(0); + if (!(status & 0x80)) { + post idleTask(); + } else { + signal HplAt45dbByte.idle(); + } + } + + command void HplAt45dbByte.waitIdle() { + post idleTask(); + } + + command bool HplAt45dbByte.getCompareStatus() { + uint8_t status; + status = call FlashSpi.write(0); + return (!(status & 0x40)); + } +} diff --git a/tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45db_chip.h b/tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45db_chip.h new file mode 100644 index 00000000..3a1ef279 --- /dev/null +++ b/tos/platforms/eyesIFX/eyesIFXv2/chips/at45db/HplAt45db_chip.h @@ -0,0 +1,45 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2006 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +#ifndef HPLAT45DB_CHIP_H +#define HPLAT45DB_CHIP_H + +// flash characteristics +enum { + AT45_MAX_PAGES = 2048, + AT45_PAGE_SIZE = 264, + AT45_PAGE_SIZE_LOG2 = 8 // For those who want to ignore the last 8 bytes +}; + +typedef uint16_t at45page_t; +typedef uint16_t at45pageoffset_t; /* must fit 0 to AT45_PAGE_SIZE - 1 */ + +#endif diff --git a/tos/platforms/eyesIFX/sensors/RssiSensorVccP.nc b/tos/platforms/eyesIFX/sensors/RssiSensorVccP.nc new file mode 100644 index 00000000..60459419 --- /dev/null +++ b/tos/platforms/eyesIFX/sensors/RssiSensorVccP.nc @@ -0,0 +1,99 @@ +/* -*- mode:c++ -*- + * Copyright (c) 2004, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitaet Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * - Revision ------------------------------------------------------------- + * $Revision$ + * $Date$ + * @author: Jan Hauer + * ======================================================================== + */ + +/** + * + * Please refer to TEP 109 for more information about this component and its + * intended use. This component provides platform-independent access to the + * RSSI sensor exported by the TDA5250 radio on the eyesIFXv{1,2} platform. + * Note: The radio must be configured to output the RSSI on the pin! + * + * @author Jan Hauer + */ + +#include + +module RssiSensorVccP +{ + provides { + interface ReadNow as ReadNow; + interface Resource as ReadNowResource; + } + uses { + interface Resource as SubResource; + interface Msp430Adc12SingleChannel as SingleChannel; + } +} +implementation +{ + async command error_t ReadNow.read() { + return call SingleChannel.getData(); + } + + async event error_t SingleChannel.singleDataReady(uint16_t data) { + signal ReadNow.readDone(SUCCESS, data); + return FAIL; + } + + async event uint16_t* SingleChannel.multipleDataReady(uint16_t buffer[], uint16_t numSamples){ + return 0; + } + + async command error_t ReadNowResource.request() { + return call SubResource.request(); + } + + async command error_t ReadNowResource.immediateRequest() { + error_t res = call SubResource.immediateRequest(); + if(res == SUCCESS) { + res = call SingleChannel.configureSingle(&sensorconfigurations[RSSI_SENSOR_VCC]); + if(res != SUCCESS) call SubResource.release(); + } + return res; + } + + event void SubResource.granted() { + call SingleChannel.configureSingle(&sensorconfigurations[RSSI_SENSOR_VCC]); + signal ReadNowResource.granted(); + } + + async command error_t ReadNowResource.release() { + return call SubResource.release(); + } + + async command bool ReadNowResource.isOwner() { + return call SubResource.isOwner(); + } +} diff --git a/tos/platforms/intelmote2/BlockStorageC.nc b/tos/platforms/intelmote2/BlockStorageC.nc new file mode 100644 index 00000000..a3fa9753 --- /dev/null +++ b/tos/platforms/intelmote2/BlockStorageC.nc @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Implementation of the block storage abstraction for the pxa271 + * embedded flash. + * + * @author Philip Buonadonna + * @author Kaisen Lin + * @version $Revision$ $Date$ + */ + +generic configuration BlockStorageC( volume_id_t volume_id ) { + + provides interface BlockRead; + provides interface BlockWrite; +} + +implementation { + + enum { + BLOCK_ID = unique( "pxa271p30.Block" ), + }; + + components P30BlockC as BlockC; + BlockRead = BlockC.Read[ volume_id ]; + BlockWrite = BlockC.Write[ volume_id ]; + +} diff --git a/tos/platforms/intelmote2/ConfigStorageC.nc b/tos/platforms/intelmote2/ConfigStorageC.nc new file mode 100644 index 00000000..5d0b93f6 --- /dev/null +++ b/tos/platforms/intelmote2/ConfigStorageC.nc @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Configuration component for storage management on the PXA271 + * + * @author KaisenLin + * @author Phil Buonadonna + */ + +generic configuration ConfigStorageC(volume_id_t vol_id) { + + provides interface Mount; + provides interface ConfigStorage; + +} + +implementation { + enum { + CONFIG_ID = unique( "pxa271p30.Config" ), + }; + + components P30ConfigC as ConfigC; + ConfigStorage = ConfigC.ConfigStorage[ vol_id ]; + Mount = ConfigC.Mount[ vol_id ]; +} diff --git a/tos/platforms/intelmote2/LogStorageC.nc b/tos/platforms/intelmote2/LogStorageC.nc new file mode 100644 index 00000000..ad0b7858 --- /dev/null +++ b/tos/platforms/intelmote2/LogStorageC.nc @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2005 Arch Rock Corporation + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the Arch Rock Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED + * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ +/** + * @author Kaisen Lin + * @author Phil Buonadonna + * + */ +generic configuration LogStorageC( volume_id_t volume_id, bool circular ) { + + provides interface LogRead; + provides interface LogWrite; +} + +implementation { + + enum { + LOG_ID = unique( "pxa271p30.Log" ), + }; + + components P30LogC as LogC; + LogRead = LogC.Read[ volume_id ]; + LogWrite = LogC.Write[ volume_id ]; + + components new P30LogCircularP(circular); + LogC.Circular[ volume_id ] -> P30LogCircularP.Circular; +} diff --git a/tos/platforms/intelmote2/chips/ds2745/DS2745InternalC.nc b/tos/platforms/intelmote2/chips/ds2745/DS2745InternalC.nc new file mode 100644 index 00000000..538d9bec --- /dev/null +++ b/tos/platforms/intelmote2/chips/ds2745/DS2745InternalC.nc @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * + * @author Phil Buonadonna + * @version $Revision$ $Date$ + */ + +configuration DS2745InternalC { + provides interface SplitControl; + provides interface Resource[uint8_t id]; + provides interface HplDS2745[uint8_t id]; +} + +implementation { + components new SimpleFcfsArbiterC( "Ds2745.Resource" ) as Arbiter; + components MainC; + Resource = Arbiter; + + components new HplDS2745LogicP(DS2745_SLAVE_ADDR) as Logic; + MainC.SoftwareInit -> Logic; + + components new HalPXA27xI2CMasterC(TRUE) as I2CC; + Logic.I2CPacket -> I2CC; + + components HplPXA27xGPIOC; + I2CC.I2CSCL -> HplPXA27xGPIOC.HplPXA27xGPIOPin[I2C_SCL]; + I2CC.I2CSDA -> HplPXA27xGPIOC.HplPXA27xGPIOPin[I2C_SDA]; + + components DS2745InternalP as Internal; + HplDS2745 = Internal.HplDS2745; + Internal.ToHPLC -> Logic.HplDS2745; + + SplitControl = Logic; + +} diff --git a/tos/platforms/intelmote2/chips/ds2745/DS2745InternalP.nc b/tos/platforms/intelmote2/chips/ds2745/DS2745InternalP.nc new file mode 100644 index 00000000..e4845f4d --- /dev/null +++ b/tos/platforms/intelmote2/chips/ds2745/DS2745InternalP.nc @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arched Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * + * @author Phil Buonadonna + * @version $Revision$ $Date$ + */ + +module DS2745InternalP { + provides interface HplDS2745[uint8_t id]; + uses interface HplDS2745 as ToHPLC; +} + +implementation { + uint8_t currentId; + + command error_t HplDS2745.setConfig[uint8_t id](uint8_t val) { + currentId = id; + return call ToHPLC.setConfig(val); + } + command error_t HplDS2745.measureTemperature[uint8_t id]() { + currentId = id; + return call ToHPLC.measureTemperature(); + } + command error_t HplDS2745.measureVoltage[uint8_t id]() { + currentId = id; + return call ToHPLC.measureVoltage(); + } + command error_t HplDS2745.measureCurrent[uint8_t id]() { + currentId = id; + return call ToHPLC.measureCurrent(); + } + command error_t HplDS2745.measureAccCurrent[uint8_t id]() { + currentId = id; + return call ToHPLC.measureAccCurrent(); + } + command error_t HplDS2745.setOffsetBias[uint8_t id](int8_t val) { + currentId = id; + return call ToHPLC.setOffsetBias(val); + } + command error_t HplDS2745.setAccOffsetBias[uint8_t id](int8_t val) { + currentId = id; + return call ToHPLC.setAccOffsetBias(val); + } + + async event void ToHPLC.setConfigDone(error_t error) { + signal HplDS2745.setConfigDone[currentId](error); + } + async event void ToHPLC.measureTemperatureDone(error_t result, uint16_t val) { + signal HplDS2745.measureTemperatureDone[currentId](result, val); + } + async event void ToHPLC.measureVoltageDone(error_t result, uint16_t val) { + signal HplDS2745.measureVoltageDone[currentId](result, val); + } + async event void ToHPLC.measureCurrentDone(error_t result, uint16_t val) { + signal HplDS2745.measureCurrentDone[currentId](result, val); + } + async event void ToHPLC.measureAccCurrentDone(error_t result, uint16_t val) { + signal HplDS2745.measureAccCurrentDone[currentId](result, val); + } + async event void ToHPLC.setOffsetBiasDone(error_t error) { + signal HplDS2745.setOffsetBiasDone[currentId](error); + } + async event void ToHPLC.setAccOffsetBiasDone(error_t error) { + signal HplDS2745.setAccOffsetBiasDone[currentId](error); + } + + default async event void HplDS2745.setConfigDone[uint8_t id]( error_t error ){ return; } + default async event void HplDS2745.measureTemperatureDone[uint8_t id]( error_t error, uint16_t val ){ return; } + default async event void HplDS2745.measureVoltageDone[uint8_t id]( error_t error, uint16_t val ){ return; } + default async event void HplDS2745.measureCurrentDone[uint8_t id]( error_t error, uint16_t val ){ return; } + default async event void HplDS2745.measureAccCurrentDone[uint8_t id]( error_t error, uint16_t val ){ return; } + default async event void HplDS2745.setOffsetBiasDone[uint8_t id]( error_t error ){ return; } + default async event void HplDS2745.setAccOffsetBiasDone[uint8_t id](error_t error){ return; } + +} + + diff --git a/tos/platforms/tinynode/DemoSensorNowC.nc b/tos/platforms/tinynode/DemoSensorNowC.nc new file mode 100644 index 00000000..028e2314 --- /dev/null +++ b/tos/platforms/tinynode/DemoSensorNowC.nc @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * DemoSensorC is a generic sensor device that provides a 16-bit + * value. The platform author chooses which sensor actually sits + * behind DemoSensorC, and though it's probably Voltage, Light, or + * Temperature, there are no guarantees. + * + * This particular DemoSensorC on the telosb platform provides a + * voltage reading, using VoltageC. + * + * To convert from ADC counts to actual voltage, divide this reading + * by 4096 and multiply by 3. + * + * @author Gilman Tolle + * @version $Revision$ $Date$ + * + */ + +generic configuration DemoSensorNowC() +{ + provides interface Resource; + provides interface ReadNow; +} +implementation +{ + components new Msp430InternalVoltageC() as DemoSensorNow; + + Resource = DemoSensorNow; + ReadNow = DemoSensorNow; +} diff --git a/tos/platforms/tinynode/DemoSensorStreamC.nc b/tos/platforms/tinynode/DemoSensorStreamC.nc new file mode 100644 index 00000000..d94e5eeb --- /dev/null +++ b/tos/platforms/tinynode/DemoSensorStreamC.nc @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * DemoSensorStreamC is a generic sensor device that provides a 16-bit + * value. The platform author chooses which sensor actually sits + * behind DemoSensorStreamC, and though it's probably Voltage, Light, or + * Temperature, there are no guarantees. + * + * This particular DemoSensorStreamC on the telosb platform provides a + * voltage reading, using VoltageStreamC. + * + * To convert from ADC counts to actual voltage, divide this reading + * by 4096 and multiply by 3. + * + * @author Gilman Tolle + * @version $Revision$ $Date$ + * + */ + +generic configuration DemoSensorStreamC() +{ + provides interface ReadStream; +} +implementation +{ + components new VoltageStreamC() as DemoSensor; + ReadStream = DemoSensor; +} diff --git a/tos/platforms/tinynode/VoltageStreamC.nc b/tos/platforms/tinynode/VoltageStreamC.nc new file mode 100644 index 00000000..2c278344 --- /dev/null +++ b/tos/platforms/tinynode/VoltageStreamC.nc @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2005-2006 Arch Rock Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * VoltageC is a common name for the Msp430InternalVoltageC voltage + * sensor available on the telosb platform. + * + * To convert from ADC counts to actual voltage, divide by 4096 and + * multiply by 3. + * + * @author Gilman Tolle + * @version $Revision$ $Date$ + */ + +generic configuration VoltageStreamC() { + provides interface ReadStream; +} +implementation { + components new Msp430InternalVoltageC(); + ReadStream = Msp430InternalVoltageC.ReadStream; +} + diff --git a/tos/platforms/tinynode/chips/at45db/HplAt45dbC.nc b/tos/platforms/tinynode/chips/at45db/HplAt45dbC.nc new file mode 100644 index 00000000..f855342d --- /dev/null +++ b/tos/platforms/tinynode/chips/at45db/HplAt45dbC.nc @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2006, Technische Universitat Berlin +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* - Neither the name of the Technische Universitat Berlin nor the names +* of its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +configuration HplAt45dbC { + provides interface HplAt45db; +} +implementation { + + components new HplAt45dbByteC(9), + new Msp430Spi0C() as Spi, + HplAt45dbP, + HplMsp430GeneralIOC as MspGeneralIO, + new Msp430GpioC() as Select; + + HplAt45db = HplAt45dbByteC; + + HplAt45dbByteC.Resource -> Spi; + HplAt45dbByteC.FlashSpi -> Spi; + HplAt45dbByteC.HplAt45dbByte -> HplAt45dbP; + + Select -> MspGeneralIO.Port47; + HplAt45dbP.Select -> Select; + HplAt45dbP.FlashSpi -> Spi; +} diff --git a/tos/platforms/tinynode/chips/at45db/HplAt45dbP.nc b/tos/platforms/tinynode/chips/at45db/HplAt45dbP.nc new file mode 100644 index 00000000..683e4a88 --- /dev/null +++ b/tos/platforms/tinynode/chips/at45db/HplAt45dbP.nc @@ -0,0 +1,69 @@ +/* +* Copyright (c) 2006, Technische Universitat Berlin +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* - Neither the name of the Technische Universitat Berlin nor the names +* of its contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +module HplAt45dbP { + provides { + interface HplAt45dbByte; + } + uses { + interface SpiByte as FlashSpi; + interface GeneralIO as Select; + } +} +implementation +{ + command void HplAt45dbByte.select() { + call Select.clr(); + } + + command void HplAt45dbByte.deselect() { + call Select.set(); + } + + task void idleTask() { + uint8_t status; + status = call FlashSpi.write(0); + if (!(status & 0x80)) { + post idleTask(); + } else { + signal HplAt45dbByte.idle(); + } + } + + command void HplAt45dbByte.waitIdle() { + post idleTask(); + } + + command bool HplAt45dbByte.getCompareStatus() { + uint8_t status; + status = call FlashSpi.write(0); + return (!(status & 0x40)); + } +} diff --git a/tos/platforms/tinynode/chips/at45db/HplAt45db_chip.h b/tos/platforms/tinynode/chips/at45db/HplAt45db_chip.h new file mode 100644 index 00000000..3a1ef279 --- /dev/null +++ b/tos/platforms/tinynode/chips/at45db/HplAt45db_chip.h @@ -0,0 +1,45 @@ +// $Id$ + +/* tab:4 + * "Copyright (c) 2000-2003 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + * Copyright (c) 2002-2006 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ + +#ifndef HPLAT45DB_CHIP_H +#define HPLAT45DB_CHIP_H + +// flash characteristics +enum { + AT45_MAX_PAGES = 2048, + AT45_PAGE_SIZE = 264, + AT45_PAGE_SIZE_LOG2 = 8 // For those who want to ignore the last 8 bytes +}; + +typedef uint16_t at45page_t; +typedef uint16_t at45pageoffset_t; /* must fit 0 to AT45_PAGE_SIZE - 1 */ + +#endif diff --git a/tos/system/ArbiterP.nc b/tos/system/ArbiterP.nc new file mode 100644 index 00000000..6bb79a24 --- /dev/null +++ b/tos/system/ArbiterP.nc @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2004, Technische Universitat Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitat Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Please refer to TEP 108 for more information about this component and its + * intended use.

    + * + * This component provides the Resource, ResourceRequested, ArbiterInfo, + * and ResourceController interfaces and uses the ResourceConfigure interface as + * described in TEP 108. It provides arbitration to a shared resource. + * An Queue is used to keep track of which users have put + * in requests for the resource. Upon the release of the resource by one + * of these users, the queue is checked and the next user + * that has a pending request will ge granted control of the resource. If + * there are no pending requests, then the user of the ResourceController + * interface gains access to the resource, and holds onto it until + * another user makes a request. + * + * @param resourceName -- The name of the Resource being shared + * + * @author Kevin Klues (klues@tkn.tu-berlin.de) + * @author Philip Levis + */ + +generic module ArbiterP(uint8_t controller_id) { + provides { + interface Resource[uint8_t id]; + interface ResourceRequested[uint8_t id]; + interface ResourceController; + interface ArbiterInfo; + } + uses { + interface ResourceConfigure[uint8_t id]; + interface ResourceQueue as Queue; + interface Leds; + } +} +implementation { + + enum {RES_CONTROLLED, RES_GRANTING, RES_IMM_GRANTING, RES_BUSY}; + enum {CONTROLLER_ID = controller_id}; + + uint8_t state = RES_CONTROLLED; + norace uint8_t resId = CONTROLLER_ID; + norace uint8_t reqResId; + + task void grantedTask(); + + async command error_t Resource.request[uint8_t id]() { + signal ResourceRequested.requested[resId](); + atomic { + if(state == RES_CONTROLLED) { + state = RES_GRANTING; + reqResId = id; + } + else return call Queue.enqueue(id); + } + signal ResourceController.requested(); + return SUCCESS; + } + + async command error_t Resource.immediateRequest[uint8_t id]() { + signal ResourceRequested.immediateRequested[resId](); + atomic { + if(state == RES_CONTROLLED) { + state = RES_IMM_GRANTING; + reqResId = id; + } + else return FAIL; + } + signal ResourceController.immediateRequested(); + if(resId == id) { + call ResourceConfigure.configure[resId](); + return SUCCESS; + } + atomic state = RES_CONTROLLED; + return FAIL; + } + + async command error_t Resource.release[uint8_t id]() { + atomic { + if(state == RES_BUSY && resId == id) { + if(call Queue.isEmpty() == FALSE) { + reqResId = call Queue.dequeue(); + state = RES_GRANTING; + post grantedTask(); + } + else { + resId = CONTROLLER_ID; + state = RES_CONTROLLED; + signal ResourceController.granted(); + } + call ResourceConfigure.unconfigure[id](); + } + } + return FAIL; + } + + async command error_t ResourceController.release() { + atomic { + if(resId == CONTROLLER_ID) { + if(state == RES_GRANTING) { + post grantedTask(); + return SUCCESS; + } + else if(state == RES_IMM_GRANTING) { + resId = reqResId; + state = RES_BUSY; + return SUCCESS; + } + } + } + return FAIL; + } + + /** + Check if the Resource is currently in use + */ + async command bool ArbiterInfo.inUse() { + return TRUE; + } + + /** + Returns the current user of the Resource. + If there is no current user, the return value + will be 0xFF + */ + async command uint8_t ArbiterInfo.userId() { + atomic return resId; + } + + /** + * Returns my user id. + */ + async command uint8_t Resource.isOwner[uint8_t id]() { + atomic { + if(resId == id) return TRUE; + else return FALSE; + } + } + + async command uint8_t ResourceController.isOwner() { + return call Resource.isOwner[CONTROLLER_ID](); + } + + task void grantedTask() { + atomic { + resId = reqResId; + state = RES_BUSY; + } + call ResourceConfigure.configure[resId](); + signal Resource.granted[resId](); + } + + //Default event/command handlers for all of the other + //potential users/providers of the parameterized interfaces + //that have not been connected to. + default event void Resource.granted[uint8_t id]() { + } + default async event void ResourceRequested.requested[uint8_t id]() { + } + default async event void ResourceRequested.immediateRequested[uint8_t id]() { + } + default async event void ResourceController.granted() { + } + default async event void ResourceController.requested() { + call ResourceController.release(); + } + default async event void ResourceController.immediateRequested() { + call ResourceController.release(); + } + default async command void ResourceConfigure.configure[uint8_t id]() { + } + default async command void ResourceConfigure.unconfigure[uint8_t id]() { + } +} diff --git a/tos/system/FcfsResourceQueueC.nc b/tos/system/FcfsResourceQueueC.nc new file mode 100644 index 00000000..7be5ed48 --- /dev/null +++ b/tos/system/FcfsResourceQueueC.nc @@ -0,0 +1,85 @@ +/* + * "Copyright (c) 2005 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +#include "Resource.h" + +generic module FcfsResourceQueueC(uint8_t size) { + provides { + interface Init; + interface ResourceQueue as FcfsQueue; + } +} +implementation { + enum {NO_ENTRY = 0xFF}; + + uint8_t resQ[size]; + uint8_t qHead = NO_ENTRY; + uint8_t qTail = NO_ENTRY; + + command error_t Init.init() { + memset(resQ, NO_ENTRY, sizeof(resQ)); + return SUCCESS; + } + + async command bool FcfsQueue.isEmpty() { + return (qHead == NO_ENTRY); + } + + async command bool FcfsQueue.isEnqueued(resource_client_id_t id) { + return resQ[id] != NO_ENTRY || qTail == id; + } + + async command resource_client_id_t FcfsQueue.dequeue() { + atomic { + if(qHead != NO_ENTRY) { + uint8_t id = qHead; + qHead = resQ[qHead]; + if(qHead == NO_ENTRY) + qTail = NO_ENTRY; + resQ[id] = NO_ENTRY; + return id; + } + return NO_ENTRY; + } + } + + async command error_t FcfsQueue.enqueue(resource_client_id_t id) { + atomic { + if(!(call FcfsQueue.isEnqueued(id))) { + if(qHead == NO_ENTRY) + qHead = id; + else + resQ[qTail] = id; + qTail = id; + return SUCCESS; + } + return EBUSY; + } + } +} diff --git a/tos/system/RoundRobinResourceQueueC.nc b/tos/system/RoundRobinResourceQueueC.nc new file mode 100644 index 00000000..b6d5565b --- /dev/null +++ b/tos/system/RoundRobinResourceQueueC.nc @@ -0,0 +1,93 @@ +/* + * "Copyright (c) 2005 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/** + * + * @author Kevin Klues (klueska@cs.wustl.edu) + * @version $Revision$ + * @date $Date$ + */ + +#include "Resource.h" + +generic module RoundRobinResourceQueueC(uint8_t size) { + provides { + interface Init; + interface ResourceQueue as RoundRobinQueue; + } +} +implementation { + enum {NO_ENTRY = 0xFF}; + + uint8_t resQ[(size-1)/8 + 1]; + uint8_t last = 0; + + void clearEntry(uint8_t id) { + resQ[id / 8] &= ~(1 << (id % 8)); + } + + command error_t Init.init() { + memset(resQ, 0, sizeof(resQ)); + return SUCCESS; + } + + async command bool RoundRobinQueue.isEmpty() { + int i; + atomic { + for (i = 0; i 0) return FALSE; + return TRUE; + } + } + + async command bool RoundRobinQueue.isEnqueued(resource_client_id_t id) { + return resQ[id / 8] & (1 << (id % 8)); + } + + async command resource_client_id_t RoundRobinQueue.dequeue() { + int i; + atomic { + for (i = last+1; ; i++) { + if(i == size) + i = 0; + if (call RoundRobinQueue.isEnqueued(i)) { + clearEntry(i); + last = i; + return i; + } + if (i == last) + break; + } + return NO_ENTRY; + } + } + + async command error_t RoundRobinQueue.enqueue(resource_client_id_t id) { + atomic { + if (!(call RoundRobinQueue.isEnqueued(id))) { + resQ[id / 8] |= 1 << (id % 8); + return SUCCESS; + } + return EBUSY; + } + } +} diff --git a/tos/system/SimpleArbiterP.nc b/tos/system/SimpleArbiterP.nc new file mode 100644 index 00000000..a3cfcae8 --- /dev/null +++ b/tos/system/SimpleArbiterP.nc @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2004, Technische Universitat Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitat Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Please refer to TEP 108 for more information about this component and its + * intended use.

    + * + * This component provides the Resource, ArbiterInfo, and ResourceRequested + * interfaces and uses the ResourceConfigure interface as + * described in TEP 108. It provides arbitration to a shared resource. + * An queue is used to keep track of which users have put + * in requests for the resource. Upon the release of the resource by one + * of these users, the queue is checked and the next user + * that has a pending request will ge granted control of the resource. If + * there are no pending requests, then the resource becomes idle and any + * user can put in a request and immediately receive access to the + * Resource. + * + * @param resourceName -- The name of the Resource being shared + * + * @author Kevin Klues (klues@tkn.tu-berlin.de) + * @author Philip Levis + */ + +generic module SimpleArbiterP() { + provides { + interface Resource[uint8_t id]; + interface ResourceRequested[uint8_t id]; + interface ArbiterInfo; + } + uses { + interface ResourceConfigure[uint8_t id]; + interface ResourceQueue as Queue; + } +} +implementation { + + enum {RES_IDLE = 0, RES_GRANTING = 1, RES_BUSY = 2}; + enum {NO_RES = 0xFF}; + + uint8_t state = RES_IDLE; + norace uint8_t resId = NO_RES; + norace uint8_t reqResId; + + task void grantedTask(); + + async command error_t Resource.request[uint8_t id]() { + signal ResourceRequested.requested[resId](); + atomic { + if(state == RES_IDLE) { + state = RES_GRANTING; + reqResId = id; + post grantedTask(); + return SUCCESS; + } + return call Queue.enqueue(id); + } + } + + async command error_t Resource.immediateRequest[uint8_t id]() { + signal ResourceRequested.immediateRequested[resId](); + atomic { + if(state == RES_IDLE) { + state = RES_BUSY; + resId = id; + call ResourceConfigure.configure[resId](); + return SUCCESS; + } + return FAIL; + } + } + + async command error_t Resource.release[uint8_t id]() { + bool released = FALSE; + atomic { + if(state == RES_BUSY && resId == id) { + if(call Queue.isEmpty() == FALSE) { + reqResId = call Queue.dequeue(); + state = RES_GRANTING; + post grantedTask(); + } + else { + resId = NO_RES; + state = RES_IDLE; + } + released = TRUE; + } + } + if(released == TRUE) { + call ResourceConfigure.unconfigure[id](); + return SUCCESS; + } + return FAIL; + } + + /** + Check if the Resource is currently in use + */ + async command bool ArbiterInfo.inUse() { + atomic { + if (state == RES_IDLE) + return FALSE; + } + return TRUE; + } + + /** + Returns the current user of the Resource. + If there is no current user, the return value + will be 0xFF + */ + async command uint8_t ArbiterInfo.userId() { + atomic return resId; + } + + /** + * Returns whether you are the current owner of the resource or not + */ + async command uint8_t Resource.isOwner[uint8_t id]() { + atomic { + if(resId == id) return TRUE; + else return FALSE; + } + } + + task void grantedTask() { + atomic { + resId = reqResId; + state = RES_BUSY; + } + call ResourceConfigure.configure[resId](); + signal Resource.granted[resId](); + } + + //Default event/command handlers + default event void Resource.granted[uint8_t id]() { + } + default async event void ResourceRequested.requested[uint8_t id]() { + } + default async event void ResourceRequested.immediateRequested[uint8_t id]() { + } + default async command void ResourceConfigure.configure[uint8_t id]() { + } + default async command void ResourceConfigure.unconfigure[uint8_t id]() { + } +} diff --git a/tos/system/SimpleFcfsArbiterC.nc b/tos/system/SimpleFcfsArbiterC.nc new file mode 100644 index 00000000..9d7a7d0a --- /dev/null +++ b/tos/system/SimpleFcfsArbiterC.nc @@ -0,0 +1,94 @@ +/* + * "Copyright (c) 2005 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/* + * Copyright (c) 2004, Technische Universitat Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitat Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Please refer to TEP 108 for more information about this component and its + * intended use.

    + * + * This component provides the Resource, ArbiterInfo, and Resource + * Controller interfaces and uses the ResourceConfigure interface as + * described in TEP 108. It provides arbitration to a shared resource in + * an FCFS fashion. An array is used to keep track of which users have put + * in requests for the resource. Upon the release of the resource by one + * of these users, the array is checked and the next user (in FCFS order) + * that has a pending request will ge granted control of the resource. If + * there are no pending requests, then the resource becomes idle and any + * user can put in a request and immediately receive access to the + * Resource. + * + * @param resourceName -- The name of the Resource being shared + * + * @author Kevin Klues (klues@tkn.tu-berlin.de) + * @author Philip Levis + */ + +generic configuration SimpleFcfsArbiterC(char resourceName[]) { + provides { + interface Resource[uint8_t id]; + interface ResourceRequested[uint8_t id]; + interface ArbiterInfo; + } + uses interface ResourceConfigure[uint8_t id]; +} +implementation { + components MainC; + components new FcfsResourceQueueC(uniqueCount(resourceName)) as Queue; + components new SimpleArbiterP() as Arbiter; + + MainC.SoftwareInit -> Queue; + + Resource = Arbiter; + ResourceRequested = Arbiter; + ArbiterInfo = Arbiter; + ResourceConfigure = Arbiter; + + Arbiter.Queue -> Queue; +} diff --git a/tos/system/SimpleRoundRobinArbiterC.nc b/tos/system/SimpleRoundRobinArbiterC.nc new file mode 100644 index 00000000..86c3b3ea --- /dev/null +++ b/tos/system/SimpleRoundRobinArbiterC.nc @@ -0,0 +1,94 @@ +/* + * "Copyright (c) 2005 Washington University in St. Louis. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL WASHINGTON UNIVERSITY IN ST. LOUIS BE LIABLE TO ANY PARTY + * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING + * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF WASHINGTON + * UNIVERSITY IN ST. LOUIS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * WASHINGTON UNIVERSITY IN ST. LOUIS SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND WASHINGTON UNIVERSITY IN ST. LOUIS HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + * MODIFICATIONS." + */ + +/* + * Copyright (c) 2004, Technische Universitat Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitat Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Please refer to TEP 108 for more information about this component and its + * intended use.

    + * + * This component provides the Resource, ArbiterInfo, and Resource + * Controller interfaces and uses the ResourceConfigure interface as + * described in TEP 108. It provides arbitration to a shared resource in + * an FCFS fashion. An array is used to keep track of which users have put + * in requests for the resource. Upon the release of the resource by one + * of these users, the array is checked and the next user (in FCFS order) + * that has a pending request will ge granted control of the resource. If + * there are no pending requests, then the resource becomes idle and any + * user can put in a request and immediately receive access to the + * Resource. + * + * @param resourceName -- The name of the Resource being shared + * + * @author Kevin Klues (klues@tkn.tu-berlin.de) + * @author Philip Levis + */ + +generic configuration SimpleRoundRobinArbiterC(char resourceName[]) { + provides { + interface Resource[uint8_t id]; + interface ResourceRequested[uint8_t id]; + interface ArbiterInfo; + } + uses interface ResourceConfigure[uint8_t id]; +} +implementation { + components MainC; + components new RoundRobinResourceQueueC(uniqueCount(resourceName)) as Queue; + components new SimpleArbiterP() as Arbiter; + + MainC.SoftwareInit -> Queue; + + Resource = Arbiter; + ResourceRequested = Arbiter; + ArbiterInfo = Arbiter; + ResourceConfigure = Arbiter; + + Arbiter.Queue -> Queue; +} diff --git a/tos/system/SineSensorC.nc b/tos/system/SineSensorC.nc new file mode 100644 index 00000000..cd111231 --- /dev/null +++ b/tos/system/SineSensorC.nc @@ -0,0 +1,45 @@ +/* $Id$ + * Copyright (c) 2006 Intel Corporation + * All rights reserved. + * + * This file is distributed under the terms in the attached INTEL-LICENSE + * file. If you do not find these files, copies can be found by writing to + * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, + * 94704. Attention: Intel License Inquiry. + */ +/** + * The micaZ doesn't have any built-in sensors - the DemoSensor returns + * a constant value of 0xbeef, or just reads the ground value for the + * stream sensor. + * + * @author Philip Levis + * @authod David Gay + */ + +generic module SineSensorC() +{ + provides interface Init; + provides interface Read; +} +implementation { + + uint32_t counter; + + command error_t Init.init() { + counter = TOS_NODE_ID * 40; + return SUCCESS; + } + + task void readTask() { + float val = (float)counter; + val = val / 20.0; + val = sin(val) * 32768.0; + val += 32768.0; + counter++; + signal Read.readDone(SUCCESS, (uint16_t)val); + } + command error_t Read.read() { + post readTask(); + return SUCCESS; + } +} diff --git a/tos/system/State.nc b/tos/system/State.nc new file mode 100644 index 00000000..0b5507f4 --- /dev/null +++ b/tos/system/State.nc @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + + +/** + * State machine interface + * @author David Moss - dmm@rincon.com + */ + +interface State { + + /** + * This will allow a state change so long as the current + * state is S_IDLE. + * @return SUCCESS if the state is change, FAIL if it isn't + */ + async command error_t requestState(uint8_t reqState); + + /** + * Force the state machine to go into a certain state, + * regardless of the current state it's in. + */ + async command void forceState(uint8_t reqState); + + /** + * Set the current state back to S_IDLE + */ + async command void toIdle(); + + /** + * @return TRUE if the state machine is in S_IDLE + */ + async command bool isIdle(); + + /** + * Get the current state + */ + async command uint8_t getState(); + +} diff --git a/tos/system/StateC.nc b/tos/system/StateC.nc new file mode 100644 index 00000000..150641ed --- /dev/null +++ b/tos/system/StateC.nc @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + + +/** + * This is a state controller for any and every component's + * state machine(s). + * + * There are several compelling reasons to use the State module/interface + * in all your components that have any kind of state associated with them: + * + * 1) It provides a unified interface to control any state, which makes + * it easy for everyone to understand your code + * 2) You can easily keep track of multiple state machines in one component + * 3) You could have one state machine control several components + * + * There are three ways to change a component's state: + * > Request a state change + * The state is only changed if the state is currently in S_IDLE. If + * the state changes and access is grated, requestState returns SUCCESS. + * + * > Force a state change + * The state changes no matter what + * + * > toIdle() + * The state changes to S_IDLE, no matter what state the component is in. + * + * S_IDLE is the default state, and is always equal to 0. Therefore, + * setup the enums in your internal component so the IDLE/default state is + * always 0. + * + * @author David Moss - dmm@rincon.com + */ + +#include "State.h" + +generic configuration StateC() { + provides { + interface State; + } +} + +implementation { + components StateImplC; + + State = StateImplC.State[unique(UQ_STATE)]; +} + + + diff --git a/tos/system/StateImplC.nc b/tos/system/StateImplC.nc new file mode 100644 index 00000000..65b37dec --- /dev/null +++ b/tos/system/StateImplC.nc @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * This is a state controller for any and every component's + * state machine(s). + * + * There are several compelling reasons to use the State module/interface + * in all your components that have any kind of state associated with them: + * + * 1) It provides a unified interface to control any state, which makes + * it easy for everyone to understand your code + * 2) You can easily keep track of multiple state machines in one component + * 3) You could have one state machine control several components + * + * There are three ways to change a component's state: + * > Request a state change + * The state is only changed if the state is currently in S_IDLE. If + * the state changes and access is grated, requestState returns SUCCESS. + * + * > Force a state change + * The state changes no matter what + * + * > toIdle() + * The state changes to S_IDLE, no matter what state the component is in. + * + * S_IDLE is the default state, and is always equal to 0. Therefore, + * setup the enums in your internal component so the IDLE/default state is + * always 0. + * + * @author David Moss - dmm@rincon.com + */ + +#include "State.h" + +configuration StateImplC { + provides { + interface State[uint8_t id]; + } +} + +implementation { + components MainC, + StateImplP; + + MainC.SoftwareInit -> StateImplP; + State = StateImplP; + +} + diff --git a/tos/system/StateImplP.nc b/tos/system/StateImplP.nc new file mode 100644 index 00000000..a14ea79a --- /dev/null +++ b/tos/system/StateImplP.nc @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * This is a state controller for any and every component's + * state machine(s). + * + * There are several compelling reasons to use the State module/interface + * in all your components that have any kind of state associated with them: + * + * 1) It provides a unified interface to control any state, which makes + * it easy for everyone to understand your code + * 2) You can easily keep track of multiple state machines in one component + * 3) You could have one state machine control several components + * + * There are three ways to change a component's state: + * > Request a state change + * The state is only changed if the state is currently in S_IDLE. If + * the state changes and access is grated, requestState returns SUCCESS. + * + * > Force a state change + * The state changes no matter what + * + * > toIdle() + * The state changes to S_IDLE, no matter what state the component is in. + * + * S_IDLE is the default state, and is always equal to 0. Therefore, + * setup the enums in your internal component so the IDLE/default state is + * always 0. + * + * @author David Moss - dmm@rincon.com + */ + +#include "State.h" + +module StateImplP { + provides { + interface Init; + interface State[uint8_t id]; + } +} + +implementation { + + /** Each component's state - uniqueCount("State") of them */ + norace uint8_t state[uniqueCount(UQ_STATE)]; + + enum { + S_IDLE = 0, + }; + + /***************** Init Commands ****************/ + command error_t Init.init() { + int i; + for(i = 0; i < uniqueCount(UQ_STATE); i++) { + state[i] = S_IDLE; + } + return SUCCESS; + } + + + /***************** State Commands ****************/ + /** + * This will allow a state change so long as the current + * state is S_IDLE. + * @return SUCCESS if the state is change, FAIL if it isn't + */ + async command error_t State.requestState[uint8_t id](uint8_t reqState) { + error_t returnVal = FAIL; + atomic { + if(reqState == S_IDLE || state[id] == S_IDLE) { + state[id] = reqState; + returnVal = SUCCESS; + } + } + return returnVal; + } + + /** + * Force the state machine to go into a certain state, + * regardless of the current state it's in. + */ + async command void State.forceState[uint8_t id](uint8_t reqState) { + state[id] = reqState; + } + + /** + * Set the current state back to S_IDLE + */ + async command void State.toIdle[uint8_t id]() { + state[id] = S_IDLE; + } + + + /** + * @return TRUE if the state machine is in S_IDLE + */ + async command bool State.isIdle[uint8_t id]() { + return state[id] == S_IDLE; + } + + /** + * Get the current state + */ + async command uint8_t State.getState[uint8_t id]() { + return state[id]; + } + +} + diff --git a/tos/types/Resource.h b/tos/types/Resource.h new file mode 100644 index 00000000..19a025c7 --- /dev/null +++ b/tos/types/Resource.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2006, Technische Universitaet Berlin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of the Technische Universitat Berlin nor the names + * of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef RESOURCE_H +#define RESOURCE_H + +typedef uint8_t resource_client_id_t; + +#endif + diff --git a/tos/types/State.h b/tos/types/State.h new file mode 100644 index 00000000..7b3c6b61 --- /dev/null +++ b/tos/types/State.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Arch Rock Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * @author David Moss + */ + +#ifndef STATE_H +#define STATE_H + +#ifndef UQ_STATE +#define UQ_STATE "State" +#endif + +#endif + -- 2.39.2

    =ngpB3?y8;Rv~fnGM* zrfrIBfL2?2RYi+$&=2jEl1{RxI_C{TyvdZ1kYp+EV~irE3PWRi&HeUZ7z6^Bw%ju2Ds8iOifPiQrYjr)GC7RbxNS zJk;P%cQ-7zKF~Be)9WhijDa}8qHQ-F&F}>1jy@0QB1mj_r6VPF^aJ&fK3`UdBv_cQ z3q6oI(hsQ`Gt^kBt`WlsC`C7(Yo62edSal7kN-3fP1YxUI-brcf}aF(Kste#_)PC4 zvLWyMO(wZ9IwKa~Qh%HCy*BSmG1Lu5SgPamqoI?_{pj2ahy3*m>yuRX-!!J##{86f zzJ*Rad#+m$5js1KHfxNoiUL9+<2lLN+fRiDJjPS>u_&*x6_i({Z4bQh@}3{_w?$au zt~EPD8&=OLRiI_JIn43sU%UCr@oc!>5tc#T!M%;sfrOTQk2At^{aCG5xA-@t&Z9Ri zgTK*+-?34dA=j=H%6^AL%H9$oE7-^;Za2+(Pk{Twbox569w39M-knf1qJ-{!cuT12 zp^x(h_uoexGCYoNkUZ$4Ceh;;^T+O2u2TIAGL;&3>#Od-e2cHK%5N9D-TzZL;0p}z zgdW7{v`~~=)6YQJi@PLX-M_^`H4T5CTQHIU+vCbD5{P>Pm|`@ke5YvvH3F!vB2vwg zkck0p(+z?5WRaa*@f#=NG%lW*>T99a*%Iz}uiq#h7c*t7 zQH&=u`SONlz4Xi>iOv0j&}LY$^y6%r)4*x@-l;A5mKg}>5dDc6`4esoit|l4#G?&x z8EEB%U~{q=4~i>bcEihEX-xHfNGkoB_(Ln{{QLL`xvYI%C8xo;fQCq&&?t*d} zA7iK(NREez*m)Je$|cY%F*>uPpE9FI@QBL;#uEwVrX|W!kFDYwtQd>^+k2`8S2h)= zy_O;TKd?yNXv@>}iH_Uho%^V+PNg2i7K~U>g{3iPn{i*g|J-0Rbz3ZBQpckGlZ*Bb zoUVRCp3JPp+N)cCn?L5V6;aVv3QwD3>@f9?7nT<9YkR_k(M!ag!NWv5a!tziMsD** zaYWyCYA^RQEKGH(3Sc~^ewfm&L+EYuTG{z(Gb`=(1*PaU^M;)9z5I%QO}4ePojirp z_HsZN!HT`fLM$dcABc(84i>Aa$ePT4o%HsNdo$?Ty#yvvJ?!7*TX0zveOoravB-4N zt#I+jXjnT*DkH=7RqBh8+o1SzR*GtJyZmXR-EK^1_HR6P%@EaDAp()YBBBWUjA~!m?E^`)E=Z1(QPRYrF2dcJ zIzxTgU0r*SoFUb$Jq^&PG~9aSAWA#bp}OBtg^RN2DZ2q$y*Z`H z$69TIAJ%`Tt0rVo0#Lr437r}{%Sc(R3mgc6PByGhoX~0q?-qXC6Uyr~P?o)yaC#{` zW)jj{zw%ZYu*Je*8I(5Y%ot!kd)ob6!5|pp*VehMxwUsyJ|R2a@)G~}qE1n^Uxo9k zS!g{AMOnPSX|Y6;!+U}#pW=P33zCx^e0gC&HP$84!Lz*g=%VkJUKD4a8mB4tE>`c# z_$AMi5J<(1Oh`m;H8hi;u+ZTd?Xok4U%c430{s=O<-A3p@sjgyUm#a}i4eJkM_zeZ z7oP(ikQ?WzpE7*^MrzHf_?LJqpWcUDq)y#V*QlP!fqh+d^r%vSZXHadazl}g#WfD^ zflS=zJI+0=$M&5|NyD?rczYl3;YSH>k07$vUtml2lsg%xc%Bw?RT1zPaEz`pgf;}t zFIPzv7JhlE40IKtC)n-S?HS5U=el?eKz*{rLL2$Igq^TDVC#eV-|4M3Ba(I&2`ngr zqU{XS5*QbCZ|4i>iOEh@Xy0e0nl>iM&?wl-3>El+&v694Y(b6oS_oRVYN{rYRM!8h zXeRL&LC1;ka^Ls{&2@6j8AO4(J0;!3C(cys!UcVa z<|ORb#M--$R%^_m(|$m5R^$fb!prQnwV9Qc%Rhnc+mc{KBPSM3Htc=RfU}UpAaA?q ztaoCaI8}M>@lc)Tsm*`Js^+M&ZT#w|V`UcneAi}Zs@o;=#2X<4+;B4~; z_HC4C^F{61U&Iei%!_?vSq?(Gll7zRh4r4$_F3-pDI@$D8H2*#FeRalCEBSvb>;L=B^p%lPFJNy}*0A;_ zbf6)QuN=txDGC=OhFmYy;stZ|kE{%io2{_WieJ1?1+b;l^B5*MchVSp>j~P#kV9!m zVY8CyRmwKkTo!O*A;-Xu$+RHa!ZA)V@?x*O9adB!y9TLLBo~sy2ote^d3p36g-+?P zekoZ-B#th(hyWN%a zuthQfnCVnC!9Hz%yohuZ4a7jmq;O3D#PRp@>busbLA*ssc`_U#na1+lk{7=3CPR-H zmE@~J^ul|Zq=sxJV7Ckkw`;uIKUG12#(_N9F6oFjn)^B-4g#{VldM+{cP2g^yM&#Q zqTgLstUMJRPmKYMmYkMva5d-amER=Dccl27Kz9PL`@pGvshZNuZJ1XcYE`gYI?s1o zd3EX0T7Zv^7H_AI8+170p~cDqV0qBi&1{FH`<%};4h)OsbsJW@OTkkTpoq1p^Yd3s zDi?}U?3txc4e*)unj5u`tew;znXwFaP3pIr-+whWyk4MNdb9z?9)?V1Bxv0N7K}L? zEfMn?3q1PRvRnfB-V07(F07N(AK1#QUnAYbG__+2n&+c=)^u-0rqQ4;Tc|Dv^9m6v zkA@uyjbsTRb2^fNX|Kdnis(?k&W6*W3N#e<3DnYpHrFAitc?!}Mx1~pabLiKJS!5J z@fJ=s^wz`1Nx{mf8j3kuU|dxrpHD4vq)A;fb2elUh&v)6&7~vBeRZSreI?pKKfmNU z-M!5G9}_E)BF1gQZhSMze9$ZF_9tY^s%24w*|k|?cdl&bc0la@VLQs-owavM?*?tE z7ryOYFVCC0#%ZuWE00yq@M&M5nHS}2`4qV?4A6CW{|CM*Tym<{^AcEDlzo#GQ1G4b z!OJ&1poD0UDcxb&IQIEN)XkY)v$O}&tJ)&YsDJG_N57;(ruvh?4x6dr$aZrt5j z@DAcwEbQ7{`cHUzdTGy%azh2WAs$Hr3^lJb(In^+S9D2m?I`%hY*#P-fzt_69PkMy z!}%=$E0h}6R!KPZ(_);k7*E`OzXJl1Kc~qh`nn?d+jUV8aoHW zsdV#YE);%9;ed*zT}vKPbt@bjt+6`+RbsF-)@g^@VJcU``8wT=^F~R!JQY*FSPVq$ z5fHFeo3f+VJbI&8(QvheVPr@6*D&~jD$s)OW#axtsoG~9Bm9QHCP<&Gf;NYr;MPU; z9f6_VoKR#}freV;a^n6vvG#|4>GfN&gDHYA){x2X(d`=}xBdh-1=2JbDXwSTL?Rmj ztcM9vuDDJ4C%Ukv{dFZsWw#@nHFR`HupmaLS&q>O5pC*EQDzHY+coKRNso8Wg zAi@|)xTj#6DEw_8x)UlyMUn)W(EaU4rixmDK9G!go`X4@y~p>t`^_4gCy+!pTetoC z@n7?J9g%JUe&aR2iTb@%bQ|#P3K8Y7OR!3qUHcxe}-F2(>V^;j-V{( zX0O6_BOS+@)B~2bPWcCnXk+HO?V3bLdabbRJJXn&O?dwL@y$|#JdLTL-T1qhCn*vq zaU>P|&P?T!GiH1{BGc38q6^PsWGK2rw{J*b2~i&!gkyH$=){!IkG^hrQ*4ep3G=Bc_(6y2tuS--L8-TUlVFZw@nr8?2^g~PS; z*c;?DEj3z4KMR(jF&AsU6rH#JTW=Ld5UY;D$BeD^^fK#Hz>Aru)Cm)IjH9I`u9%P8 zI5VwHM|Ol1NrnSex_~ANy&s6p5iJ2RKSc8bsc85Rs$ol~&Ae&6e^p{Fp{Y-p*wkgl zwP_DDjgEwh+RH3o-RWY87h{$XDK%#}!;aD|P97|biO$;TuOPTrBq*Gs!dqs03h}2( z)coRsY(leBzE?p`p61xZgc(ehxg?qIs&jkNJx^t(G25MTt?Pa974%m+)Q@I!`C0ZQ zH%?MCb}v@4JoRPY8cNzHw=LMyiBp+Z@bTfTX(3m~;J<9r>F4X%#XI7qJI~k}fC2S4KAy zj!T{BP8%HcD9lG9mS?JbI&dstyxrt1GEzrR?xcim-;chm`=TUYp;I1aVpVCK>r1Tn zydw(>^GlXH__egssq#s_T_h*;IQupZ@S#sq-&99h{pb&l`5!U?w8-amMSr>8;!k(p zOJkL4Vg=x87TM}2_kk|SyWgW~bgN9VBRv{4`Qli}za*jIy50NzNWb6rXR^h9dPxz> zCHKpfQ|9o(k~`#TgXaBpbFRq~w$W`d|T>`wGeW)xNkm}y%rQEpe z{+CCOkwEmsnkeN?t9fE^uD@dzOH@nl7IC~^AW^!{ipnf4Cciy3iZ2-ai_@IRzq#W6 z1Y&qDmh!ArqT-hJvs=I^V0}@l{|9lOwODr>@o9WW_u!>!d`M5s`G2_guY8`g#QpTN zJlSb_skU^S^LaR@=`HJNon#Y50^3r=gE0Q1=AVt5>vunEpL%%RcGB(o<+s_L2&pSl zsiAfAVm)jsk$(=~PZhVpSZ#9+EYe9jHGpFB=hf&iT94lEBX}xVqoY45(%`jQ2UDv$ z;DhZC0ct9%V`FMZibKSwftlC)WoDg78ziJjhXUaV^hgd?>t@D ztX??6^r>H%U?>sSR$75FW?S2_m@&DQ@3aTh!3wQXnGg#SVyBH8TfJGgxXx z5=NUxF2IT~9j6Z~dFu(*Poh@24|r|Ye&uANjYNVgw#TMGFiWlbrp~?<-GoWlKit0U zD4m}+J?thQ`^hnMUDXM*R=EWXY7)!aTQDUtg@xbdhEy_n8pz&B+nIPKAimI2%~C1v zh*ngM@5*8RTIDf2Ts+yq{`lmcx_uY)K_nlwEr7e=K6m?Ji`T%ulkWxdY{-@qk+=<) zS1ojo4u1R{rxEydAVe%D;g$Itg)q4akbdz+w`0TrM#M*#Ek^Hvb^|F;`P#&& zb)XCJ#NV$S-vaA%2h0%B4f^xl%|-hG&UX01D0T0zmN$~q=FifQl3cB?tm_@yhP`+l zkLKXsB{g}r*vTzt`j|-$me4zp{tL`_7uTG{}$;^h~RNEh9wJc(|hu zzWNdzX?{0o{vF+omblw7f7rQp+5IoLQ<~HtIKLeQn|6qlNyJCH@oHCZOdCbwMbEqZ}4u+ z`<+AvD5PWe@Zn~@Yd5fKgZlt~VXFm!alZm;S z?JD2P!5xR$awj5IK!o4%@gl4lQ{{+&)C(_DQ>x7S{0+n{dJJ!M6XvCTWbAU7coF^2 zvtLA=k7RT0Qm<_Q2w)r^2(RC=kYOJoTwaYH6x>wev{!>W(hOSP z8XVw!8xpd-EKF$tm!R0H@~ye1>zXRx0HUSIT(WiH`y{yOdxH@KeYGa>OTt?#Ca$kq zJM~V?Z9W@AcEm9SUmNka;!u%N%LAc?`Ne6iVg68`pFRo~WAh zxtmqpD{X$!g{;HQjv!chDFq}4%O2gydj(-vSoJ=6ck?)rH7h^%;UfImaN-ZL@_Ls# z?z*bhwX+N?Z#ikZqqZmbE~&+dRge>LsH1v}05elT!{6NS_W9{JC+m-0l6Q9vdTVB@ z8qQn~sl|l?bGB8>SSW@(k0t&GP0jgl`P9p(CjD2Vb!aciJw7dXsO;=3hgujbwtpAy zk-$xN(TUv7%aDN2hk#{;FicT4B77kmz*~U+utS(6Jb4z=dS!xMg5M)-`FL=I<*WO(R3V#iYQ{`Gf}0KRP-!|y_mrie#usOCf`4Q4+&~no5Q$yritJ8 z6{kjI-nVB9=9!7Q$of2`F|V->iF@+bz)qc9)z9K7ZD$Jb@@guge4#U}~0~kkUK)(|_z-hhD{(ftmK&S;Nud_Ob@S z>-|62ddsk;|2}MZ8x0bIgfuAKB1orzbVxVSY_#MUEl490N~56ksL`D&!a&)8(I8C8 z0n+vG|3CM2JlAs__nXC=efQ$`sq;KP=Qq*-{9&ZSBW*V_c`a=0>w3o8O<;;CqsKw& z{G2dGqUu_DFHRFwjbtuFUt;7Fv0D zkj?a2`=SG$efZ?5aB5YZb%508-u9X~TRRC)X%V@|DAOYCnr}8A&drW85yq%+x1LFV zwVkPX!(+m|2y|$D!$dYq`0uev(=#$0rS?cv`*=?O_Z z;B`(-^T}eG#7nY46M1IyK0)%l*+rC{wx5!8nFL7SZx--)h5Q1bpy zyT3I33lZl@*YpY}dC7Y@p?kL%Y@Zr|aUI8tZ1fQqEfGmQHy1r4A~y#jc!29wk!w)I zNl?Uz;`#l5PS`)B;uj!gs2zDnFdA6q6}?m*;{{|w4buK1Ev@+-K)#Q@WTE{;8NK*8 zORxCy9Uc;~iIW0T$_g{Je%xUsSO2|SM^2bU{md8$V!G^C73Ka?omcqtz<;t>qThB! z=gnxX2(KtLeq!esJ}v8ka_sCCWD}E%!Y6NGdVtWsJ02;4A<## z3yA4IT7Yw-={LtCn>p1xIuj*$&_$6u!AsktV|N@=qpQ#N2>Fnv_>dC8Y6)BV5>es? z|5WGxp{~x&IsSwdF%1maG&2wGR>R#K?GK@fZv>Q|=m!giwe=N( zo<|FOJkIJndPvnZHv-Sz@7wbI?{QmSo)Ro$e-`Khql8EG}!Q z<$H#g>Rdx1-n0XT+gWt?8*#|1YW15sXr;{bh5pc?@&&V(x7SyiFyoKEJzmh-j0Enr zoC|nFj6Tfd{ax0!rZO9C{TrI8CR=yJ*JNkZ_x;3nz{h(CN|0U@G*xIodgDgbQT~a( z(`Y*Uvc2bq#~pQtV&Epk?tQvL!P62;L`*MynL)X7__Ly!ro4?J40a0XGsXMO9aYIx zC9mnvE>!`JSUmpH(Aok)o=;#2xYm`ZDt+hW{ce%A=VU)UME1J>3{uHQ1f&tHP2L!m zX}rM4otetJ2+X-meCj&ag7shY*j&}|_=qNq$keN@U3^G&wlXrAb1d2K-n$N;+$Alb zx;qmoFpW?-v^l{WPe@B;%w@Z{G`jiS5p{f4^q5WYTE|~oQ?_@*?ZXLVNxT@FzwQqW zK?1pgb|jKhpc~Hbo6U|VAl&lPK@OwhIwEphMOGr|Mcq75Bcm$}~Rva!a@_GrWM!KkoFX7X&WH_VTD zsinGe?Az&aF#*&gUkccxVm?A9wf|7WFgb9ni2BnTp}Ns79a`qfL!SIHPqZ=YatU5= zD8B)`V!95^e{tR3E-W#DGbf>AwCm&Ls`!#&c}pSAzm<5*xp#Ef#joiY|FprJaxZ*t zC5`&^n4d`N#1rDClezLmdhf1*EI=;v-Lpt$J4u}h)QlpT z=O_yz)nKivJM646>fGk6$`xgEm{R19W|y`Un@4xUrz2`jZ*NLPyH^L;6fJ;_wz{Y* zq>8xrL~eF#sMovORULvd6Rk>;YXUz$3y={v+?4nMas^EV>HvLb_}s}x zko7I{2!JT(GRRuv$JiQ?dtU`E!mRS+1q_x=Z>@9A)DNSI4o#a+tThh8lfrCF%89(arsy>#ZINz-dmzS&qp3hks)rkWiqZUp*W9u>fqv$P=px2ug`# z0yN_pWWL(ZH_oE|g|FPptWIVNje6*Rr?)KQPmJE|LyTLx;qea_lbj!#3i7t#Z!!nz z7oMpNf|6S?mH?AH{bGKgzCZ%NqKFVEg(0MYoBn8DO1o;X^4tK{uZeNrSx6fY+)*U) zEcKxc!)(QajF|A!DA{@XR8wvEpI$IqP{ARQ(sT^)-WR=_%k6-bXT)7{I7y-xKL{-& ztsPxr>I5!Sr=Nf?e&D;8Ur%i{bj&G)Dk3QPCW+aCz=pHa%~>y_zkn@)?V3Zvd};#c zFXFvPZmkujS=^O{QRnYsHivmH^ntGkr-6cXsewN-0QQSMoZh}OkvVTK=;810u`vY1O?7Yq$y(QK4dCZo0p@V!&Cre=QTRny zFNU3XsEQmmO^TI!_*fU=Hy+S9ZyKzW}FGbYCmm?5G^|o-VFlcgcD5xveldWn^@w? zxSCHo3ffbMxCUDISwb_~Er~p{%)8~SSyQv!cunI4Y}_WK`zj2q&tnFmnpWU_DS;%L z50nkURZ>x9`L)l@IRlRorP7XUfL)4>qZ3lj}3OwED$ zN9_J#MePb3M&+EXy+KMYq$q5y-s&Qq+MK=^KDanRs2>OgG@rj(^U<{*F2{CoOm78f z4qdJF1)Z?ac&lGNf&V)_{C`6RPx$rP$?cG_KN4{{a$41ME?_PjG$=Xhlh#5UM|h_y8wn7}TC~ma#+k-K)IBvXNwVPDV1l=%V(#oo!bLo0c>7`vr?9s(VK|8<9@V z#Ju0cXKS3Mr^2wkHst&57b(9FJ^QN-V*CC|1-+-0vrV5o@1Ui3;$%NWYN_aFs_lFR zS2fbK1^U^1B6x|?S|r9f>TydytYh_m80P##6DW><@l9JSf9s`jk=~d_=kP_BhcE-j zhNGU`#$f*Yr#_xOEFVuE(wr_ROIsH7AT1VJ1-GUT=$GZmPdCMUJEpDg>LiDz96uNM zviG|g>ZChqEVA_gQM4{M!QAPRs%g7M+e+%DC=A+rb`qoYTd6XpXc6HiZFB5%07&&?&XZ0992z_ZhC1j$*_q12?&?5S3#Ahk2tQV)-P@L2R^F+Fexf#}54}%j?`;f;sgySY)E{Fg{S73X5cJ=MKWdZUY@?hw@s>*!74sGr*DOfw6E*=j$b zOU*H3rB7AD@q^;a4S!w#zqv6NmWsLfP4U&2igGPsN8+wG*9QYgGNkNp-hQVHSUA3i zm%Q+RW7ziDe?`N;*i;8?#5Fb|)$Y8^uHXA|*n9a&#Nm_utG$RDCe+ry%y!Yz7x7W3 zP%^H$vgX0C63{Fv)?Rno{bLQ)$S3ZHPOY#>ZW#^@DUOo6!oGI4Nu)|Ig+^sDULiQ+ zrD;?6+nb`|5XfdLugUgK)Ctt#?s7tuiAH&Zh*kr^9A`zltF5XNU-|3YC`lIOr zQb({*XU|3QP3|uYwl{{4)2UKq? zu9FC*y0G-KcK&E3@A z-rhK)-*LPFZQEx#odZ#T>XBiv#*j$(*~L4&pN!1p+RlecKLq+JqBlFkYZERX1bpnR zSawHQas6fXFU@^}Td+xNd=}Z0cGqdGs~oqB`4W|H*YZ3hS(lGtu@0%!afaRy<7UN`c=d*>O(f^YcBS)u^I|Uj^24mY-*ZMelyt z+ZxJdC9m6HC_7+zhBHT>4tUi3wq>d5htqoMP`ox1b(>c$s+y}UB|O@1A~XYS`RRYr zo*O+6wu`>*VH`r~je1JIVXY?~J4M46BG0<^uoBpI8xvMXCL#dS^7tU3d5Z>gIDowNFs>`-9B`>O zyl1vIzQ_F^(Z+wmBS@fK$UH*eBUFceK{rD4#8!CvQ&>~B5x8J*QZw+x0VMCl=2 zR!E@%K5$+ie%^UhIFqFoY`CgZNffZWWjxW=NLOA_3oi~F_#A7LitEj<@G5Ng2KhZ@ z`!KB>^mI0mG;+Ofw|oE=<=+>rX8vo%U8JLLEj|FLPtD`J&yuhec~gqVtet z&vEh(Wf|wTsr&->Z3A4Rnz+NCrD)py6kR?xp^_#RCg@}CJq(nym^0O3caTM`?^--) zv(GiG@E{Pa+A+AoDj4XO%WD1EHlFDg&2X!;sC;&9eX@!Fa-f0kD7vSd*b_qP{g@$( z7MFJG%{$-}&xn7YL{}z?o$_3y9~Px$D5Sj8r0z{y3MqG{WmTpPd0Frk>lYoNUrq}7 zHl%mUbWGdwM?F}nF4OgOdrH>`N*d&0zQ$xR6#UG(MaCW70 zsY(y}LxjQpt)mxlX(RFpZ}&S~IwJk>#ONL453Q?QatV4Vo|9j9zHrMgJ<;5yzc@cU zz_2xq2MU}(*E>nI1B#T;URPD2B}jzrM%6G~XSdiNJPy$$a%QajLagrqagK++7NC3j z!>+s*yVuka5%mO-fqyXvJ-^s8fsaOi&#mzfq0kIoTwV**g8vT>Q#JUWAXZWSz_!T@ zui~;N?k>fgwqk`W)8kFUAFz)(qcD5Q3MqmQW=<)8umvRIyHO*L!`gpLmK1un$G^ep zZBDmvvJ;Kz? zZ3;muuB?o_qkN9VFssevMCG64QeK3^@e4e`!p;#bZ6zHaX$XJ)DxNrW-P&w7`&cRe zHu6+%;e73X2<}ti5w^=dw&kMhKSemZnA-8Ck}#>-+UgJUMV2vJvq&Vifh1>2|nBqx(Q4J-AkOuv?$`QNl)yu@9@eg)Mup<&Zld zxk(##_X}9TJASd>4`rckmHmBtRIJ)Q9H|N-qy#+3tCdtJG&92L8nu68lA0khY04t<5y?Y%fu@25 zo`sgf-98&2Y4OJ70WS|>S6D>hb_vXfs4sCnioq1>QFr4|BeMV(A$sM9DPP*RonkYP zCIro*62rNy`GCE%Y=m5GPCry|F&cmUtqq!tyJC=c~gJyqT+@BXgG}^afMr;D|HnX%^f9_ zP$`p}qLBnkdPx_dwKCZc6Dx1pp2|wTuEe`u_q3=OSY8-5#MM&NJ=pw6bmv5?{K8L( z#bWEP?GMyJI6>Ehy)F^z#8OUh530qkF_ekv{ppCJr*cX)=rZX_jX%o9y+}3OM89ro z&lcL__vz}hU7*Jwr+KG9GTS^?#uX6L!Ac{*Wr42!u6k1sT(5itu^BLmpZt;0rS#z8 zYifY#<1gZWSDK4K)t(tl+r)(dx<-9XYP=-)o*f-mq^RVs4M;f$?vJ68%1LDrScl*> z!F6RVUsStAv`ocp>4Dx*A)Xjx^Zl(cYR0k2Y$U-S4)eugQcUbs7rA;x zliw^)ri(t}l&Rq8+zwl>OXqh-xt-*+H(=u7lUw>qUM>7~tnM*7i4h%ZJD%MSDWxt( zdts3mGdqTkWnCPS4E(#+bW7RCsG7E4^J2XlX=r~jstNVETpmHa0IXAV0_2A1hq}zx znB*_!#;tE2-*t9Y^9^nMg%->tYLCCV1&`Ff$phIF&?!a_vRrNi7(lnXo1KEHu@0&l z;iiF5zW4DfYAfUh7Lbks0{*_rW3aYHVwpTyd3Z9p`Gy%GFc_0^$hzn)!c|kqw&~5K zJ2n~k!&!g)%R-u?Mzh3KKFp{+la!o#}zb48PhhU`;RFBV0Jhl83R6A%dckL-+VwMKaB@A#teMQ`EV*3Y+uXm(69=1%dQrUm?xz@f~`6>8oUA__d==VMEQAs3cW z7uufBqxcM*Yp$EW)FVpTr_S1b8cp&oSDkEMv3+@(1Qgivf!Nzj*e5sn&?`?Pg!vgo z?!F04s9p5ezLea|jq%Uw9W&Z$ld_v?8GRxl(|iaQR7`ZoqX&n8l?3Vs zZE1Y@E24`Pu-47N-yzy4dP>NIDcG`(k^qV_tB}lYu!u}6inlfsU^L#M#|(V5<*5qW zvRs5RHJ?-|()Z?WR?0FtXVv=FxDv|vKGh_+5HBv_i10Qd`Rq7IVL?+KI%m4K0}?`n zID%$?Q!{_M5h9sGr)Y1+xAgG<1=*}$CD)VTRYsIr%wpQ3L2yK}mQ33NA5R2?z?IFh zb1JZ>%`{7=w43^+NkbA^stz?<*59LnU&e}N@aRFFh@Cmamsv;9kRM=skN2z^zM)%| z=TB$gvX9Z%m4kv^BamfS2rRX>LjEG~)=8Bo%gNr8M?TzqzzT=-bV3{LcXvpBMk3H;?7n|FYA4=O%vbr!m=h_# zqDZPiS@r`Pl(Io&_PWoL6~bKR3%_A#$?HLKbre&5QWMQ+cd|>M@zcsU?b%@{{jzmz z6o5)N%MYWz7e5o=(-pv7RB2s%~h_{8H6Zz|F+bCy!4ht?u0%G+H$qvU5s z8EnKy=%X!}iY<)xZ-sp)1JcZ$ZFlo!35*X2`9h)czdygK+Rj6GIdNRK{ymJPHCd8T zQ1U!ZfwT^(pqqyQAev}bWj%}ST$0tsxGG4S1Uzn~B;1@lUWn&r)VhNtSE4yrU^Z|W zCL~vSyPbsa(H%YSi2k9&A8c2(V?XIn5*NLkt15Y?8-K|_YcQm&?6CXOPZdepK@60R zM$Sn(FA!@JVaD%J0U*0B?rS*aMpX6Y40}519vBsRbhE!T2Y_iGmK=V#x~!43K)(=5 zx&?D#8&r2N4qJx4SYKSiIkqVDP7fb z1QpIh5Vi)ozt>#?c<@Qd35ctOga2Mx%+qR5k=a@k(_Yl@WuAw-ckO}B)APxT&H{;& z`T+}cs)-%d_@<>+B=47``J|CvQ#y7Un&@Krw>eUHZ7xnrwvNb$4a?ULXlnqqg;(82 zuQq-%YZ2GemmTyHoq{Ve#?BYI(vHn7l%Ma!-(3#B^e7T4tGn*Xe-KyrXAXyByy#NL zU)(b}lz~qpnb@~%Bl6A4+q5MldK8^Q?))VJ9bLAst!>Nx-=A+b@`5hmAnV?$ANoWU zTX>ma5K=q7klrUqKC(g6=`Y-7L}eXED^0QHG4bC(?i83xkVx^6yI7}Ex&z$v%|a7J zW9A9F z5!~rZ%OF^j2@lSk5Zh5z=~ z^NLYCbwA7m*OJfA%65k|jQr+Fll^~_r^{`Yv$>9Mg+YA^BzS$L zCg8*k%rOzjs)r9j=VXCo{3?<|yE? z?QwQ0#GP}p!QGySPf?wr3kc6-aV8abix9KCr?;aJ|K3=THy6OevN;w2E7 z5FVadA0%jdt^>pE+xoMq!Q$|LdTuRVnB!Af<^2nOYO~+x`;QjjzX#nL+4`b{E4ks( zvnk{$?7A}zl|XYt<2y-yd-Ak|}|?3Cb=Qap4&^lce8iMryxm3sUFfui1$gbMp3lr&1qB zU!JoqT(U`#cii5{3jAEKW4jkT)9XyrA~Lu+{UYWO2VhY37#w(`>qKtZx1s>?GI-cq z+x(lgAy0A?>t^375HMx{kVpp*FJB0eijpSAm&t5>#SBKzFd~7=DO%Ef2?^ES?N#$0 ze;-6eGkOh_-^-f=o1{I4YHK}WIgSVyMo+V}K6!0>{IgMPuJ-3x{O>IJQ# zJ&6X2PkVbyeV-6nts6uW62X0E?9T|(^oV<1dRVrpno>5KYU}4k1+p5W(Itr9mJ?U* zCA#fwn~IcL@d5)X26Pcr!)huNzaN;?Tx2tuXdoUPxEInW@R%(J^4?IB)=8^cTnLwK z+G0UwHlcZB=TH9aM+n70Z?EUsiM9_N`O-ta`95zDmkKYx(esq|YbIMsYpohQLr)jH zE&HG~2n1@qYoi>WP!y;}icx|ijc?pptoVRzj;oqU*GW5}$-pPZ^8OZ?0{cSd~e-?$&+R~ozc&f?Xf9d6KIJd9<;Ruy}2_@mi}O)jnBtZx(8V_*4e z?IXKvYe4D+b3T3WO49G^528gx-t z4)si*^8(rQ;(V>+$AsG6a2tSNjwpr@YW8#*L&qFf2qu?BG|wrt@3~(v*#GKg3k&~~ zdnN}4djL;$lJ7Iwk0D_l!)fS-6#Eb&`S?h|w{;c0En;(3%0zz)ii=<#*D6gaT?+gj z!bmZD6R?FlsXW`J>?>Pjo6KE_+6!XSj6q4Z4Th}KyP==Xc1!QV!GNpzxgs(p1@Zr( zgKwMl>mK!@qdEPM^%g~nOL^bbo;0l1giO4{GZHJJYV>gxfK)D;T_gVYG;{Fnbo2tE z#a5YFDy3WYaHZlFtJ=sVPkV# zm5Q~D-1UE1^OWy_iP=%$$j+jKTnV0+tvEh0BdgH0;YC&LBZJM6&SOsI=JVw3jX1J2 zFg56JoS@so8iaRIi) z7K@p{N#4D*+pK~L2|@rA?qyy5D*~R-Al`r~J?F2uM=SOiH~X=0y>c$+)<_RfG!eEq z1FzK7WbD}y3NwuNERqwDcVzMNb`K&E=}<-}9yv=EJ7UEhjV4ku5xi-bpSwm!H}|=d z?e4nw?3AB1&b`4}a~s&_gy-T-H|2gFFcOlNq8*;!)_t?3dQuwF9CNS6DhRmIl#e>X zG6Y*c4?iHtEj@qFt%7kn~l>WynPhPFQ%LA{qI>Mm(@P)u;EsU3D`u}c!@bE?Ml2GnK7BZ!3|0gQRS)dH z(|nF?dTGInBbI}qf@_{7?XU-Tkr|vY(k`2{KV|n2Hny4dOcmCLI#AUyCER>i4dS?P zpmu81@#P7vdk$)|WgEaTmsAd{-{kGD&saZG*+(|&&Tfx|@6nW#8MKJFjUS;I2 z4h^ZmNO|9vjTjf@A)$z^qxT_W)j@W3@_CwDZdH#!E_1MA?8QH$>VL~4IM>*&SJ-g> za9~MYHxaVkFE6^cif(?c&MkJ+EbRn;Hw@eOK{@ce%mY6KKx*yOHEcQ?b_+3a*MKLp z6GWG51ak;FspaNxD52hL7iShIST`~N*4^{x`%9S}$Y;Fyse|H|A#NQ(&0-d>-np4Z zGY}9=%_~395{+eOB4m2VtuDp^idGML(nfGZcZv65e(+gf0x*lf!c44TwxPUc!qU=1 z*4gd-``eXR8`m2tENuL!Kw->4Yh^d!%gpq7t^(8-vZ z0cAvVVT0y3%`|!uBezM$q&*O2IcW_W5%AA}8i(9H|G}7p&W^1&?v{b$KRpaVM)ks6 z9cONJ0S{VcG>*9XVm(ObjNKjIpQh)H6DS2m)6Ll0-2Zx*DnB*`WAPA&R(tu5UDLk8 z3-X0p$YMETuNxZgioB>Rk|=yG{XT%1teQe-N4zStTE2?#vj-ocM2F`Fef;(2)u`)U zxb1%X2%$7lK%-)q_W~*)qf&tAMa5^AqR%yf4+)Cp4EDFy>ROFjkNW!OXtTSjEI!c1 z>)~_M#&T07=GKov{6F4Y<*%-#Wj;RFJ)1SYE0Uo&s!&h%>Z+2zv~=~YBUy2SnSsd% z3O|76-DkArMqeupoMAfnU;cO$s|;p{Wgcobq>4G*8<7PN%|`y+-IOt6gcEI2!T9jY zA@t+%`OKs#jJ5b3P3o=%#;EELOPCJLe4t`{Wy-9w!zbxb}Kwo$s9*tBp5!-+$340X1|GK9;tEF zb)|*FY`+s?(3RFz(mBoDgfF)-8yXo(`awzP4xZPiZ7(*+{SBy_{2)FQZ-i^R6}&wX z_BY`78n4x_3zEg}2#JDptYlTWWbTxf4{Y=BIC;yzb>gvb(r6i9yt(;atvjH?2BDQVCV9YF)(q5xX}F=jTPs=&X5(X)v%jBXEJB&8yOK zRRz4+ysRUvIiujx5XkOPvW4sL;a46$T@+Sm`;8Xmri|4^M0n{iFd$ubBA=<)Ye*su z684PMIK>iM^u83VbBxO$Cf^r#`TkDKarpoJus@i(begi%D{|Q{BIh-th~5ugTB5l+ zPrJAD`{aqEdM2MI1!aY(6_oOHNLRNq$&H?T={IwfiV(`Uu-2_Q<4Ch3@TEju(-h<8 z1SeN!1Lvo|HD%_v4pX3|)6x`oNFq9y^n`g^t}#1Ww}#LxmUNtPr@I2R<7QJfXBAn72!KFuYcqP|R}YwP ze>*k{KTem18*OC7@dx)%(1Zh+SbpcH7a*n%-m12XndPVU99Gz=bV$&3rrrBYl`l}N zTT=C*rRm$JAAz1MnC(K+JIy6{U9;FKa~SqiK9Ni8HQ)V}y2_eQ`E!|!{zJxz8O>Or z*Bu`LO+H#=;NdSvuPKvl_m^XJ-q>J5t$KY>y$jTF^Z`{J4){9oCk$``haA$+&j zZsYv6A=#^@ze%)%Jl;Y%iQdu?E43AtKy8dA^X<|+jHB(W_U_H0FAI|ibN!~!=*Vr+ zVoUA5NAqlNpMU4;M+bGQR^AD0t2cFykWibK9T^M+q%0E5c6*ra8R!e*B)J90CB7Fr zXdAHMCIr7Q9duR(E2RW+>r!O~mJZ-y+uWk3{G)t3)2_nQzAIQIRxL@35i-o8sEtEA zKL?b5^~BEHBk9=Gq74d2@?jVG(ldhThc+cOdual*iN(J6p$#whbcmOI=*Pz#3dCQ} zU)g|?^_Z}rMP5Y?RUy}3hcrH}d72L!d8z0ya!VM0mNn_&00Lq>;^+ER=TNt4V88B} z&HkR|bKG_R={EJ(ptm>U|3ptjhgf^ecg3Z55#9GkhG}*Rdv4#>ZpqOuNS#L@+JD9}r@v+YiVtVzK@Y`Dr zI#~!}vpxG}wwj?W+{cw;9bI&qP}F;Mvee_hkkk2#ODY)0?$x?N*ttv~(p#b$j~fr_ zrU6V?4lpg9s^8XJP&@@ozkuyNX}(OrX6K&%Q(RupS)Nq*rIc{nFY3#``Ztfq^Q9a8 z=b=j%wsKn*$bL0?o7jKO9u{huKd9UB;n+F+svl0hbSS?R^HC#hwKoc{_4<5k|MvfS zW2Nr)%`IIAS_hy^T2EJ#_R%ff0oaq9GsPQMYv>L_%4Zo+c--`P#bz&bI>fFB8_{|V zYsE&4`xnNfMO?1!@BQ-{yz5^CT^uPwUZtE!IS#Mg-(+@w^W@4(-%9*-f`#tcsh-wVA|X}HnroooiwpFuar9icr`aDm!X;Uyt-0mY zZ+BOljvYWtjIJ%ItSTcctzIRy_vTgMMf=em<1K%4NF~4n=4~pa1=z{ol2Z=#+!G(~ zQM4uK`HTdL%K!9DwU=V?PxDcvRA&i`EP6$+ zN>Ly}gSWAj>v2(5q~cD8Zky)_r_xtW0!(L7M<4k4!_O?|&Gooipuo!0m*!osl{#Vm z+jQITg}&I6EIiSdYLgJh!1qz5)JjYqCn;WsUDDQ1f}MK(=G3zaqK<0`t*6oTJ%P`; zWm4R09JT`c3XoNC;B3wrf1fs)S8q9aCHn4W!B!7zYY4B29nrWkk&;@;^%uTbr8OK- z?S%H*G*A6K(9%~xu9 zj5CP|jGH!H##TA#PdE)9la>O<%XVr6W~eW(6cKTBl22T@Mu>6t+q`U-RUr!DpFJTUC!myCWAM0;cZBE$G)s;CW#HkSkUobzWx z5Zwc6(o@H4wKqpuRd^=c7JsE8adw?s&P1k|;Df*eMbIfG-a+?U06bE%KRaI~vNLcY zYFJ4jN6NV7I>U0#{9MU#KACR2X%Gtq7ir$TwrxK7yr3cFaO*V_Wpsah6rqIQz36At z;zyJ}+N6y=x9rlL&7q3;T*CfJvZl584Y40TX66?IZ_Y8j2Ffrhg|1Q zPY6!04h!*Di{-Jflc1!hMizzfOC$eXlK-vEbl%XpIo$bl&vmE${wwC2D9SLvt)e(0 z;VqB;YW(fKeAwZb6zu%5SLgn4!J6I8`SjWV+qLN8 z^>NFZS@^mcjy__aK6pfS5ePWFRqF?YZ9XsR|EzGtHy?s6X#M*`dq3{>=c0G_Xo^np zz1sh9&-;xENd;`)3%@-$1bf1EJ`s;|jW~8~#TG(wUAO9;U{saukp#Gi?YxAoA8dDF z8MZ=Z*IV)YGcGl#6K^jB31#)!)=)e*yu4irp!MoHx^-|-WlJpjNBtuie!DzFf14;e ze3oD*D-YPth!u|O(`+UVt9EyF;Al*4Ljn8cHR<0aOsm|)MFEM)o-8x%R4+fZA1YrGog9~s>m`R1cUsRc2VdOmX zvMVSrVtB5~X>L0@g;~In>1dIBYVR)su{8`d|D4!n-Vdbt*|EcYkw>V&J)Ts|YR)jgg>F93$3YgX0vICB-wszP5RS?Cj=b+#vnp$Pp&!Y z4(!u!ZnRL=#`sXKy=N!;BE4V}H5!^5ro)~5EP1HOi%r{USf1A;0775<+9GK#H*4)H zdr6e1_7_~p?=9+^LdOyIH?fF1xY>4)lTp%_-S%9BIZZC@J8)FL(*2R7U1l&P+T^P6 zpyaH@*PPf06^s_jZDgtbR2Ai!;5b`Y_H4?F1v|57q+AvBtWq@|5?63->5+nETX^`0 z`o(H{$~evHCP2pfhMAj<3pU4ZbB@QnH_tVpm@_LtJzer!ED_Z#mh z&z#JVU8=yUXdX$L(^+}94U4^hbyzQ<5U(i9cP5ogIPq=oUL{Gn)#x=-yT9Ap%O?&I z)$!eg{4%7ZhtPxb_Co|w;-#>1UG0D?WNds7$S^+Xc%@qX*0CeytJ{YC3T#PYdr4aO zdIkNq^)TXQ$>+js`}F4YM^RtI)yEqGMO@Lr&HaLZLp{wiUoPZ8IpSKo=dZRMR`&h= zQF8p8)1`WfhCecG`cT34 zEM6?0tUix8?*ReAZ+be3_AcM{q>6=4+XStgZ^1`g6%Ow+%LU`2kyi#INyNLYYZU+V z3jkaeJd7a6Hk9x9z*4d8&2_NIc>P-X7lD0e%g2QS3G$9ZED=R zx`}Xu%LtT^1<I$=pKs8_7>i_idpui7|rxcg#|$IX$Q25C{P29lUtkpOa6fN=TTj zwso+>Pn1R24cA)kFrkfqylnaY5MmAmX|O9>^YT@MnY11>|B9=rVyg(PL6zXU1wcAF zjNe%<7@f)kFS_zJ`7Ly%nWIu_n6wqyD==GBudhisfZj@~EBQ&WlyC-a@kn3&F~X4MTecAh0iQEcK4 z(yROi`Dy2PiMfIn=(Nagc1LEobt5^AyO+EY~A z;`g#F%)5vgK7B#``c99?GYP?>qB7!P2%}xI|8-#H3=89hY&@7JT{I;BIWRfC$V6n! z1HgLZ2G(kKI4{~zOGTfyiOx3@^mCD(Yp>F!vAuy?0UxY_pka1-iC5j{9ZGKkzwFD$ z*lgf19$&Fg)hXjXmm9fS8j4W0Ky=D3Qm-X-!+$JuP-1Uj+JAig?(f7InO5wUu)Si{ zqw=!Z&fLAYrp)Z%ZaPnehxtcMMti$6#R_|;6w*)nUi=>*;NMhq3k?K+7~Z=a-&;0; zhoa2Lmsod$`|SWyFMm@t&v{;6)OPIlXPMdFzv({sCg6LUTXvXxW+8R6kihG4|M~EX zo#0{d!n+qyw*X*p?|$0L2&`>H?8vPGJ|brCymqhu%>xZ~&VPm&y&{FH*E_!5(>J#Q zm)CRNJuHeR{)+M5S7`5{{k4&QH%cg_uKSin0AbgMMI((xSKILOTUa9P@8z_$KRE@f z-0Odm)#)!D#f000wAZ_I=-HzodmHhmp@Yo`A3+;q+PT!3%reGwTw3MV-Mlx}rRo7` z{gTfJJ}rtn8>{>RwD=IbnepP@F@1nv!kP$HWvL7%mC>ZN{tS zspt>ymFy=lyUxm$8644SkrZah9QTz2j$DFpULNwr9+k1utXjz-YGzEyAoK^;VN3la zYtZAn$70Mz?PcC~U*Ee2@(tE?(pOnNN~CT&RA^8L6bb-zi9+4QUU5EDzBkQz>T6xq z+~w%|8>|OZi0Fbpq406cSDlzF;rF7=ryv3agW}WPcxBHb-rXWEB&AM~L(+5|&n2Ia zVp_?}t3Lg8{GnB1Qp@P`G12&&+X95{Yf~62YM;gZrxo+W^NvMmB}`i6{b_%F@6+tv z>9kT}w&xCqchGQJGnY@Vns1%>F_Q52rE5Dx5vC8BKW3N%AS`rm&psc$Quxbdpza--5{c1cM`H?#JDN44fT%#T#FZaK1mGBMq6x zY5kZ0iCG`sQW6DV?U~nw2*vrdf|SxW=-a*miRF9I-m~veny-jx@WaS=OR+0D(}}M8 zh_+NBVw%v)_)5v}u98y-q36(|*?@qe1K$S)(GlC`koFfoix8MR1KY!IY`pA$fo9;e zyWxj*R~uK4G6L-smv;ui2P^{-;?iSwCCg@!{v#;Pp`{a5E3NLFVgFl8A)q~ZfcV>q z{~aHALh}`1jCGH}}SI^3!?Blq3xd3(m`#s&*VH=C-soJ($0ng`f+)mvr0ZEmp$;wN2`x2$W6{hFW+)F-o}x^Z!eGf(AaM6nmSAwQ05+$8Th&8 zv*M>rw!XY{q;kFll0;dpp|qb!!3OZ0M1wsc#P-ZLj2(4$DMpy)&ha!IQj(S4Q>00M zNA@_E`2qNIO|5q|(XTfK;{=x`c=S!bxEXFuo5rij5!uED=Qo0seL#9312w5Z8*hJm z*20#^=kt4!vs*HvmNqM{xZ%iw@GXks!J-swnMca;(Emf%TZTm$M*H3~bT`rnNQZ)S zcQ*{(AUUK+cXucaQYuIdJ#?ptl)wN(gMtFX5Kt5^r z|9@*O<8yx>@5cU1z!Df)A_Sbh_dDD*vrlizWe4ANMYk<~dS!r-MVX6IP4jDDtsmNc zWb}?wbYigAS!g(l0jXDAxVLWq;TpX z`lYBivnDj+4Rs{6=RE?>M*|3FsL>8fPv?if6Ix@ljkLx1@g_2Icwz6Ztt&@VG6g9R zRjZV;N{jtZne$Y7`Vbg0(m z&h0;Pr+@e8<~?FlX6stDtN-!00ye`$k307n|Dk4Bu!R3m4QCAx`1{Az(tpMAQNnxF z5_*pP8bW4$A630;)J_5A;h=)5dR6&2-jg+C6c=M~L^x>i* zLOT46BZBO4>P&{8mCqrh{qZ0`U`js>kKRbh9s>FwP#&P%-R8OY{akwg`ORG_jZMl{ zUxR`^j*aU_i**svY@rkF<$@v#= zXhc9p)knE=>WI2R6RdG~7$n?tY2{*iT}jG_YZju- zwff)-kcw{TmBG=q`P!wa<=fBF$K~A=ki=NwM!zT?i2w@tZWYVgp{G7vk*k8AB(DhJ zE^9(q>jY78;hdmqn48oNv#z;XKQ&xacwcl-WZuZ@H_o^=kic`Wuw}Hs#5iyj$gEJa zfsk2(b`LcKh8g09SSdu~^wZQ-;TGcFD6Z@|1Vng*>taa((3r5xzMQ*%`UGhsw}sQ5 zf5-Tw=~wm~%W|=t8vzqPKDt577~oxMq>bRW93X&7I7$}CjfVHw@B9?-%e(DY=@odi zeiNBs)!MIGGOKpHu!kn0|Ao((G!*p48i}k)i18)fY)%=VxxHrClK9>=Sg);qtrW*b zj_ESk+m`MDc7ZrVtoqv;ueiFRK|pzAWy9k^WFrr1t7YRB z(*3)_o9jJtvBKLx2rsdcyj(gyX;A9-CZygZ1TLc|IQUL zXwXx=i>AZBsd>L&~ zddO$=6;A5A0w)!q#jPsf9J=3G{*VP|QTf(Zf{gj^Mx4NI5?yaV&v`L&Wai=DjO_FA z{-1na@?4mY*X;VP18&~Q==PqUeEVVl9<_d{tInBGeCrc5dYMq_hM+0%$ybxUGn97s zc-LPvu}Q0~@4~|-W*jNn{I_?#{%FAO#M5~WY!4@#4pH@y$ey6fo|NrhLpJ~N^&mXF zhMRdMLn1QX+%5GU`(2~dIwN{Xe}eyz15_jas9vLby0gy1?@RAiN=F|LmVeh74`M_N z60!TT4>ykn!HZuvPoGck-!ya|OSp^B9U&0gaBxF!+3r)s-BkYR1pyvAvnNm*PJkN5 zReLJifmv(Y-PY*)Bp<DHLrHU zUzM#uDk;_KA+cI{0GFI?dH#H{-7cdR;89bKuC#}FUAKXC(0!=MWh%UAZnoQ!pfIuG zR)w*&0oZJ;KMhi#QysRSts7?-Yv1r_De}Urh-Hmv$NQ?6?b3Cs>H3G(f8xxJFq6g z<@6|deFwIwMulN+iZ67qk7eoAS4p*EhMwO8mDCY#_=s!6oT!w*=w>)lDAK1&X&liD zZVw{y-3-pU`X(U2&cRQUm}#ESgnxo?JZwFYVOy7HAx#L=Nj&t;59_TzxGT)vpSzM< zh^xdD9xqQ^SDY_z#XLhyAcaoNNWJZFW_j8+2FLBHLKBeq3=&n7q$ehsvn87u1_B7A zUz^RutJwcvT+=?i9>6|%zb}QodFiov*;u+tx^FpfO6YPd*}`@2Ifs@xvS8n#LabEyEUF$j|m5^dtTw#!67O1ohlvPb}F>1+Y zWIi+9eRtuhsE_IAZDjv3)CgX#A!mQgZm8dFQpEjB6pN&#pyLlLw^KVvQReNCGC*!Uc9TX8bmAe}~k_^l%&Gk)OyyE!09^R7mp z_4MyEI@_0uM`%|GUEaY9f%}8G!F3G0-i%1i0kuxS3*8rW)M6 zuJd&a;(KzlUL0#@g&W^ve;>U#6~{ve1UR_iXf2vGKk?!IOA(@(b}4e}Zch6Qm^e@p zkRNa$l=k%}hEyHot9ZX;rRl9Gtkl!DLUX8^abX^iL9~zT{W!cj5oN%K`6ke0iZz#r z5HMOY{kQSo8OJiusO_f=%4;b?v4+b}Z>v7y6j^EVHlBMeX_b^4#?*Y^efP&NvEIAr zgwZz%K@Kgw``6Ug%BU{OB2uDkDexOnfHQU9g0m@b!Jp!df}z~^KJcofNBY`IA+vw-it4cRR_etYa{Z!@ z#4rD64V}ti&~pLt8nxK`3mZpVk4rEjZ*QGC?@_H)@{cC?Ux~FjPpJ)rpu<=k#?|GO z#W)$=c;5={&&qbLa2&TTuQ$!Ph$>Tz=sW@d2onF%hNKT@VT;Ea&FERO7w@MF_|fD+ zSX6;lQ(l-f_1XtK<_S$^`_IHNK~k)mdg3u#J=XGqmHaN+cC`VRiz46(DeASq=1r8iElVJ|_A3v=5#xQF z2F_K>==EtSRg=iZdc1QHTpIJq zX`8Fg?_?Yz#NwBK`q-MsWvP0B5+Grtk4mel7w&X85~DelWCweT#29lu zPerk^ApZkEy|BFGZT1Nv3CQ=$6@0sT<5Ohk1rgsH%GpNV+>%4UIQnKt-RPwAA)f9@ z(+_-fxb$XLW2fS>i^u40b9~)JOxjP!rkiq^DzQKD@1r9#F+D%aa3;<7$==5A*8Y_e z#P`<){C3UqT-rUwdS{mKexM^URw3_l^x5^kDRs`zXRo}_L(?xN`(;xPv$zcgQ!#!^ zIkTE35~wo`OZ~jL;r(*aoPH-GwFK`n%O&1Vh)6%rYR6yx=T_*D%itiqPKx}&Es~xb z;iG31kaIG^L~wZhKQS@!LYB zr=lf9Z#`=B_thb3${cdsxB_(|Wfqn!d_tJfP#QVJP7SZXfIA?Ao4;FS{#e-8W4M@Z z<#Rhv`h9})R@Y&D$Ttbsv71p>Vt>Y^X%%OhcsqkBcgb*m$@IFpQn3_1Hn1%tLy;=DM+b6NYeRrpn%QjX&b+-8GCVzhg=S8)o8Fi!o zz|h7Jhjb6=Ejz(jK$>kEQ}JsNR8L@;dhRv;LKWPN3CXkPQqA$)<*kLqmj+gEk0zdR zS7v|0d;#`MCa+wCq`M-m@apcXWN)kfOkWz*r9lnZ=+VjwmgRH84n13r38!PD%-Kqk zH&V0X07v@rf{Gb2;=Ygj)%^fXbfCX38%M7aZ2h73JyfhzFd=2IKY z)fm571k#HLTFBY|pl@wi5jIPLu(E=MfLyC@+|T3FJvc>3Kczld+-FztCNjSR%V|Xa zYC>Z0hag7BjQx~5gKuHQol0^@k-suBAYU1(E&9dR(Zi(6=-q8o`g#NV?BXoQxdior zeHX8U7D?F1?oAYRN|WbxFRY0Wqh3yxT?KcrCcaCO+(xSWlc{7uGvl#orbGH~nb9oO zwlsAnTuVu*B(0YCKVPiJos)gGjZaXE;1JVS5v-io;x#ijO@v2fZ<1_-zik-!|4riW ze&REE_GWG?5I=Cb@ATfh#$wM`>e_da#ifTBIo`-z`d_Zae*ukBcDqTQ4F8lO?oltR zP%^$%u3kE+?H^CuS_?$ya^jO!%ws(l!9@zu6)=|z1XGA{JKjtQ9mm#)-lYPK-R;yZ zdcO|%i(3ZU07O@q;~vmq=c$@`ur{+7rQO_jevN+AFxP71=+K$NX{># zqA+Ew%vs75igtfC5${76^9&ZF`Zm|nl17PpG*=@H??EN>n(r!$EyW4Kx#X#@iRMZQ zcHbV@qmhe6nkhhfYw0a&s<8t&lWWCAp%}JxXuN>SqNuzb@2S%gE>E*tN}^yh-%b*& zPH0_zjsRcvIPCx^e9Y1ay*&h)KXnO^G0}a=Ji?wr!D`BrW8AQUZYlbbRH=!Xl@=7r zfYs8fN5eT60nl@6n!m=Rs5Yf&IxCCyO@Y*-zo!LX9oTwlUDTl1Fibs*{p>>vL421} zkyMFpjJmh(wx7Hau#D*_hLIr11&pvNAjyH?jpo867P949s%ms$p!l*CX3RoVxpF_` z`-(;9eZy);OtX&ItQ6PBltIBE3%F2A+EE*yz8tr|96LFWNS#gEdtES+Q`7uIO8=2D z+$Ti|;iJ%9PwST(M4x$KH?<)#80N<&#C&p)q{e;o{3kR{k8$v30A61SQ+4_jNMdQy zrr07Jby1CA5MQpoT?H)^vxe%o{Dp~#*w_8NHpuJLOvR4nrXQ9%dmqI-!Ax!rhl6G+jq}#nbw?gankj~!tcU{w+jw%XIN3b?ZJGeK;RmVLi(y-}e{|m$Y z@9!}&`Pw*k>iNhRTREzkX$ADBu^}#IxwVBslymBA&f^&(wjPhy_H=-SO>~AKeRk)& zt>^GdSmni*$a!-%YV;+DmXrmW$+c2S`Z8kxgNW8#&~eQG94T1)0*g?z*<-? z$|xNAAvDw_cj;8fX}$nsHjqHRiM4}=xh(a3)_(a&r90+{l9dN%BUj}FKAn-a<5ran zTkEpd)WN^>Op=qX&m#UN3G^wfRllvNThJqME}s<9t!^;%Tp!4hs8Ck8mNnwLeyjlGXd3vc^y4I11>sM zLr9Ic<7d{b53id-Jj^Y^T}W4ZJ!{H7evV#4MtNeih7n=0M)!U_brNp7{W?PR*;(%h zVbtoBJLBNt&oubsWwcY1U;8+Xn6=Q+ZRc~C+u`p6Tta%;8XTT5U$ebm0$r+yTQG4( zm*196ZJv!VWX#nnLz^mtr70abC>hF8mH`h-m;l z>~9JF<4U)|D>x+ACaU$5I_nK9HBwc)K6}&dAB{h3BOf4h|J^tY}C)yuE{qh|PD@2r%) znuNrQ)*J@MKX`*({w7`e+D>$p&)*EyNM~!&7BzM1uYsB_bNw^C> zu4wtMn{bRqf6sqz`cKn2d?`c~JT(Ao#`uOFiISWT7OM4FsZ8!sD!2`rZDTNsQb7T+ z3P^_A+uLP#kt%Bf-|qDfFxnaVi}1IzdPYs_o{vwe=W&CWE-lKdra9;oOT?kD*Rim4 z2Oc9Mn^hds!CTZaa~#GpGg*V~uCqnAkIkCZeSacGuRrx(Zx}F;kk)>3vltwV)l;sTPe6YI$w#ZnDU(nw$6Gn-U}_ceIM5mW0!gjT)e}>~Hoo2iit;S-$QH(Dn-) zza;c~N#gff73_GaEvLnrIQ90|A%`X8=pNDrg^Y%$X&GbqvB>K?(qCP@BIEA756SrtSc&8c=OL7cQPm=(v`wB$Kw|x6 zucOc8VdStIGR_xc=fCw%{O?2iw2ZkAX+9!0Ys>6W?jv+lxf=1flqzMbK6S0={jTZs9lTH_rw(Vu|&^Ss59kV ze=vQHmG~l3wAyiVM}4w+cNeziGtSVllg#5i$=AO1=l8tW>mO=x_od|CUgAypNUz9(|hYfBUkJe$1RQ)#G|4v7j?nz?NX?4Z$Nrf%0|bjC>v+ z=&Bn+>jn`Ez2?8a+k9Yfo+%lPLdVwA7#yXtNew~vQmLlX4?fc3EzUDL*QdLvl^fUC zmf<%)eeO0SAJI;!i)!7``+J$^y?+cI|5ejmOl%_hft42LM|au5%7k9b8&EWbg^I;T zARYDBuZ3N^QT_R5F~V5S{Fc>pjpgEKqA)zZ`nnqm(5w|Ep?ij{Ex6D4O0gU5O3#kX zPwUn?4HbxaRGn=ZcQYLLiH30Q5V&PWlA|f{EkWC>93`zk-YgSp`X|)YIneCd;G(U& z`LW6@d<>%VFAaqRU>D$;APR2+cD1W}93VbuWzUld!7I^zuU*Lz8uHlt?voye)`Iz2 zMssm^C$xa9Szi!)^b~KmNPlbFaqq{#(yz1oy>xo2RV9?*eQ75Pfw_SL)m2}FDc)^_ ziFQ$tZM%#Rb4MD!{5eJ(8u(l#^LJVHg?@otqe*R8{FVmEl3NMIa4dS2qSOSu4vLej zon+pKRR-A*TnhDTtOkBN5{%8OTh%PuHV~saqe%f+B>e6TDfT2yfFN_4IdFtF9#)q`S`@arBUZbp)=8uJUYx^<@ zFTzh#I{qHi`kehx{|~>^|A@M6mG8Lg@cCNU)%qhX?FI?FY$;7c$0pi(?D-HZIVD*0 zTe1Q~-X3=oKSo4xzy^(6{?;W*!5wqVvx=Ypth@VTB1_L`4Q0%tq6TIEJfw2S-b{4- zc&B-i@o=5-7%%Dc;?a`F9q2_<>`Z5dC1(_m4<#X8^PQ2tM&Z={mOi7D*URHF@hBQ< z7ZsnVIR8{FdUfeNN@=onw9?`NQGN)~ef2pc;w$>>U5x5dy2m+f?wXQl#yoW?9`}sF z_KH>g=qF6`IRCuVrswSAE=_2q`W!8!CEhKiwz>@bK%nR%Ia5_6Ya-pD*74#F)SC3k z{CYX{Ak`ola~ts{gP--OfVCzZs}_x}+O9(KzQ-@k-(gJ2cUGBKm@;(u*(IxX}h3MLPCpr(^0zL25!kB&#Jf(6m)P%cs>MU0=>PdIx;!~@Ubb%A& zIxKfFs3GfJN_JA?~8|RXa9%}B`qrsimSbUc5_J0zP6yhJe5{g ze!eLSJhFrR0!5#N|8^S);NDEooG64cNVNL!@(jbBx6Fe#oWTr)p!UL-D|W_cSX_&bK=uVspB-!RWU@pTw8 zW#{hdCyEjJt=+&ri`MP*pq5Ivymberh$=q<8=_E4+??G{BlIbwOP6YE>V6{RFOxG8 z4rYV?g9{AZ9dr2U{l|3d*R0U)_U_ytq^N_W>|Dv!+=%GzT13zBP5I^EGza5U$Iix( zsNpy9>$ImCOH#o?OLtCE{{Q)ii@{#oMB5dlv{5_}1p(6vk!K{!52v67d1V;!&q@hO zsaEj1*Hpwa$=floEhRT9|L&1*w*Em@boOOv=22XCoS}vcd|%YGg)m zF;PON{uEB)KHZGeLmXV-a^n$3q_JJujQBFcAQeawuo1+e!PRlpJn22bmbZoCo)jRI zsu_&RT$m7Hl$DBVQMPSa*_tg^e9U;k$VZp~1vg4$8+iZurT>_zP=zBJK*A92OY#h=SIa!k$A?d zR88Hwj?9O$s=Y1~7%}yga*$C9$WBdk6t^! z@b!E(2}55#RWwgR%X1AuYTQw@Q+N&0VWynRTe5Quz|gxwjp1AFZdQ4>jrZbG}`a_f?mx>k5JA@9|mS1k8}pi z$s3bx94tdRvQ_N!UMZxam8+y*Vv^&SUNYM-R+3#wOrRk@hO&1>H?GeY$k7`}#=dBC zIt?oL@=}7{n~=n7vr*+L_8HhSA|dP?VKMbzg4h2E3+a&Hi8RFHH0~`E)~(RW zS#fYn44cNZozkZME-M9a0#WsKTupTrCDw%F^<7YVJI-SuJSH>U;O|+C0_X?d3IzY7 zB`Eu|)KAixu!p;=T~r+CzqtN2_mTK-C&EAF1*$RVI@jwaS5<1i|8BK^`)u;XII6s4 zJZ<@`Q#^#K8c`DiP7_P-P-_#Yq|OUwFa|{OmKSXNo_=n-+TM9BaNp41L#Zo%AM`Kd zVIH6H^gV#jgHjV>&C!y;#+TF8>u6;~lJCYnP<5Yjx@WL7*JfrkXPi)*tcO9yJlmYF zs9XMv2*>QoIIV(OL6G-r150)g~2zX!U=ro(#}NN)p7G?5oZxiA6x!kwaPxW zhQs!~YPcr@ol}?1`|4$Rm&*mI@}ng{@uDA~$t43zW@q6jZ9*4Zx?**9`{eB^yTb!@ z%*O3~d#mq_y%oV0-4@#ttQB(JS}NsPK#aEl0KfqIVq0(ASmB`5LDQDW|ByfPV%Sx5 z9ryE%(CHwXI##&tQbSER{8+t3&2(2%;htmI3CD_2Z5>8k>%~M zoxNV|_;QTd9vL@zBpU7h?_)D9wx4hb5Q&>jm3=q#rpHW!m4k%ZSwh~GjQS@cGTlFYtkPY|=P}w@2@DkcTuoMGYpv$Mw{FCX!$V6t}L+8Kn z7X*1(pdOl@DTrrR%lhVXcT}|TZBX$XT1YG9e(;wvqxOM4Z^euo&nq|4sjIu4+4sfv z{&!kE6T&YBS~jucF97epTDRdYF`Da29M{K0iO^&GoH$$;v&wk^(dXicO{mkh&tnc<-amclpe?X~FG0#&)b!THYyLpPeF=SI)M^g#AhOJE$RHrU<$f8#xsKwkncSpb+I$ zGh_Z$FJhHktVg6;B9@0g?#LfO6rM?Lv3Lj?D#Zuh)Wx&)q*qBdtjN)AS5K~wZLyr8q}qROaLUpU9*G z1M2fSTaVMYvlb;_=&TQXwO6}%H&w5kH z?>2v4;cc;=Fr43k4+Y+30*nW<{j0D9+UanQ31@wI(?2OpOfFUOy?1TkfQ!ns+xh{P zfsIQ02oFWF47r-#C7fshz~q#{@KC{SF0yWs?`Q?AOadk;HNs}9k-5Ru72W6qDUknr zUSZoWV3vGHY9H=pG5LoLJ5f7$xrN;6tYj(o0&(-4=j8Nz0tIO)vEsCnR52ME@!e3l znOHh@hzAU?7j`a%R+M5%=B;H5qdgzY$xc!pst6Bf$fvro)V!~p_ z75;dsMoohD+oMfoA)^B=Z?mGY88q7S+nDy+Yv1{MtD7)I!D@)yP{qj6%AMIiNs=rI z5vbD6`u{_%Gx&7goMTTAM{gS`Uwu{%$9FQDm@-Cd;f^M|;IDq7Q#+=u?u~A%Csp`C z-EO?tzFU`0}DRttUX}1MdO_skOEbl zO4_vkTUWe##>m0F1jSOI5~uq&US&(y-%#c54=J`*Ge#zGYO6&iemf^WQ{!aY2;opO za~a>9or~wBcrC}mZQ53OdKfj!yli!)<*skJy&XAB4?%Y3Vz*&Yv5tcDT_hh!Hn>PM zwEJD|RSCk6m+NX5B_Q?#9Ubd`{Go@(e8P~=Z!ZM4H4M4x^^b|JmtprbXys!wx72K` zyPXAc&Hjh0b1wsSx8jVufOGLi%5pfBKpqeJK(geF;p0OPgBxF7G$2Nb&ge^>@_Sf! zqK~O9LcC2H$xG(a*a8Y3QuGn78bnl3=!V*@=2Hf6QoKD8=Im6u>X-+sb?6Tl?>?GyRqAMD;!5_Ydh%%Y;FVd@6LB$lWYoR zD{_&)#KQ8}1z{Kr=n5j47yLOJAkmb5Lv}#P{}$l> z&ksSdNbnQDWMvm0Z;mkkY|FxqM(!FDqHo3R0udS6Yj2!}@q|gw*QKm4>8nJ^n!96| zstOmDH$Iq6f||Rm_v4D=cUnWE57R$8zi#ZktI#X*NwC0N^f0v$g+9S(Qn%@`eg;vc zg1@LyltNIs1H)wGdG;IFAGNo~+qrJU-}(NrfQ#kvmA)OD2gj$n-Iu80UgKv47TyOV z^7N+ZauU<3fYf>h2;~t&l_}jE#vv!|$(kCj*yM4orxj77wHMlEB)*KyNEWLK+Y@G$ zfEq0(s@?u)a+zWi`q~S~Pn2gZkb z{jZv~?sWWWt0~Ey8fuq1E=%RLrd;&aB6)L$EApXdPF!|VlY`^VZB9-WUA+OSe|T8Q z)r}*l<}}~~(DkLZim;AIUlWIWz3R@2sbjJ6e^$0g0?jcd&I*ab^Ea`vAE8ZT(YbX? z+M}P>yJK8R`PPY-eU~ClO}3KFZkcV+jR9`?=}Bm{d{xovc657%Ou((KeTe24nQdxjuQ?>EoVYL$zBvHr<2uAeiEn0nLmn`16#k z5vt(QN`FRt51L6AhOv*;;1%-aR^-(uz zLS=G1rs!?U9D>=s`TU-#B!6c!#FWJY$h`n?{nHe%CVaa96N;`n3N-gI;E#jH5sG9%7>S zFw;MF`f$(0sK&*(W7#(s4ntVsKGgLiHdmp&7-R>(PG~mmEL2iBL-e{Njf9kEq(#Hw^A*!lbIW z>{C`nTae0;cTk5GP@+?@VWQpFG+B#f+u`wDKw9x4ZNB?KvL&79Dy+$5YNN>bP@A%% zL!r%OO_1u0QW|h-eA~E(#%YiDt)yl~BKqdqmYqc}$dZAY3a9Jj8ZA*JT5Z7dDNk&7 z-JN9$TV~m6r^q6_Kpm~d>|@vMrs(^pb2IC!qRdj`jI!gbxLm)*23Dp?1>qTr(l>(< zGj=Tq24&32%-O+h=q00YylUcCk#A7GLZR_$U9OTB*6XzE9Tr{zrtu(QIj zQexs~uxSDHsdjhxJ#=32w^hq~th3F@EojusEhj!JSs&9nZ~GCt8~ha`1F$J!n#mKz zw^O-uJ3*3CyInno{p-ow-Jyl873crEiQ*$;S0Be-Vu3bvt@2FtLx?72X-!O#JwLmw zE~}el1qQx<4(R|9tf5bU){RAv;pjqm}Vr zM16hb<|oJi&U8j}A{&C$oTc;--Sw1^zMsFIlZ3=>sf792=%(Wij3L^1ax2QjNaD!? zaSHvbI0W()OcWu&70#!q)Ez6)K7j+dBOhFF9gt7 zEknP*&TGt1R)U+pxR%AHT{C6?$77N75%19#ITUiV=tuNa?cLk&x_~e=PRM&z^dc6c^#{NY8#gSBvS8 zR@PYg6(nfB%vA!T5$PBzNa{@#3Qa_ZH`>n_r#M~u8={$*vY7J4c3{bfKi~$O-$t&c znZVP?`)W9ZUFwQ0Z!dGBJq~@IMnXeQ1tiY4iAGBjyFbk04jsQ4_TQEI<1=s09r^4n z+Ko+kMxy|`{)@gFvitj6K6djZR%kXA`M#Sb8T?)j8;@#sfaK zyMAFy_khowio_E|n9_YVQg z_CmjjN2M8_=493-v0MS&{Te))iM~SJX#fvapl-3emvvaaN zj1oOh&}F(oTk5*c-77jQj7GbpvEEMVYYY|$I{O2@i5lkH({~^z2MXo~wlyhl(*{;c z?n=6mV~)YptBA{<(ky6!8I`fHWSBhn7{Q3sn^ZC$n)`;$EcC+2w>k?h{SfyNIab(JoCDi5?0GFouV_(R}|B~m;fTy942=oQ%LNz+$QRGG&pAz zZn1*{R6$FHtvc4$zR~s-6U{bt`z}6~dZN!Ia#5Rli(MIBA~Lj3`}UDhJ5%y??7I>x-alOHLYKh8}+BuIrC z36jQhANl+PN7}~ZfK+)TT9*f2JXikdtp`lzU>DydW(xve65(e4?r%_xXk-O06xRH` zq2nc0z{u5$jxAf7d|%kw!vq;IF#*?Vd}BTxP4q|5XE-Q;{8Fyk3Mnr< z30*hHS!meY=x!w&gCK50R)!v$3l!;ox+HE#qpUE2cokLR`^CQkV9jkCSniiuxDWn!RB2uanMs`KC`K3KLCG;JT;qX`mIXvprGMLx*hYdC8gaqX@Lxe5g z%qbK9HH+K1zq>7i&)jIsuOhF9Jlc0ru$~K~92);9Oa^{6EO|5p-fvEY#*FlGNVeT# z=E+t&L_F}OAL!GsbhCzUf`_Z;lc$_~H}>hl3YW!AF_F!7+v4=9w=)3r^~iB+($r+W z)0x+6$_4}8)`T5LbazA^1gWojm(4LKM=7df+Z!G7%$qLb(`M)v>nJvL z>@+kJgdlzmMbeQf*phmNE$vto`b?lVYD|Z?6xz7hR)g{GwR7q4@LYb6)xt$XMm7EA z0b<;zwX3!%9EtfG^UM<9Z)5|(5%p8HAj7oV-z0`^WT~3zxWC&Ny>-Zg13Kbf4_ILg zG#D5x9`ZwB_I~zn!8AbeOm1T@!iQdY*^6+{T;ppZPHgm_&L*`}JvEDISk1YfpNm`I zElQigFO{FdDltNw;7PQ!sDQLdrWZj~qc2uQr2k-La^DD-N%IEXrvep273!ILckwfxZc;Cw}9*^$*v= zrQ@Y(Z?Dk!o2#2KaWB0rO!58`4}cRc7<=OFblS3!+I83ew7?K&3r*p(6ZrnT~O}-Rzeclg~?(Udp%aM8d6gUZ?EOT-;VrD+}%7zpu*$0X&YDF zk*lz+4HJtUrdvgdoXC&rdwxszHb!eamBPgBEVST3PVTv@;Ms8xN_(?^bI<@1c;1!%O+tzBDs5Ksp9HA|Ln)$uE~Q6)@w ze?3qkk&lZhcXXY%vmb@!-584*(^}2Hng+dyq&kSyW~$D|IJEKyC1B9L;R6yWZ#&)c z0EIwS!WtE(eDyB{YY+Cy(k|4izhJ0@xG2$LTRg(iG~~k=f9Sn92?5X6J7Ke>Tz*HbEj7oZ`ojDy(L-n@Lnt57uOY1b zedu}WW$$h$ZmNY`&%2rC<(PUa!p22wDv(fmuzWRG3*itu+}Mzuv>!}@+YM&lZ&h2b-sIN-q&%`669$-2k$avcy@ zuO(t@PsJQ~9vh$kq%S>Dt!fg{TkP=pqRxx%$(H0f5cq@YX}5bs+UEIftn|1+G8cF| z33wuK+%}s=V!F89-!Qq~fpPu)&qK@A^X@iB^@2Swkv;hB+8r%p_=GnZ_e-^CG;U0s zPe*fQ7#dt5tz>g@A4Ygi2skBr_?L+ zd5r5!|Jw&$JUpH0LVH1`gP`w2tsoa%QTG}PnunDt?F*nLzV?vVP?qO2AZi;JBq4`I zRCWCfwYNu~2^K}c-?d$5G^GP~N~U0%kCj_{Q@oINGUdqqo~VgNmu=b1K^hkQQf`3U zr}kG=^ZUD(_F04tYe5xqM)BJdD-LV@r$7*82BY*D;V+nXP*74!i{PL8H@OQo$`s#( zq{5G8cN;O^7iF9AZ%youclhq(5-s(g7RY?W4wZC&r%r(J{&s`mU6tLk99*%e6B_uG z16oZ9s>{{zSgsO}GI)U&JHlD(h>=QY8<0rb+p3xKI~W(&6)F?Yw)M$CTlqU$0U!Yv z7erC%D1=wTsH!WMB$oa+R@>+q^S*rVlNWM+jtfWWw5?2X=^_<-b4%%fQ2pIp*hFN^ zkTk#(#)XL%j1wQkumn0#?KL2MC2bxhhZEs4Oh+~P_j6rR*KbR^_JeTp_hfpV+P+mn zpM~oWVtGKHp%`@!Nv*iKzw!+9us~?w&A%Vqe5Nc2IN2wtacI|fHkjuy7IO~v8($gA zr(9Vbp(j+X$YNT(-F+307?*jiJq;5`C}=Hh!~HRL8LTAW=jAEOIKGxBQ%=^B0rZdx zYlr}EPuA}2%X}c7N23QWK+2eKey~}h!t-CZlAX0dJqRT~nF=kFKwbimThQttzw#QfLSc!GaUq-6cq21wle^ zcZb3uc+lW372Mq|B)Gdnf&>c|?D2KK?l-#Mz5mWQ<5c}Qd!IemTyxE-CR@Ku?5>gV zWn_s{78X0MpftQR!@>pGe&uDAZA*tu_6s1cZ@%^vo8%Eb>Pjz&o*(N`dSoiBX|hy+ zr9ac81sZC$h#GUBZ*ZrUXxga?bRJ?ftD=MdHn%KZTsM`>U^B?h=A<=ls`C-(AzW# zrwkz+M=}iBq$^}ebL>1A^Rh;_T_k>|%DGsT9U^gSv__E*PPL3~?qxt_okX*-RZ3FU zPe{|vWB2F~^Ev~m)tM|FikzVb;0hna76)RAX8=}93KcvT3#`Yl)EkuPN-+u3+t~=i zv-5$|z3a`9=byy+0*{d27=IraIBt0{kxgqaeGWJ*v(Vr9^husAA*cjcJnGAW-+b&> zDB_Qk<|rAA2RE_1?k6>BVionlRP;m#He;beZ@abHx|A?IGsC2IKM<9k!ARU{cd~}l+O7*m>$1R zwF62&g`~f1;cc#6sG@fJeR0u$@9Fr~qS)z0(A-~xPIJ_no}YEBc+CakqWc`Obl-Nk zkVIR5NOh`$8`Z~ooX)LQ$^1T?7J@o4GhZ+c2v_N_9A(Fhiw*lM#mDjI{r?~9f9^En zvFeTks=>5?s3O8VYu!l0K)ud!J<`dQLgCWEJyF2qiZOYfrJ^|AL~{|Mq&qa?>yG!Z zzp^jBk7f*(Gr|WlLMIgHTLj>p7$XvAx`kV9ziLS6C|ka}s$MDNF2xTE#cEW;y-^qH z%Yj&7{k58DKB=aBLg&Bo^lLZ5JTW-B>GD5CT50z}y8gY|_iTm|XmrrJObAO=Z(;yjW=y{3%Mf%fGZD*f``96xs*ANb?1E$9s@7z zl!q$Vfq3joSUVn`xFwbdRe|wawGo-1;Dl{eeBF^k^rOiWv{WJ`%G zi_1%=X!)Pj_eV!hrIFu}@gK98mhLCi-q%)IDA6%g^RVam@6?!L*6+o~Z*x+!-CN8R z$duQl`fUgk>_DU++!WlZP~!LBl(p^(^bp(`_2swAY2(=W%XIiV;rwKFj53=ecZYm8 zmH*>Z`a!6ctr59hrI|=Ql4nu`Bwor^g-iiz)9AvVBg9<4PH^!vWcQBS-o=10*^CV_ zUq;jU`946fg0_i&`f0Qb3U5u=B(Thc&ztY^7gw-vt`gblxPQmqDI19`OIM&m1DRE8 zH}x&{?J*fgHd<8dO976`hnU@1!QASR^w11SA+65o%YlcaW7*+xuZns*%CPUI?`B2g zz#PEf3+klb>9T*PTZ!1noGMwfan1RVdTlA#=OvZ5feDO|ee^zX{N9qJv2w0ZlhD%| zjl##%xPijO%vZiuV1wCgyQ2VCiy(Mw$5M5P5zpJa(!o>LQ{u65hu@=mRUS&m*7N^* zx!*L)Hz^R>uG|*>)rO3GS%|-UP*9Sm&({m!+)TqlcMXC%Hd_Gt`J};J?k`?Ex8a>K z5;L+;FnxpnHpi)X<9g1_m5Unyi6%ZFgwOSm?|;6G0`WOC4_&%?;`d$Fy?)%Tx__H3>>o5o z(r6bPv61TkE7jlq@JY4}=fXSO$VXw4AhG|DV7XaM(QyU&d3@1z^FUJ^2jvBKVJI1C z(Wk=CI0EK)J85yPb){dw6{4+Y&cj8a3F_|;FAKmjR%XB9)9SPpMgmv5M(6xxv?kr= z=_%EE;V#5i^1hamMf8bOvP+dx7_G~2W**IfUrE33Cp6CFjWGfH%PHE`MV8SyMes^^ zmxuhAC5_eUSf!?C03O0#-R4U!{+@W9hYo=Yo1*yGVtPvV1%#vO+s6}%UT0+=P)*?|PYDzt&Zr!92N^s%fXo^Je4Q z%RH)%!FI-9g%x01%flOJ?qfhUa=Dh?`C-&R>NE!|GHvV&*Y5mEAqt$*rzeh_AGG#&re z%&}%2uQox;!;;_Vdg#ENFxF#DLo}R!BZ-aO=7qwDoG?!kTZo$Z2Qbh8(yYc!GDJ?P zKtW(3Lf~$E{p5JV&L+qe=Tv}PT(7i{`7*DLR6+dP6#^Mo!RN?8X~Q`7P~oTM^jvyF zh8Fi>SllL+!9c~%;viBUS@hZ9M<7#JlbU_4-St1?qSe(!`!*~l#P}wSD&+FZg;Q7@ zKU$AOMQg3{_XK`HOQZC@dcsQDyt*i_IhGjecmCQU>CZHiir$3DqjUz0D)D!~2FZIZXmaMg(DD3x5B+O8-+( zKt&o9tRAEI{UA+KSWanzOmVIG7SF(8GjnoihUm0q=sIKF+r{>8#e|&Yc;QPYvntQt zN1+WFTq2&8L>3k!+16topRQr z*{DY#vp!vj#|Ok*OwQ2Ry;j!6%iEQzgO30BtF4P6gDr=;rA_1y ziO?G^dKA0=Z39@SprRmKUzf5oI3-7{$} z4jq8S6z$6;Mkp2E3P*?BWd+kPNY}oWrdvS&Qm$+D5fsX%2i& zogf69&gnatv95oe1m52`<5-F|q+yW87yDe(W@cq=-mO20W(Pca z`Q9zB`;Tz_#p`nqnPdPs95$_S3*XuHZLUx?|J@LAygu_2p3do;#AJWp73y@$wpPt` zUy^Dx80>SM{a7H;klMHW6~V^z#)8hC@--kcm>f$SBv9d{L{&zjT@ADYAVa|m_>4s| z9YzRRxO!Y&G5nG;uc>f| z>|OWpr`*yUFZ^kAB3-gzeF`HZ66}OS%A3FLyMmLrpv>V&l$L}caL!0Z_0CZgAC!;d zZE>!s_5=Pk)h}slF|9gp!6%M~%6cLELk92aJy|6W3%L^f$I_$au8<1+6)#{q(fzb#pL|TqaNy2^ zU4V61XCSRRAwbdQn)sE#IM3kburwTh%on3pz;>Y8t+JF@Ti6^zN{H@>zym66h77AhC2%qcUo6m=c=bxXr{`cFI zXu^LF_`)fLEpIljfr&ufK7Rt?3rxrT+1LHplx4;TsdB?D8@Kz}z~8HKlsHcO0hdyx zH&(q`o}UsNok1z4%?}k5=L89!8*U=+f5|cKnI6}AFcw;~qqb8;JMNY~m8;KqQ-~q^ ze*%;NLm-NJk;oWKvrTFYT$K5PJck2B%G4|$HG)w}69FB_nc{B=|f`&`+N8faf(`*C#M+)jQsFKYfl1geUJeU2`PgZP=2 zG+krZmtV}iTutguYPqPYoX*G>QEQoEYticwWDk6+NF9qsSuJX z@~|*&Jcsqw5Y}ammo~ivOi?>8o(PH`_a$H75l?&3;FCm0zA~A`GL=k1ZFl!^huO6; zX}?SQsUPKCU6UfOOYI{W#8)n9{OQOeW9)r7K~+f8YiK(wo&@b6#*f606Y*dgk%%|= zxmV3yE_x#$LpY7!>Ycb4)Wb?J8Vjs#u01Rb@C5g-YM5Hi+SqayUjbcr{wD zL0vF8zwCTi=b8-vO>V$vj&jN|b{+I2@D}uTxfGeIQlYIm$S-H)JtIEN!c!>^%ciJx zrVVW`rpC`Vi5vXpb*KN0jsC~Q&CO5VDNZ+`?<5&!@0-ya(<)w|K=YGGAmX-``ntxk zE7+6;2WBt|pt!C5I1fIZ{3nSCH4HY2b!rr?m`;I13?(r`n<8#Def3^srb7d-y6fNC z-FcM-W`{(ihuBvK4|wr3J=MCsh@6j%@a6CnF&*M;pIyR@WE~9@8Ot;Mu1o#SJYTQd zM6tXQaBnqG*q8Apu1k=ret}2s4+0B`GVh6}ucPf``^u(?{OWnAI>Ip6SG#x2iBlF) zupoas`*hW%a)@Kg8F;kA1>{c9w)$~?R4}80QA8LLP70+(*2fj zhAQOMg5Ep<0OYOS_N5yGTZhl>@IAtx(*Sq)GEZANNI(oX^3k=MaBjAgmKZGNns_5AJ&}v;3MMp-MUvNdr6+Hu;VMs(!K2M+0cE(w*WF9pW3OVg_Tk6!cZu-j zLwli8*A!jzikZzvuYcz>tbJ?=8~%ZA;z=)}PCaV#v(ItCy1kHT72(c{uV7pfk>FPQ zg=+7?=)gO+Kx(@E-8olW;;QGUmedJSaV6ZI<|pSU+rC z^`f?k4i->ZWYawTeLFik2FHc4*1Z9CIO9u>S+bO|^!`gdKT3glWP|ZTKNTy9_h1XF zK6`oe@%y*I$xoO3!$xa_`Ed5B#V<1 z_P-}?vS01}&fet<+6hSSG56fJ>$`o`UE7iTmTJ1|o#_$zxM4ugVJRwZJzG2y;1%Ur z>^s2(jrywv=sL*t2*^!Nue)F)m}Z+)Mv9La5C4d>(VtDlvLnWy!kXm#nu^M1tX8QM zS*cF{G5b^FO$fHm9=Q)rgelLH{QD1Eytu>h_1zVdy$Se&jlXdASdj15@JDDwyQcFO z42t9}{Y_Tyq%p7~5z9$Rqff6Q5T26ai1Xr3AhlMvz+Bap_i&NyM-i>Lmvk%nwLYRx zUSoz@r}#`*HOPJvVfdxd5_cQ5EthVx1@>QsAb)aIgsWI{eNNI)o8#EWu^46OU#b!6 z=)&q{=u@GZD)W&)PrfZtz)^4ZZzE`qa(Sw(#xGmMPaCabHG?FHCG~_@EhhsM)o{M| zCvr+2+c${n)1sEniNJ@fCTdTyQ7VC!8rYcdtOaAG#DhD_tmlC-T`W)RkY}$PHlJ%w zuGR3gosI1ualKu2^i5KS2&|RB-WzWPRI6S^J918rhuJFAD-BfUV__n1!-=< z9&6n9S*Fh>=(qb8XfZ9EM+7S%Y;P+akq^$ETbLMAs(dfzP*u^RTbtUf(;dlM#-eqZ z@ll5s_6$f(Zyxmf%&2mGW*hb{wS&^StLBrJ^JZdIC)I+uCIfLWfBiJBF??s&?__%> zAR2`MnZMoJ?5y><|CgY}zca`uk7@H>UUgHEyzp;=8!c;hplU{agM@%S-QR>#`(LQG zK$q5*_iqB{0eDkI)~o>R3R07z8>vzgypaCL7it+zU`vA@ETf1@#p8;G8*#{pD+SxqdHv@q=sOn%v`LEi_^y z^rd09?D^kmY+PT*fQ_x*)B6{WWrfb%e$Myb z>PbPOBn>kyeQZ<g=6ldmy50)qtP zrtoJ3`$O;_RY7CoKL{r!dCV%@wW3z2M>&i`RQQ)m;r3o;tN4(U`bwe|13$@UYhZ_9XFGGW`4G&OJqAv`o|MB=JzsnE9LkSLP^ zjRwXTc12R#q=*VRn-8lFik;niAgQ%)kQ`L9Pm~T5yusTG+m7bkh{W#0WX+>-T*T6k zR-cAHW{yuH;QU#7nnJ zYE<7u-?4dKSmqBqYgOCrb5zI>@s951sF&_6YH>p|tl6fUM!}4&1#;~qgD_b156MlR z8$rtN{=(Z;tir%Z+U?Og?risMAC1C8`ZnUmC+di8?4^+oZI#@IBghX;IwPVH40TU1 z;7i;t*pLRJ?i*g_H+0UGQg5BJojko`7RlMxsu*%$-8TQezLMv-#p^RPeDqXA+K}x$ zhc16)ZBb4+LTm3=^}p^yUwEjB(j)X^1SVC31d{ifKwO`2(D^NkXU z5`Oc3jzPNAC~PCwWc3X;s`-oIn+OE~C~suh+Sa%^|KK<)Rqe7`F*Y6vY4hXaO5|m( zvz;>4LSzamajA+`S9?hn@c!rIYu^)}^}+v zAK&_tnmurL(v`!sk-_J%b#=Tf#&cuC8-K0~O>f*Rf-XbRc5R%01?hn|w%4PH>s_@Mp?A=VX z#;_jJ#^lmIeh_}76Hc?=r8t@3AV)Uc+7 zq#N_qGDHj5Y#w)Nda{sS@CrukzyxG@*x7H*(M$c3vM{;&(r0LK4kH&iA{f>?Ay8u) z9ps}7v2?OCB`(*WGj>z5r-y`C&wxB-D|Yo-zF!E-KD>jeDUq4Rr4LyJ+a!K67#Vv7 zpSRV{o*(9|hwpy|RLK2bS^&Yf z6;3p8+2ynWZ#ujQk(u-R?i-`tE0Mt?`>>L*1w%4v;51U54=-`q@_N7HrXF* zcSYLgw3`%OiVY&4U&qgu>~gkuS>0j*xSg08i7*t^)5izuqRB1{yVz56%{R|Y z_XI{_GodzEk9&=}!oQ177*J|NG7pE~j2ShxUi&PFFP24fPH797IJPs`&GCGuf)g{; z^@YgLMCQFc&-5$>Ny`GrqRrv$M~8G6j9X5w(wouaTX4(ge~}nHo&m?>6FXGW z?vf~nhxX-Zv2N*lI`hjOn~1%*5ty^67iz2D-Gnh1LSbs6>lAnH? zMki;6C)bfTmtf)_z)3g58tODxAJa*vYHa6}|MMS+;mRBrV)Qe~ZBaQxwfRT$+Vj5hIM4c{s0knljX zBQ8+NhF?}+3ltm|$oe;%XO~aQpn8z&B~WS(F}6&xj5gfT{%_6*0zcxgo5$M}qBwwf z^URjTPNP^nX~h}4{T~+>K^C%QWK_%POl#&OLc~riXWUqf&XbsqoPwuUtxeK_;!{V&2OHG7nXp+s}t z-&*&wAx~;T@fSlk+BM3)MVR}0CwKd1CnPm1{saeq#R&B0E#~Cz&Z-p;7yrGEW_Tx< zj|f8Og@Ai>l++{CDo8NiMjr$NT_6mf8r6ZnvL@|v?NBVhQ_{%c6((_8^?Ij5 zd%M(0qu}jI-%4>j)L8gX<^{>|xAe9o7sdK6OQ55JCfMyOGrAsr;@o$$a2AGnYW#i` zfbDFo{*OEBH{u}cxOfyn0J8Zw;!f%~D z(smpBHIH|cot?fLe-qeMz|Ls>^hNP(uJB+$3Xj4b@%#c7I#BIg-_hPCg^JBCRhPC^ zV5o<_1cG|A`1@x(k*L5P}38sdPOh54VwZ=_?$Ocg+)brf!Mc)ts*S^3_~qkc8h zfZ{!e#wz&?!~G0U`*BY7Di83EUs=x)XV{lvmS)jMSzbs}3Yt0E;dzoD&*)D^`>zV~8-BfQ{Q zPa;4mn3lPX!xpkabb(Ja2A;lry~o+Z+`~TqOEt7!w|7-a6O+_%S!nIuJO*qlXQ@F> z|94*ws~Q+JgXwD01GwWEZ0DrQ3CoxIBRCX+=#M4Sm=D}&wazOBXYo?%_p>v(tr zXma3bznvrfhu{2%{zt>1*tncGdQxUueD~snx#s~bEa2fK8UYcv>W|ZruVGak(n_0= zxneSZ*3O5$h}zIxC=SmgLGHNgW*xH{bBv)f9GJ`a!AT}ipO`S-ZLr_ zNXYeSSC?up?rz@fo*J;bAp^JvkYg$ao4mwuSJd^sb2gJ62O%MJ%htgfnA&b)!SX_$ z)Dqd^wbC>LqPZ$~H)l(C9JWiUd$>I|^y;Myp3!HUf&;gIH{t2!ANpHxw-)}Kw5Zl1 z?SL~&=>aZg#gvZyXhl?x8m4%Hga+5GeM4(?aRAVWTIX2j1n|LfS$Rd0KbV*_Wrz__ z8p3)uBtpe*{B!kOcofs;zDNcHe`cIRMd$f1Uin$BVMFis7I`DP^t!#jdFPf-E+fOe zg^o-!|4`mNHn+JoDhjZD#6!yS6~An>LPQ<50_!w5DD^UUD?4PeW`m7k1-`h&>DkB4 zI6C~iFpU?9l-$V|ArBua(M8wObH+2N2)1*t(@K8)iLmi_5wNZFoEVDpspCRa!uZ#N zb7RA=H7&4e=Du<*hZ@g2neyFs56AZkD#AqjCPDJSaSBoEuT=l0@q8BWIDdd(inwK} zU4%rc(mBwYb~D}Pvh1!_8Waq25tg;DPt6HzR^UR>{={Ko6N+BFP-*DjFhnE3xAc-;VICZ(TRQ?3fbWb``|2+N69}A%Wj$>HuyIU z;;5_zXJ+8Ej}%Xo#wz2wG_j#_G6VQuxBj`9vC*%3%FH zSo8|Z9;X4hCX*DCbDI$eus*yF#d`#)XCyUXUg*l3(P({%UV&?c3^?171?cJ5VCVBW zMAVZJuC#13ZDln1f7>*(@w_>u9vd6WNB#M35VRDwu_n?tfO1ONX}8b_zI^3$U=ioH z?sT#y@+=9$uWCQXxT@Li5u&6L!nF9gjU+7E8L?lr8WIzpbJjj;mlOWg9xTuAzFaI` z^*8O9_8S$n^3IuV%ZXcJwZG zicFTQEJe)f(vq7C$Zi!`0n)v&T;p$nfcIpymulnL4SNvM2HrF+XLPs*aTG`~Y7gY+ z!-rrzkt!TIZAv4@_pBf|gBr-Ky4RQU@# zxACn%j-J2$#+I<$&4g!t6NBbY(W}^=MlAulLfs_~6`3 zda@gS;}(FZ!;nd>o@HUyY!h@3i}0rp3@)e|p9~u*?JDcarF}aGi23UgxXKaj*T1*l z;^7h`Zbvkm21{t*uJE$@_*a5C=PSnqJkn2*u?dw`A=wMLTL-?CNkj6n#^;a=m1grA zw#I(`P@4IR|H1PAw@Ue@aQJg;^)yMhKI61|!S35+9&8$<2V-fI^&LLo2mEryvhz|h zBvAYj5?+Is5Gyry6%M9ua<0X z_MYSX@CCw6$nR=4i&94#@3=*U9(lNgz5k#uH*P+c(Ev;bQQsHrYreRZTsoz|)Vqv@ zrY965F~+N?lBOh7bUknxhW0`=+!>qlowY!?H)K!TBt-BlxOR*^*$$byyh9L2FXCem z0Py2rl9lD7%3gY65lxXFE2!}gz#ojXOOOOXO;CJkTifo=CFcJEP;8Y7gQtk6Z|iNU z#qFz<*7B&xzw&)WQ<+9-@~v`XB~@_^Kn3-ufd=+zEp)VjQh6JT-F$Or79jz4bElZ` zUnTiKLE;LIid5f4MXwSdDP5`6c2`UFMeSsJhe@agdnD2e+YMee?{fv!jEPJCc7H0n zy7=QAZdn;q2S_lXvJMu?_I|fdw4S%l)F@K5oZH?h^_=s5 zd1a5iSdNFpUs;>Y#Bz7!YXi=TiNz)>2BKIIio&a>v2KLk@MNHKQ{~M|p};OKpDiB- zQCfJqNe^4cudzwB3baG*akRKHcxs0@s5-?p1}jK4 zyxK%7E0TPT*Ka|=@2IA2L}wt-3V5QZsvfyCGHG9gS1G`0E8gRMRir_r+lZ1#&9b!e z!*S7PiN<0|kzSzR?UPv1k9qEOB*-zE>09|8CrPtP1^5IAm=!6KcTS1KPtmq6SM2l- zEm`1KkZGkI25GxP-e=u>>f04{o9%x|jB5LOr?rSrvH+@=H3cVXRvbq=ZWmT?4u{n` z)oRi{tuH{_((vX&Y4S=xFKo!c(l7{A-UW`fo33H0C8^Ny{kXlRH%xVkTh)bCkL}BO z9urmP9rVj9DdZApOUFvL)%Wa-GaT%dK)0VE%5$O|C41)$&6?l!`)JP7ttfW?9UFZc z&&yezDn>k!e{MemchaYG_NSm{gDkCqGtd5KgWuC1-ID+s#?AgA^0Xq12 zpFa>n<|cf1RCkX>5hr)Ev>3%mP6XG<2|aM*Mt8r>obRjQK0@YYl+a+0K&l|Am?Mw1 zKZuWH8W)ww^P@}@sV}NvlK}KfV1#o5O^8~5pq`Bvn%QRyl9}J$wmv2}!EEY`&p9!) z%>9OMjxH+9L}uOdJxf^K$@q+;<{eoFgbAB6T92JUL;R`aB}@;vl;RWm9O=2=k6RRE z(JQCUNfKu(h)&aO0Bs~ov)PEC6!E1Vm}bw~7bqS=hmg$Ynxr%H`=+tu(b{c@$wg8z zc|}ee()MePvIeZ7ZF$cF>jmBYLhGJJFn^=~RSCvh7clyMku|aY#3-kC5EqOa$$nH+ zN=%Y(P7USYrY@r)zx=2Sb=@aiufc`>G#9XnuC|iix@t#D&$v=!LRqqr-8j!Wx4*ZD zuD7o(?MS9|o%XN`VG+=OTw@&+@J2MUjpMx43%Up$bmFQ;@-k9taAd5P>2Rp!^=;IS zw%}rvXmqi)4G-HEt=6Z@J}q7<%O0hLSAQUa0bHU97plGpTwATiW&A_YT2E#e8Fo+U-LH3D#T`4XXfb9wS|eKr#ESRv)|zew38Ht?@Co48(q!SQ zrq!!kEewM?WihNPSVtfIGV#M!FfzIq=gXup4J&`SJh;QU_DN!N`9xi%4F4bI*{YK} zd6+i(!+9oil{M!RAb6(b_xn>xT+YW=T{(06{#qyR|Ks5tvF1l!EnDQ`l`p(h$FLY= zIp1LKlN!!3EJYc~7iFn}!ckaL!AvaHmaQaVr@hWdsX0CnF!Lbz?GU{PHTq_P0wXqI z*$lF!#ix32ZmGGXnVZ}Y@-qQ*!xA2wB-sqd?KwOD@9CFTG4Yh5z7g|=K3D;FO#xBQ zMe%;N4>k^kaCerFhv@mGpx(pS+5N@1l(gf;o=P;QTcKPbo z0WnB{=6~upQ1u{t$5DR|I$QHO*<5O{DPd~O^YRVc^7KVQRDqo69l9>ZEdF9HC4(x* zrr;z{6QKCXYb~pKWOD^|+$*=zKOi=qpe##l(y(rN`vDB5HQ6AbjsrE{xdosbmfVLL z+mVX#*%S}iv1o?uG(E|}PTQ)rwMC}G07L}H+c>fJtAM-BB_!43?`As2^S#OF5m25L z8~@rV?dVS@yek}|Sy1tu7pQjD915x>t%zkv-n}OewIgszxu}X1w~SFa*%H=4C|KF( zyBXnB$ehd03OcBhCOhJGN2Ws<)5Lxpvc#1>DClq274xgQUnYCLeXm?Dag+lMfBh;g z_$xo9AcjkMLv`2KeBFCMw4t#f&^3^Ot+a@S2*5H(3K}apSTqP!_CSSsUu3dh|2}Z? z{15_YM!$K1ZxGfLFsEF6AiA^<`G$m7*!r7oZ7aOEtbI=;Sp3JnszDWJUc@(4sCr#j zFD#QvxMz1JwY1@K>*pm*55xEb+qQ$(o-sqJhY8pbdL5iL5A|~P1)-?%#G19gL@+<- zA+@DweY=~p9bE-YU5nn6Z9Di-y2X^ivO1OZuo+I{LF0=zS(xTj= zc;ZTaeG&7Nl%kF6w{nce|Knl^s+UQ%EKoz`Dx-fijae-YLUm|suLNSg;b3QApw%N4 znzv12hDWGe)a{iI){SJo*}UvvRw$9f>({e!`cbNbnNxyhXBE1tyY0ylIDD?xyV3AP z;AQ%hTgb(PbtUn+hzrfPe{*7J?5zFeutk1v7Vv60k!a*4K?F+vn&lA@8aq0K7A$X> z>^;XV5$b>*zFNCbZxXi>PZ^9TLFoU&5Josy9Uqd8t(-bco4ZgFb?a~xioehbtDmXx z^IZ2|gY~U3xK+Uj!yMnum+ui@tdMtW>5l#0-8U51lEE8bNkd3FAT{M zWmUA;dz{l=(p)q^;%{$Zhdw+!w_}&(p!;OxuKZ6<8uRE{S zs4}8ZblGCmn`hPAZUR5XF3Zqdg3i3H*{pxG?M4H=>&;5D5N6v4CJI2gkC(vYe5|C< zUNL%gOIHni$qmG)P`{NW%oy$T*J>aOtN!BBkYAzm+eBVa;Tg-KVO@o@J39-t@G>$w zU3rbaRlSI{pXsX6k}_XH{b6h^;uO~S`tT5=!bvKt`J{s-%SK*mK;p1CJE8l!knW0+ z*$4KC63LQ&9D|PECSmH^25efn^B0iC%cO7Q7?>L*d{7alp}l_<6>uGSHHp{u?PDCP zmQrfKc1K_(em09*b++Qz_J&)i#**$!*t?1eQ}UlgiUzdv*#yI)O(>n%3xGcmFq7=v zhi|lCcXSCl*>-ku*H{OqlEAR)yIB7kiPRWH7Q7i4?VkIY;X46=t0?#XO7V{jLy-ql4H^&joG~5 z**c?Uo*zB*!M<#39QoyCNFMHkDEaCTfMZlWL%h1k8|G$Mz_M(T`&or{tZB%JPc7kC zf#eq|-tnXzGK8%Jk4vfH)&QUQ^iDpmXROQV*j{r=isv?{>t8A+JX?vw2nOt{!GOWy zg0JVYb1}+aHSJey-b|9U-lFnK-qN67ZWV^mbf1})E!Tot@{UM5Yi{F811*G2ns&)e zX=#b``Xv}WfAW^mRPSwAG|no+JwUH}Q#38Vj+nw=RT`mv@*58XHFo+458%de)B4~u zu_M=cwfj5=j4<^#@HGsLH!|wO>Et^Vdq6wj6Z3gSRF8Kjrt2QVq=72bW= zA;uhvqTD=95r3Ti8t)+(25PcjAAI;n=vg;9aTg(tO6!@Ib!0|q5`N$}DwtT$!pAS4 zcU-aDGI$%D+n+a6&U<7s@Rdm|F@yv=BtB(YA5a7g7ja=V)aW8=%%v&MVzn&oN3}~Q zHg+6L&s@lGt{+KKGeLJ;mYfVvXQ1My2(z2^^!pw3X6NchMv2ruDcO}02k$pNo;sjpqG@se+kSS@dL#m@kRGaj z0_-fr!-wmQuXs^powRkFRTc1QKGj)fWLD8YW`$*ygOGps(jtkFyRcgSH2)O{uYPU2 z;o=u@_YxoCY<`0m#Q%WoMx)6JV_vY(-ta*UcTq7RPJA;GM9wR5ET6J)*PYk!>zcoX z9(Tz?h`hMhy-`O8*LIGhSYT5(`5W%6j<^WEWB2$my4oAIvU^I7;f?k;p2yo9c;$cU zMJ!`jne;50Gvf4=FWtEUWk)6hOHy{3p~k%HcO89WeD6;44>A=f*6y7i1lHQ6TKqw- zGU~c@o`VTwJ}NwfYavZEqB(J^ct?MAlaw>dLI?qQhUR*pY|0!b(Syc&i>F<&?XJfr zF|^0!oPe9S|Gfpqo$eO{ZpV!--~7jr@3MOXI>a_g8(@ znu|%Kw@`w=U8LObc!!Uq^cy|zU87f?9kyT3tq9${%8zdGJW`i4U(iVSG~Go_Ss z)B61Z#MGTcw*?5MzlzNXmZ)2YBa#n|zuOJ(tN3*v8{$?6ZxEvsLpGRr z%sCB>i|qGr$bj>J@3df0YA}=R4A&Zx|0%JpnWWz9G%^uF-`BvR+!Gz^ut86Pixy7X zLXEY<%_-;RZq{T6UXbI^{c3vtNeYvk28&L+LhsvP<{jQk?~xGve6yCZPDiy@a9)Bb z?8Ux0ZL$xIfW!PC6@!kUTYZE8?Zj)c`d@W$go|Rt`wL#rcpL)VHiw44c`L+__d^tcB`Q;(W-B0rN|a6b zpuxuV?}uidszs&4_qflqOiY~uG$;bGo|R!58PlTg)t^L5gS|i}2Z~Om3^9^IMHn6+|wp_Z^R90M-4X{N8`Y-t; z&ZieK1BZa~Ca~+0Wd*VvCTEx$!wh95qLU=xu_Pc`?0KmDapFYhe+{Sq2P1SQW&gY{<>66nL{+2q0e{mYx#3sGXU07Hz7$6Y z+?Aa`Iw;2Obk<*O7uKkiJ~5Kg^8q7Hury8dwV_rJ6N=`s~FKXIgE92#5n zAwoCX_pj56vv_CgbqF88aUktGyuEJc?&J(KNsDG!{Hbm?Nuk*Z6ENgGr(t|m+$KCg zH!AVP3fDV%BN+C49ZL$r%n`fNtUJ3zg6wL;CQzqauvexxruO- zlSqE2#y7Ek#(b0x&~xtqWOVu+KBjHvO}L$)q=LO{@m_s66iv) zi3D{`N>mNSX`w7{kVs$d)=C%ypS+&$>%ov^YW%fiK~d3HkWkESRqe}ZT876!m*wuI zarxopdNX~!W(~*|b_N~+fA;Gyl5_yZ`4BaW3&Y_SX_+^6HDAgd6;hEh#`M6d?`5+P z+Ob%%6*mU>P4v7IAKE@MHuDydw=5==@7gS_J*Z*f!RzoE+ESPoyfsE9|GvHB~u*>+b&ZO7RV&gXRCkny6h{$({>*cihI>C<16W0|Yd9oo{{ z?xzr|DuLdzga-0^Bx{tny$%)ICi_L!!^7EARYmUe@s+}lSNKYNk^heD%+1ILEa+B! zCf&0Sl{fyhkSQaX`StQ~wf{=VCt4_C`K zLjm`4_j?YH^x1w_djCj0EB+Z=@mufmJn;jc^`LccDxY!gMv8HIpLkx3@}2#Yl`(sW z1;i=@KA<1MhhGii=Ne%fGuup;VD+NmIH7+uyIe$KQ&SjBPwhiy(mY-^c5!)71o5u- z=XBfNizu$5LbHv>N?Y6M<-fbs0JX51aXY^ZNw`W` z3X2X`Qp@W3m{GP)x5tcgFlI##Do_tq93{I48kD3b`%Mhq#1W!F&jA%X)4u?ns&>Fn zdpwcG7P*x%iuSN=$utO3rXAMMnuKra$UCQS;u%k&<^C-Y?a3A+%N0Vo$Q zJ=PG8iA${6wr;Jk93k38rcRi1S=!-SmvRc9cV>2DQ9t>5&7%b8lusAxcUuP=LY^)a z9x#HS38h>HU=lLQkh=({W$A~`cRaQ$TsUAv0-t*1xDxZZE>fAb`Ba#ysb`#5gOz(c zgARv+2`oUCmRB6T`Io##B(*X+O_~Tt0u2R(cFcpaQr4o6>rDug-`pB@Sk^atEk5!u zM-ngmy5uIzSEt_7SkUDZ@oNv9NYQVN%Up^ljdPV_jo++4#XaHwZ=mv@1?-u6PscuX zpKLO2(@XL~C`yOMPeD(s5iEreYffG$>rDKq-<1?RXhnm55+$F)=>O35mO*WOU)U%v z#ogU06pFhPcZcGo!QCxrad-FP?p9oi6}R9H!5xBg`Q3Tn|J*NkW>4mP$ed)(Bzx^= ztw&TsaCnU%;%@3j(|8#fq5i$QDL1EVG)`bk!w)Tz&+U$zBx+5q!@a~81 z(|71{gMrVZrwyRkE=&*py$~Q?=}@G%cEUj|uANI!p=?Xahnw9^(<4)@ffR@5zK=5w z-7n7=45Ume50sX$PZdAy(BS&LqLFbQ5hb!f zH0v_+5d6OVdcf+fq!be2q#hH8E@E5x57~wMyQy3j-{K!y;HLt6C033JClsk#X~UhP zNH*a7VT?_98X(+QbRCaA>{;DRI!{mRh8#2Nc*Zwd&rcK0(2gvDU5sc{2F|z)9TRz}jB`6jDTNf(7l$6@(zfRPzo`C|(Gn0*>m>l43XS=AD z&RRy74;Jd?^J}RSXFw{|`g&ogne&O(h7HW6hCs@!{EEfUj-@y(#1~6`lX|4x zjlef}&znIMi*M6gG=AT559Es@8Tdm;iX(Wy0R~XOpP4mG%INA+G^JF#kOCyJ zl{EY}eT*%B_agOH9QXRm($!2$`zW47p((y%H!s1y*#B9#%*gLA zLWlyB!dy_fQrDe23^tPulo$t8u}<<=kkTYn)rY{}g5E*zX#YQd1}77$K`iJN;RV+! zj}tZlgbz{Res1YE94N*u=HJ_&2!FxZ?>ob~M6Y>;^ztf1m?1eMkPcbDWNFtc(bHwm zS&=hO3MTVG|28Z*XeN(?a|rf?hI=%EhssFtEw;aIyiwX(t4b{+ct(y99QvohMBRdWzLulGEhZt^S*4pCXu3oAX z39iKqx_Cq)vuHXUUuk1=im({xs!rFx$~Nxe-!-PJ)!yT*Co1h`?Sf&5%YT$4rfm_M zYw2hDlF0Ay_{Yv1w^l6{Hi$P-HH6k7Kyf|jxl~le)f3AhzRC-tD(guK8_l;lD1HR| zlr>G7qgjS;u`IH;>Xxns2wK+R*J_r+m4Su3J-_%P(uc|R-q9!csM`>p#X}?3U^)pt z^9^kvPPU|ea*nlLJS&;t1j)^`L57O5aqM1_J6V0ZADc-tOSqem94&JZBrUKM^FWd` zY7@hFXC06-<8l2s#S6es3DY>}9hbA|6;rwkwk4CL-`xC*S+A!g3l=|O5p8S)H6mKFR+zm`1;^akUIfMP387%I@+>2YP5-i~6w3WgY* zk=(DoxVWp4(%@*6?8db*upfnkIav&XR7bIn>`fGXD!Ab<-E8wf!m(%@XI1A}fCtiD zpY+#s6etq*YTmWs@>n9liYU!)TryR`v&Pg?V$hU6#I#ZWY zoM`9jO*7|g2?7B4%lEEYJ4GFT?k}HaXH1C0ZbRhr z?PSRJpaw8d~&b#JFzdUvpJ1Mx8!a@spe&fOk4A z$6Q~?!T!^k9dDh%ACcnRlEGholwp(TL83+0+`<7o>#4~gofES0yfn|vQEpCbQ!tSK z_iOr=$LtrERmZa(H+j0hR4ewoU3glF!FC0gub)mnPJ6Vncn%mM#-9$b(VI(9D_xc! zSj?NJ>M#a)?h@iUtOfl;vp^Z%L$L?aS?6h_NdXLlPcBT?oX|gbMK>3BGIGIaqo(S{ zD($%s+y<}be2~8e?g~3ZQB%|l#v>QsZ-fEgkzjtS43%A243s%R=!57k4M0&fMZd6(Nc<1W9Mw?Fr zRl%QJTsdC`;?DcWFW&?m_Ac^#ul6l>z5QOS{_0$17`wkz8P82UJy!o8j)I?G&}1^q zorQ*<__l->laVFO(LvVBPoGm^JGa0GY%YXYK(YX@U%vOuPmR>Nn8olLULoeCu_vr{ zs}>nFotYqzL!w+k`kB(f@hMT%~@0k()22@R$tVc(gh!t>9(s8B`f7c?Y` zs2}_A0OyoY5IE1D{J-lDMuO7Iki!dtAH>6-ptk4jN#nCwPcl2KZSPQTp-ia925}qE zV{1VN-ok?7joOp@gQI-;F@5SAznoQI`;W8G=KFka@oR-g;K>s-+NLiiJ-b zw!$^*I5M)5SXa~~uAV|rJ%8fsSq3YQJi7kB7{vRb4H-YDJvaWQYMZH>@ON{@Lg>er zmF5EpMVN^k1bas~%?KXr0^ErSs=-hdPd$w1L_#W(~pp zsTD%@_(SLZH4My2%p5%9%WU=gcv&K5hCLqnaVrm(0-Mm-SqE#InQY<6p{21~2auA; zMx~E35~d`~bEY-Ta~Djw)U?g%xF%CYV#Zmy1G4Q`3jUQ$`~?Z_#URQ9Hr6WR3^ewY zD>^HqnQApGZxw$&ZE+JnPa=I$(pLx>`%jdkOKGBaI?{km{NXPCvGy-s`_6$jtizb{ zV`LoCG<_G!Rn6J2{k*DN+aG-!Ps8xH_9cb0tX&=fzJ=5J4WNEnLnev-R}x>?N%|kX zKxpd?nsZoY;w*tGHpBdHn*GF?Kl+>-OFbNfkxw>DBL5xIh?8BkVN8qYtMXhkcNg${ z9?_-J*?qG)06a{$jgH53CXh6RRkwc=ohT`u{e*-St)1lm%h;?F9<5h4Nat%3Ip z&rvR2`9Y?FPG@64&su^0tf!~af+wXAK5GqZ7z1||$~n&($E~AU(fcK#>_sAcye;p1 zYUt2PJAMowA@5%bHE7~EZMqfo$ZyDD{MvlrL-U=J_8f!vBtRaIJZoPDyeb1BAdlB< z!W;1g2mvMqjKbatrMP_@*ma|TP^wd!?SYf+0=2wixdgmI?u^?erp*&=1NeY^DwBX7~Y2Ne|GTPOaPcc@H>=H@YGz-OMOfi z_1N!e5Py+0g&6YZrgx-rV#!rQ`PSeI!o@$XznBYYOdv8OL)|=B26c0b!fz zazMHNSHpMwQ2}g7HBWU`6(G+Hv*ey$bM@z%i#IxD?o9u|I!hmBp;dEzEnqxIAVfwu zxBe%b8HvkHp4-YWJE@FJ90!+>+J-(`2kf_dr8o<=!N#h;KDUbc{b#h9ki1 zTh!z!%+q1d&~azsE58v<4$6(ZDdA-!c*F7I?x8!l9Tj$#^{<&p2-7ahiyYFIY{*B8>UnY8zE8f#(*;$jk^0s8bZG3|k zj=l`hV9zmdB;Psxuf|1~%)j2_1A4;XOJcpr&!d3rKA=$t%ZBKV|Er(c)X3H=eXhzq zp9-O4%VYLV*o~LN>b%14cb`0-t!O&aos2ea|I}T+gRY=g9tP%#6S#jeS1S*~Qv5nB zY@8tf9DHlMA2<$qkAj~DahBWNAB8_t(0zpx5^>M7`5Eu2yc@nxD(c)7ESh%KRTEX* zZ~&L6%v-_-)&SG{PkG(kjJj>W#l@~~T3nry0d^YFNM^E0o0uFe>-}V0Y=55ba3h$a zB8B>cT4QhU#j>YZ>di?rMS0J^N;AvlKZ3bp5{-iElCrd_hR+XZt_-+K+gEPaOS9eD z%>M02et1{wO7>+z9|1~-50ML7u$%U58`iUAA{0|Inh^*|K4u=yaKw+x$pt+ zb@B6p!Ljls2=BQeF|({!97ov zJx@yj-?gir5pdr4Kpda;1)2X9fq!7F|LaNHhkwc2VcZ)M^YZUywYBHf&Ii)5IpOdB@%p#+?YK6#^F3+B|NokY?)*bP&nbiP#{7#AIHb`X zvt$}xs;?t2#oDoL+;XkI48`8hqlTN+cFM|I_-CJBYb`k%a&KQ3`?UC%O|*<{`_t9L zB6`zO@L5N}g_F^nFCqtRPxhGOLJXQj5U8wa+n5}a1oKUbrW@70_fL=XM2{L;F6h!f zDgs0p{hku%Wln(gpKSBtuknl2%UJEpCrjjscaeV*7im~;U3wp=rnln)iq{^w``+zu z%f#vr3Nn>kp}yB=2+q@S6VZ+C&&`V``u=UNC8@Br_6YY~dh+#?It#re9-z?K6?{Dr zDSNRDw4v5rOwp3%Hi5yWqfFn-$j-*_$h&i)CCqnfjs@lF=nJnxjrK=G^RJ+T;)3oi z@@GdubNj9Etu{#AH+o#@3bY9nC>?rdiuwYrtiw)nMCV;o7nrgMBKtirpxiGI{aZ-7 z@ohW5d4J4x`fxo8%^F*S)$ZmuD)D?IW0hzUMC|2@{wsDLR>J0T4}20#DBfSzI;YMM zC3tAZlJ1CbON(D_xdh@V5ES0mj}QxJcH8VGWL^cEprqm3oT0C%Ko9-JjV?PRachA5 zb(ff-O&|V+0X#irML8)Ay9k#t8;}$KiyHw3$qSEzA@}lR}=7KOtkZ zPn}i2kqbT@T>rsz(Nx?q(zYQJ4XRjCg!@M4tvaLmV^#dy)(h#Xrtmb~H-Jm*C?P|D z(39nyRS@ypO@Y-p!s;!#eKx0;2?e)3>mu^T62HiIo#kO~Lqv9l=!eI4y0(K%j-Yy0 zYX{D+EO-V`T=`sKngCyy&kx$uV$@VYC(yiCD!g|Ss60b(BAMAI->Oofh!R0&)KSTTNeIHfN9 zeXUC(X&38SClpm+-O77@_fvo%TxRRZQ&u?n5j3-Po9<|Oa^`{`NBPS`5{+A5;6+J&>RQl= z5B=xZti|e@tm1xX^aad95Cc4P zie6i7jx|#mi>R5oM+JJ(9x;-&XMwHq79WV-=Pa@iM`ZuGYEFOuv+ErfE_dVu5y(2u zJr~a(6Xz7^c_ihQnXW}h{e`4{!e^~QC^6F}%l~P|#am{xCu{Q((tdPmf*^1gGNFGG z1GdR+40QZ0Jk4{le&Ygu8EIKu=5M6rGYjOP5GW*--Vb)ocUc*8A`_OEotT74)Tk~{ z@4z=>ptXsA{SL?<(ZdP=wd4W=!)O2g;xa1z%bc^&0Vuxt%W-rO$f!@Zs%lria-j#C zT728;x>uj(GP_7N3{7e!cv77bV!Ba@k23s=&p{6OoBFBiHeXV|Yfh-zwW7I_J9FD#uRzY;_`sT1_E1vhAJS!}kY`?qSUoVF5PC!@F5*XWg?~i#-cgI>jmq8S3 zzF?fZ2e=Oh(Ko0#;d{dFi|1|((bqZA9RKI(Fp=QWT<=d9!nc@jZx`?6{`VICEgkNY zomU2D5Wfq^rHucrjOWYM@KvGcQ{h8<-gEoQD%%HTb$3RF;_rWV*`|2grnoHqkg>Ji z`mxvcue1G2bpW_s{D_7b6uZ~}h(8O(h zd^t(Kw_HdkBE|c|@C_u+_Y~kc1>9)txIc+`FV9)|-{Spam*r^L`*u^@;VvT!S^l>i z)#XUG)>p;>cq$CvbzL%2S73pfVvq>lcwp!m7OpV?u0X##c}Ik4#B))?S?mo4N)TY2;9r4QkNTJT7s#;vUfJ*9!~=+zT8O z9#bZ_v9+%L+!6nTh*ZqxVFS{zRDLWCh>SfhZe-xQDY8%EgB=kXYgq(V7|dg*wZA)g z5qyz{^xw(BWU2tXVm~*^yu2Ajqh01idDB*HsYc3P$y^&{4rU-9e&T^1o{Tg%^Upd? z^+FR4NQzvO@MpBMa@gQwLj3OiHpfR#V{JUx!HPeKl;x|+^IR}?M< z%S{b>MDd~iay&KlGy>|`&vIKQmS#(wjdpa$bK%vC85SPWtJ2#tJt`PVeJjpIOMIu( z$duvZcx^e5^TocZy85uDkn%n5kbN`Y^l3o~G7uz&og+?SNqOTHcA15hzN{x1wN;#v z2AmEp-||vIkn;|tV_|N9wtKL z1!5Myc!}PCsEvFWAE;|AdS}o$H|MeXFih0iCdJ2DDAadw5*@eCwJC^3ZQ)xL_z~iX zWBJVqyNJg7%=`YtxFI=(qtz{_Ld~37lXwuG5M}St87(E5rBVaNozf>1^Bw~Xc`s0& zYHn)|iZi5Wdyc9Gr?}FL%5BI-a6e@C-U;TZ<egolJg zl3@EXy~}UUvLiV`0>h4!_hHGEYQ;v^>kkzCrjc;cu@*jRSUIyM2t{2L=Qh5#YQA7c z>7LB}H|Wm{sVgq!DplFy_KG1SV6shNl~?G)HjZUHUp@s9JT-d3KGo-v)A?(L<^RhC zC|vy2yL!l8&vk@d=aB9y>R7{_10>9OUvvCkS)2c2R&itX*6haQG?2cxj_CN^4x9Om zD8*ZMcZ>YBMmYbzcej4F>7;R67E#A6ZzlJPm&ma*%+I)x~taWwpEmn_{i#DvFDq)tP=` zju%EPer0#I>+yJ@y2blV0zn?klYaNU{w2W&((&9S*+hc!eAo`V%GrF(`OvQSJXCG= zxStUly&miAj-`Bt3IKJTyFJ`|I97MQ6@-!ZXKmb;WaT~@ys~rpJpMBt`ltYiP;Jip zpU%6V?X&apV4;lOpFq1RZ+j}2TR|A+@8mw0eYMZZQ;SBYH+dINh~%D7c~A4D4gP6t z#zU(c_dGuPpN*FdpZ_ZxcOSq@3FLp@nD_TTckCUPyl2uivX5;P>g^Ka9n-=0L_hCN z*q-zqe6sn!3R3<$Y(w#!^B(H}Jn>k&c6)!m5D9v}9uUp#dB0+KNA!E>c_r<>n>CDp zuaVoC9dW2~!w3Ii+K($AlJmNxw?qyMRGyX^LPcVvqG8xw!vP&O!m)CABO;d&%I*}P zOG62}?-xf1Y_Vz=1&w5SN<*z>AyJVrBDu3HmcX{7GdOwBuorx( zCsSgPAFc_|AYF@&+a<|Ua9nFMz^QJdc4v5<8iT$QBgh{DDT5P6uA$IMPG(YL%N6xOB2{owT*lVMfPFgTkrLu5#&Xt zj9^+AM5C<#t>hM#VwI1$&v-nzLcRpn^C+>)=`-8SjD94FFg?6LDKv%+E_18ZD~CSD zrz`}<_AyQ&qz}I^7uNxy6j4U?!Gn>VYW`fqtB%>#F=DlNYKZ@EH(=y{`cbd22NZV6 zIAIPYj5Q-4mQD&arEa{#v@B{%nkGoVX%>B$6JXE?o#$*J&Ro*Ir`JwpNULx=VSJ7- za&OEq(IpVTWzUR&lJ=OoE1X}A>{bFp1H1?5sh2#qzGKU=s&DKQ!)yVz>R3`TzuP2^ zw5FQEPV+Hj#bpcTyZVom@Bh(+TRMbmME*0LuZHak6K@MM3g46=TQf~0Z`S4%mszMf z|A(~TA#6#-N9Nlhu~eIV7t+x~;WnQD8U0R&0w-zJhZn50nxD>0Vm4>0@pN?}qg&uv zbNB5eacdQFWmaW|&CGQ?*Wxsqd9kXoniEpS`|4GB` z*Nx;-e^1GEr|%(k^=yn32-CR8CzWV|oMx*%baL?`*69|bp@A2=l*h03fcNL)i;W&e z9qy#xLC)vwF~Yo!O_hxQMB)pg1X_zb_4)B+dt}`QtSF7dPQJNEDBZ9bqCK2aj8T z^TwCCY!0|4p|ep7vlZ4DG@Glv8W5BeYV|B9P?qRz40L64WfJ`pQI&}i)-6FMB)5tI z#O3YvKA`*qL&@nVar65nZ+)E?ACssV((DbGpMQ6*pa7S4bar` z+A4+Q959P!qyJS%_D1vGoD;{b+rcu9abmC4ffZUmYG837NE92Zse zK@-GbBh(Ql)b{S54#(Mf4H@_WNAJS>7k^u7{q8C~2S_&JdwRCf9C~$no)%tS{{tjf zffzne{x`h-L8WWiQ0k%+vS|=?#AJ z)kWTNO<(2+1#WjoebPHZJCX={V4v4gVV}eM-Mi<4)x!z($+YOAfwRfgQu>~XW=ZV# zXBt)^G*_f)#6()`kpq~UamUFga~N~@ak`8U0nHKyuE1zo2HT5>*SnR+NB$av_Fp!j z8k1EXp~t(I*vl*^(-h* zTc@Wi8X}w4X`Vik7gJlFKDZ!9EP};VJ_cA7jIFC(Hv``TqBRpRk(XPgq*ss`TqP9R zE70(pJ#IbSj|%Rf7)n%0^0r|U?^VK?eJNKcsixH7CI)u5@65+aGCgHXf-*&aJ95bI zu}xg&3BFs@ZHT)`rZt-t<%Mb+jb494fPTGf!T9kRiWd5OCRs$Qbn^1)fDkDjn&X!w z<;aW-lpB7&auHn%l=V)7>6&$46hP{YNPT^a88UEe_DUbF$>rn z6Ab@>P##Er50A#ZroD8FGN=*^c(v74M>x23(xRz?Qe*$UEnOPpR!@>0DTD|>9scu0 zP|O&D_M?qjLP8p*OTV25LHzH{#;%{?9yysr9RsO5mMl!ZBHUQFJu&0I6@{jY3T2y9 z!_;T<#&C3%9E3gZ>27?c@=Ekv*R&z7gQk&t%3Q&!nS{Vz?Xyz;vUY+=NjRtyR9m?x zE7lCWKE|$=J80KB^Lvp-7|eVKp~fdw%)`N3?t2wn z$YB{4FhISZ0F#Yf&81B5-|RcKpqr~p7~0Xcd@IXVwsoO8J`So@)3Hf`OSlSUosAGO zOe?jDJOau!Zd*qc&jQQZs+JUa8frzZrBLl+-fx&YpHlSmX&;wK#(cRl#lcV{x2*0> zq*DeW-ULP$+}I}^z@V`nTE~zKI<2yBk-*glfR;oG#la~V|LRP62nY_Elnj-9_o!~Q z5{>H8@OCTmk&k`28yA9=IC7NA?U1RsHHVvm?2-JiVmN#>hd-Wz(}&EmMyAIY$G~On zcNK#HYotSZ(L~66qtdZozYj0juubP~;3p(%q@u@Jq=huZxhESflA6vFZu;hK@+%!T z(ai+rQ_pU#oU}`K4au~`ylD$kiP{(qcEOTlH%s#4E0@yFzfr|-uU6g4{SL|mZ|Ja* zfD1yLerEli|H0dXO$kBkHJ-Ok=7g9DSz(2VjnRqLXE~V?C3eMCUHP2`+yn z)>!yXFtf1qZYQ5o#qZR(CdwVSQaYqMXnmB%Zxcl?nGi^A*3Wa-S!2849GyPL&9MBJ zVl+>_VF*z_IPUy15 zkh}lA+kotI7qwPpqu%MA{4qsfvl2JcAK@22!m7Aw(%O$MdcONQi#5mMnsTo*5x6JC z6D6m^`@`{_+4qxqcm%T6)A_VRzDVT7ZNZ~dD!D-HtXIK1>m_DRJ>p41E3;wqtjJp1 zdvsw@@iB=^sHehexdzVxHysq|>4RKtx;H0*Mf`pbuEyC^!9O&1~#*%j&XNKu| zz{$EvBK&!&xrVp7#IbAGuFq=QhRv(2au|)gqZ9Tbeo~zs9ZDiqs{kyy<}o7durh;~ z4nnD?GGAQl8gDasU;+=6ss&W3Qd112hs&2h*Ibn@%g_V??USdWo1IQVhc3fEuE@p@ z{RA9<6`DAqhJg&f(_ufRO{iatY+^^pI1V6~oqKVM(`C#ZAy^R{mbS@)n2 zd4HVR?L(w^30-^FUO9a!zJCJskmtRgS~!7oJh~5`yPwxDhK5DooZ198Ue7%)-tK*N zYg=kQ|Cda)YTt1t1=*cfKKtKV&U75$tM!EbBv51?48y*#R^cs$IsJFwZ4oh6A9pfF zFIXOk5+G(ZFCQUcH$SPS)D0uh^7S`5*2#y-Sthtoy!VT0uvnvZ`6n+~or(5q^E5=E zIkXJ3Go=MV4O$nU$|o|!?^!`X z_YAhnxNqB$qWfXoY|X6=C15*ZH?%ey&7+xf4ahgJ9=4i45<2C3?!sFgY~*BB@JEE@KY+{eEtD{FH^k~cv5wv52qLaTwN>_ znJ3hZb1~FQOf{!+kvB;}Tsz7KQZmv)k%ZqdUR#b%skzC^Ea1V5M}@eV(cOeXiQs?k zMX-lHzw#*Fm=hO4-*3imovFVwN{|My|4cm@>vu9m^@iZ^Id-R^57nO+`gaLV647~T zqkE8W18M)bUkanLlKI2f+VYDq6~;_0a9u5fyGq9i#0*XvsFfvhYbk(>2C>bAN%ZZG z1bq>tn=_v?^_qK{+&_0U@br0lQedSl88-72emU=-{|EhB<{f{bK|&JVBaeCvp6R-q zlZh5nM16q7_Ukc2;Keqjqh$=%H`bG9W)58T<49_A4A+-w!7}4W!i8@9U#iT>sa{3GL&jp1CoM(u~#4_>BSvqLe-{TLS zx^#;N;D%944mC`rlO}~n!D-OWzUE{)$*rZN^v6Ic>MU3up*y#u=kGzpyp;qr?PnQ0 zdM96U0x5R}Tw-K%d9nTM>t<-2A3Wfw!n!Ymh}0W z%7Q!_C?`eO%ymJW!&SQ7akn^(7RuljuWC!QQ(L}cm@~7O(_ZQR?@ZEkqRI!$SPihB zITTvb3LA{~NSB+sXNM}fBzUe207m6SW)Q72(<$Q0*)UEMYLbjc8E4}WmxZz`$e|+k zFcF&avewz&XmD8e=O!J*aw26;8=LJ*Nqx@a<%`;wJL`7pETTEq;a2lkq#r9X)wcAx z5rTIq*4=DT#en51oh%}I{X!NciV;PWy@qz{aC?$0~@SVH&?o%kPsKCc+fa z^V|fMdctK90tT?T1J-}qael>`)L!_3xD_gaBI9yLu~wVOz1W#!V}C+Qg07Qeb7l)2 z4cwXC0g}jRAv)gnGJd-kM`SUp3%7i3r2C!HtRrij1>IU5!-MU(aWpvU^@(JaV}d(> zBCb#Ip-n71-|HrW+##TR0KJy(g2R6fazNwO-TcucqPsCyXEehrsHU zzX1seDB=D@q`%$LZX477Hh9jj#DZo#p5-fzVcK4c?pW;&=|%^`WW0^>Jwi55{Kf1- zPx^h0M;FR}aY0uf`|)=DF!{iLY=zDf!;7&V<1TN!TJMEQ$L;=)rvJ3W!{f&^XZ=p} zZC5lGB>Hq%_|S_eaycvDD)AhV_kjGe!}dnq{j^ZKb2Usc%=S9V)>Q@ZFF50_^+NM| zhxk);LDs>dH=LqDd9TZPf5D>fULW2GFLxgk8v7R`Sq-wSIRBSj-i3GH?kgSON0dtJ zM|W?tz1;tQXy@aCO$Ntog}#HUug)bwel86|0WguyXJRMuqXoU#DU%3C7X23^OlBxh zN?_(Uen7#Yh*afYs@mTIm1kJB=QM#-xuuSQgR?&Hq_-m(H%@}cgR7&bMGV1<)tXUk%#D| zodb0DD{F6S&)=(qR;aWuWS4i7L;zHw*W0v=cj4x}y*M@bCvTy!w?#*RExnN1crjm|1OO|BpzFQbuw(81tTp z_C8z~&lI=!3&u4r7ql?-{hlJ_)`A+8)<^@L+I%X0`Hy_=&!^%0Bs-0G>X+1r){x+Z>z^7}M zw7!)%&^}Rl$ZU(8vN+t5a`E5eBJzm!I|p_nz?m!DiGbg=@VMp)ShG; zdJkg5?ZJdauQb$!A&P9~kMDRPdynMJ5MGp zsFh04&qwmBEhvLhVMof*wv54y#z|A};Rx4^6UB?)%WV`Ok%;hYJbpWqM)MeX+;Yra zW*M~U8nGH617@e!A=Ax@4h>!F2>M)VmMFD4+N@kNLkoU6r*9^kDuZ?PpCm4@ks%%K zSc}J4BK5RwA`16E*WBEjhNe`t@0S%+f+v7cYs}{P1-MZl`}7emgP`fgCf<4)Ekd%9 z7Myr70N<$wcY?aleq27^DZ!5W!e-XtKo$|!hN@Pe_4F8<1_`a2BH^pIf%JUDX@L5l z*7;=w_Qpt4PWR%f0;{CLAC(Z@c0P*^?!v(J>o=y_&QheuKHoN{nDi8-V*dPX==5Xh zDfE6S3@wb-#j5c5WJCU>Xy=ysxR8fIgHaK#qJe)~eTwM#>5Dl--=E~19W7Z4WjIeh z_4K3{Ji7YlEmlhYwLlEDGUS?Y86{y~Wi5U;vta~Gt)LPt(jl`ne(xbpqTgAQ<%ns> zY2R0NcRFmU4wHz_1z|SeEeAklg0cyx11W=f8?Tz;uiD*jXOmM9tX9)a(s=mJYfss^ zCmUfUR@6yt_}Q}^U_q_UsUOnew3za!xF!rPE9ddA8$WajKMZJQ+PekozKGcnI3p^`G4{@c5KwWJ2x+%Z*pba~@2m}#>#CMl*+DkCd+8j%w4#? zT5EdtihLgFbMFBx!WdL?H4}Nh%dstrEJZ4yB%20eW00_@BLHrFd`$82zooec>ChFP2dOparhsE_`gGT!~71z+#zotJuxkV zPEV}=%-gO$Jllvq$aI2vcgwtQ&mk=s{tp9f&*vRiCA?k8n@`o7ksjSQIjy*wm+E=7 z_ar@6B%Yhk8)0sS9*~FshzG5m`>YQiA7%gF9Y2iKpD#5;?=)InFFZPT$@oao`2+r0S(GoaLS9U^mwt9c=jBJBFuZ`a5=(KtE4hJI>DiJ@ zNqufsKp7lR^@nCjdeSz=@Iv)&$NNd#Rw2bJ;}^p}w{8f!`T7RH|3e8VmYNq?b=mSf zmiy?v#R84zdQT^A2p;l6!2&iyZx6eKfUR8Mx!3a39$=vPhHb~Y2Texb(S(1%oWK$8 zGV>1VW$qmjxEtj8L{YOd$-9YM6`(tSqaqZ@kmtjpfi0~6JZ>Qp^dBMOVUIyHg6(B@ zb9-_XT~%*1SjQ{A@~Mb(9*=U*gw>G?S_FmCIDic^Z>pgXHv3pmJ4S!c8}oZ|uT0cP zPXbD0e#qHqs3HXEmt$do#rHtEn1C#y6FjsnsL7ALhTt4TR9)f5FbxmQjx0ONNgbkH zSn5%{sU(9gJ&^)-iAP1T(QCGvAc<$n1iL5|Z&X>1^9!#Fp_?xiKceI_A<3`nJ0F}yLr z^y3^dZ;OwV^j2y4EuvFBli@)wrz(8o>m5nWW7ZyeRhHRDBxZoA@;{_c9!Ih&j%K-# zm|$-aK%!lKI0E;mp$T2?R@3qMBA=?Z6pNw@O7dIYoYL`%NP;`{`5Kv>yqzAcnSvP0 zg+oP07%dFfRDgOOLa#Yo+5u9F7unQvCT_?(Nda1GrtkUu@H6~YIzC1&8i69$U+Lqh`VeuQfS*z$-BHv8FQL-2L zLW4-@X^}aRQ`#Tp-Jxz4g@o@D(PoHcX&UL)UEE{I1+(q;(b1rI!c7UuM6qW>V$U=? z?Gx#8yV7Clp3-{WWM3U+m}W#9)aWsNYegm_3oq3qKOAvh8TVsf(&D_7FM<&4*!E-i zsgnFXG?7uu&tAz@C;S5m!F|~=I~&Ok(I{bCF&BPMMRd$+*+j~OcuDCcX(!_ZrxlQ-xpRdEn=IS1D|tGE zfEz7>=mc9oA$gYf$dQKs-kV^;aPbSgJI8+D*lyhr2_4hK*VG%GbE*!TK!F6wu{*bn ze|X7f1+-@zGSL8y1{?khfVXyy##o=NG4VVbKsQ$pv{L$lVD%4tU{L4JnvD}{m`njI z;{JjsP`xYib7O8f>~-vEi(Zf_^B(yKHve>?Ntmu9)Sx5w5BgeMk;=hyL_Dmu;gtDY zCy%_F9NRp+1V=PAx0|8Bm{6F=@=2IL(y>9b)uv(=o-}wbK`o@Qn-$o&A$4NxF59KF zJjzc$k0KwKqsv$#A}Jar8(Y6X2L5{2#BY{E{C~Lsi0->5`-3?L(F=9VXFTl74UGoM z&LSr@^I_fyG}!}_E-O?f1EiX9AjrvnZ#@|~I+sQD_MfpXRT-O2{YMO}+(zr{@dZUl z&WX%@x=wJtZLtpSMaLq{83m=rz==?6OkiVkaqhH}bcgX_`|MdL zCAc;hl0_Z7zrmDcTHqKm=j5Y8gw{mxC91wjxwuhBJB`w=?~!@^OO=IV+}P*@cL`@) zxN|J0bx#@@qj+xXoq!B*2YJ@yBc=Ikn_%uk8XLG{)Ay+Pp{L%k+lT1Fb6D`Qn9cVn zYdu9nu=#(>Kj{q6bF+D6=kOY<-+k`?zHV`8?Drq-OZ08;y%*!XHE*DG1E{kTREbrU z0I5<39QB$lI&PWJj{U+v#Gr&;M}vo9Mfe`Ntyx`fo*->4G7akEnU%zcrmstKTeg(0 z%!{oc!q+)b9h1OCb7`{}jLc07v%Z9~0`{{(?a4C0T~d}vL=f;j_?#L4i>h@9WgtiV zpk!Ix&Y?{;TRhrYtBAgGeMp*(7oP?XLQhuT1DjVJeNWoJ{gw4!K6g8J#_H5sI9+~B z=fCUx;M}5vBO^iO2{4O+WiM&x0NAPEq_cQM)vHT}DIuDBl!PC&aW|ID%@?-VkTMsJ zB-KECjG!e1mgqfsNJ*rNxN^kFJWx^knV|KcQQ@@G*E}L)!=F-4W}U0uWl9*vGgG~; z@wts=q(j4&%!`_58@pFR3Vlbx>)c zm{ifxf3>m(4k}VCv8Xe;h|pq8^qYKZUW$Je$99DAC&jv2Ate-KFCB6*{Hzdkdx8pO zjw@PdVgV(6V~5{7oG9iZKvk9tf}F{Ev z5stL~M~R;i(WZWA!yOR(H#<=@*H`3-NU3wA$_zQ)=qNbFez8ef|EMaEAr;x(gFTgvx-#%jNzs72)dXsaM!srTL?wlJEC*kSC zu(3#xEIwl;Mjnq^wx2Vh%&y9tWvh)Y@h*oBdCm9BUVoB;vRogBi})=H)@+JpT+R=7 zYHxa&CWgu+NMP}jW56BdelH0BJeq~Xvy7*l#dG}lMR0bAUv5R^e)h2KC;X@*8B zICTR;3k>LTNdbF?KU7~O;6#S&KtHXMg;^;hKt}#9VGJniz$Cdq|8%iJ%Hraf)8wk@ zFyXRj0&R@icgJZcgL~kw41g2M#6=RV0s{e4$2mN?r-D!x)d}g>Ywtt2c*YHuif9Hc zg|d;9ol&Op3_P`slby;x>lnNp*Mmr&P?BeDd4zpwX(?q(akP6#2y&ae%|H zqtgQX>mz<6uO68LDK4}`8Q@20FbkGzBOv%dY0%E>3nOAKbyWscK2bI}{G3K1nGcu$ zkXzd4K-#z8j!B_Wc9B1Mn!J_+W-I-U9Bhyy=i=?!wV+#U;*3d*HJbU{0K7GH4?Nf~ zXW%xcN)#cDZAnC>NoeKi6`x(IvX?1Eo7L%+l*i2cxs?G!h-s>eDg= zm2rOJ9_FFzI*n?E{(smytDrcdwp$Ml36KmBTnB1aOftbNw?Rx3K^@^=Hh!}lQ^)k+L`e+k^3Z(U9f+U-Z;khhI2*zA!m!lF! z1d?~A9Z+o-dPY7knTbc-{k73|8GG2g)SRYj=x_P)g*k&@BbuLk%&j19smfGnCI3Rf|FrR8^DX4qQ~s6_;e}uw z{g1Wk&8X`QmkcME8ll!jJkD7jXbHf8BY2&q|2Ba<&$8#|-6ez+pDcy+4Bv~9o8c@}+;0w|`U^_fS{E{__?9V8HdOBT{_5B8voR zvBL(CYg5{@VGme>uaFe`2s8^-`IQaB%F=^}*#Y-$UA$I$vktAVLu=-{=)jMVMu~0S zi&g*pS&vC_F~~Gtp2Q7s!W?7`FVTUEXTXuWkQS0^#-l(x>5Kpjaxayk@LSc769i1b z)`ViI%8s0f!Zx_))$1hIN=JNFSag)hPAiT0&du&8m_;l?8qCw-XQqtBG^qXPb;won zei7No&IQ{7`A-%A3+7wlsSChD#0pM@4CUlaUPmR_&34Y}N$w3GDGQk{XuNQ(9 z#>5_W&qx1$w2qXX^oRhh(*H~B%@&;9d8 z3)^*rVQwmFtGr)(!gt;9pPxhEKfto48Hd-<>9Y8N)?-nA505D#r9R3T&5P$+d;qlA zzgEO;0A|QPUvr4f%8hUjiwLMbdKg}{0Ayz(zY7|M^`GgGEzfCTR;WDBd9WAv4{j(@ z*={etZ%-wEP@Q8+a5l}Qh7`b-=)!-7k5X^krqIcImc1xwOk#||?^i-gN{-nw<4>Hb zn=BM*lpa%1`QxLGX#uo^WT1m@reU!sU>ntR4L09P-+&rFCEYCe%i!o?2j;d0#xJ+u z@y5YLIfaL4@7M0YyVwg?=g;tRKT<kGU^go5L{_>~qqF8O z1?)b_N%Lz9=NNo4{9|^5e89Y5ik(9_BZz^+BAgPxDUq_1d+VSiWAxLplCXMqlUtOn zTsrC?Ne>I*Y3Ioyyr!Jyn=^-~$g-teXCD2Ma^tsIXQ`fa5n7|M@W$ea$R5-~slKHB zB%6M30YQt!dBj=%8ju%-I$+8wK{*-OurwM$w0Fpc$)*)b)7iw6Mqma>oMe}*zSMoZ zf+Ct|nFWI^=(6f#5hlD>q)C#sW7hGQ2ZCuG6f*)JiwNni()SHE4a?gH%ly?TP7G+b zs^ZZ<)7Wm@vC@g}Pu`b+Ao050_BTD3J`p)d6CAUodTV0bBU1V_rDZqAn|2a#jbxTh z(EAtZj|u64YPZSGVLOCzJTvvGZA&5?5!J3y#;jFs4(N35MM$}hk@7d#uX^kwLlY1; z5faFE>Ql^a>F``V>3#DE-NdIHM)L$YS%)ZGVn{z6k+F!@$f#8)p+38MDNCl{vxGyj ziOQj_%j@#djv*X9A-~ELuQdr|@xnrXDWX`t5Voe*P6;e**tpht8K8s`smSrxD`pd% zujev)`KLRu?zc+qhMigx^y`;22F{F6rj!Hcf`=@h1238~tt?G-CHTh1K2#%B+wgR{ z%sjJm&NXEx{UIT}jXSX))k;yq2#aFu18(jxrX0$QIxp&fG_F89#={iiOH~|+%G#J@ ze3Wr4=M&^+v?Q?X+;e6>m9+l(>@Bk`i1R)l$U6ReL0K+YG^c73LmL;oKmM6V@KE&8 zcMTC898Y$+>-0BH&+^Tt9{fQ%|Cg6QtSStj(DsB9p;c=%jJ1}6MyKH0NW*Qd_>xBX-^Dz5>LAm6zDR6i2 zje$H?f&gmZVcP6@k4AlWyWG0#*^0Dwt-JQ)ZH|B;a0VyfxAyWz=P`5L|8FV!Z6Tn- zTESb`UUD@qf?INt#g^BBC6Y5;#ZB?^3W#44=oT>4h!Z8KhC8R%jFM5@RWFDM6C7IG zkDCbpj{fil>s(RMxeHQ0;U*@WE0lbA-(7=nf~RXsSC$8OAQ-(LTUaIMq!JH(RuV{t?{xpB0C+JsycCfp!`1T1;G5$%Co8@@=>y@COY(P-K73aDLZ8Lc3P32h_uf0uez=^ZnP{g%jO4F=z5KfB3(ARMWcyd_@c(C>xBc;(uK7{8d6!x=lI#gFM;Tx-H@KexYmd9xq zesql#d432o31($USL5l_qO{lw-Dfip61H)}9}dSn2J-d>Dm0i3lJFpR!i6A+o^12i86+KF!~jt zgc$Bow;!yN*KJ9P4rl%_Rs-n?iTyVHfnx``S?<%~{&Gxo7_owpmqdM6P-RYID3Tuy z%cu2a2mK-WPr4ft3gS>n9PFWM`c8TE8@>K~N7Sr@;?J7-%rqarN&Oz?ll9y`AxiGx zj1HOWPu4}n zz!%=R5Q1Qo?$0KWdfe~AzJ;1btnv~7AHI79> z@F-DJgMJAMdw-dF-X~Lf#kH8}El0#P&5PXg=u)zcHL>t~ytIVO>gMy<{Xf1u^elHs;@+Ys(B?!7d$W!<(wtq z(>`2@Z(iQ(G4k>)JhMt{$Q>>;GUK?nDsG`Z_{eBqEYOt5Ga|5mQM1k_31)7}P~5TE z+7oGf_^8W!+}W2K?wa^R%x1)n0qU$?B6%tgBRvCaviT;-S(JPtdblSwtooZQD#8lq zXZqj(?CkF*Cdg3^mXgX z_-NNI<}Y6=sfjBa6HkH@P8=|wuxfIYMJ0i#kDmpP+ZSXit4V9JbU^<{18h*B-)N?! z$poiHdTgkzWuho(f`x)KTjY;UN+dplnlj@_d(BEedfjC)XaC%fC*}<==s9RW9LS_( zLxh9A(T}_9E*}hM&7g(-=cj3vbbh=4Who(!-cG2&E9KJLOkA(|w&nEM%=Q2Hhy+Y9 z)he9(Xg>-9#DV-QGF?ow{_7QNgrasr-KsfqO5d8e=4sz`#KN<#zP2Z4!;HU^puIEV z`qL}rmPGzRtODf!6J`}_fZ|SS^{LV3BXY>JUpD&t(8=?AgHW~$b_4uo>x;o>kK?yc z$J+>dBbX#8Y2#vhsQyioo+~AI^0Hnc)W0JaN>6N^p2RfiO=skzZ~vXUyuhdlqTuk zNp!co%kL`feF0O=F7Xqu0*ec^E>!Tw3uC=E&Pa5gvDC2NkxMca#fj2`Y+QN*HKN9Q zL}6c=%x`HTD9a+0{wG#;D88jK(E{P1RUm2PE$qxELlR>J;3ZlSSnb;2mI6Xl(*@^F zu>b;$-aQ4@cwr;Kj>Mu5Fb~Ap?dxn{78n&e$0>clF5HL{!*u4CP_JDeE5s2JBp!7(D-ODBFR4`C>{y8`82`+`QR@Ln#&DNP&=g9 z;a5vSW4hHfcQd|Ti*y2wFg0O!9}ESM zigu{H@U;igw;fz4r`OcD4NN6rDcRDt`LGGsG~CIFP(IR1!vS+ambD#I0uHl4CTRdO)~pkzHn)9gcU~H@*$B z`&@|MDDhjr@nf^^6GM6dJHPdeWOv{tQL9@#qgH)@2^Z@X>KOZ>9+b!7*D>SQj0J3Z z_1o|ZZuyCtn{dXS@N z_VLHDVTZ=lK)ZyEdPhc04?OAE6Z9kjjK_h8eZlnIICe=*G!p?^ZxvZrI&rE6^~tf$ z091Cwdm9UJM|5oyx1_1KVBYQ(td251rETR@sFW4~*w4dW*o+(3j=s!2o}d0v{Abyg zo#Mn0gKa)Is=@Qned&Memv3u5xA#ce|It^DOK$xQh{DVq6&#&hIvd-@tu2fi}A=Rg(m#D@KPNwub` zeCdaLh+Xrk)K>`>1|i!K1Iw9j5vM%RCFFIuPc;M#&z^B+`X0E0Nl*!ZIh%39&;O^HqN z?13)C1%XV(i@p7pph+i-h?=%7)76RybQ#MU#}YX6z z82}9RqPF^lNqns;uQi!R3)QwSa{&xzK9z!8OSJ;}1-ts-4KEegeQIMU9 z$4)rLB`iGLceFE&8hue>M$nH1{ou{<0IrOm?@D8%pG(la*f^y@OY~b5&Z+HcVsU0$-$1^wVfoITc0keRQ$bs96AQg~Dc~9Gx@n+Y zNn|!;lepCE zs1=Y}^P5>xIuFQn4*(ygHBJ8eVlP*7cEa-OGgxjVOhawD`Cy)MK*mqwaHd|bqos4i z#UVP0d9S*zplrWDhR!B_K@c8>m(VDNBA8dW^ zq7%%5Az*K5#%MQ-xKo@AmmNuA%=Od|S&y^9gW1v$;{NKF^22eUh({2jA;J8Fk*@7|b(SvvLi3b@#FQ^cny8e7X&d z!lB+}mpc=*JY@KTT?1`uxSQ``J^hyp5zC^^^Ar}b_{Ww(#B7U3yV+liZKFl_;-)Mi zahKb?M1M-bEbVLr^eNNyrncC!`*EXt-o`(1S;3`+WsIi&A7UA*oxwvre4^D~!p>k0 zKB{z=EB=&{@PsCC2>Ijt&xdDJ!R8*n@km z5;KJS%m^V1M*4jkPS~@GLdO4Psq*{{Ivk2Ml3WEkkM5-Krpp)29bMxBFhjS`rV8PT zDV<8af&C6%ia8~%Ra>|-dK|ZhI!R_&hRgnz*$}K(*zqz0Et|D5-H*MMuY~!Pwo`=P zM}p!SoKcn-Z-LN~1E(RgsF4G^R9oP$Opoz0d)QlkI--{AXkZ)pwV0PCI(GwWQw1F# z0r(B4BTu{gzlSGp>usBq0M`^l1j>(zeThAt?Kn(`q(W*i$By4SzP0;-`bDg$vs^++ zVGPK5)yV_qG2DixA+U&UzoJO0F59@fXtenW5k&f0qu5@>NCa31@W1>TcAg+rt_wi-#wIRBj zH<Ne3>% zN#T!@We>R=e#GrTR^23Y9mkzH@Vh#R$|Q>La~}HIFb@T%pS|jt$w?diQFb#v5ltc^ zi=n)f>jHyQ+9D-@_oAgC<}!FSushfdO7f@KyETaPwcQ)8u#k7-sZ;#ecD0Psu!d-r zwU1cnn|##2W(N`QMZxG}S1m9yNMu=8-ik2}u;;h~sIdF60S_U2wctrK z~yq2h?9RWRR`9G%#!m4kGdo-PTXc3ltwy3>uuT9k~cJ&L>56` zgrYe-aPI4~FbA>=GFLyfl`yb`U$lu-B4b26W=Vn%U*x(G-wFl1$}yX0QpP75>P+HJ zM94(-`+d7)C?{;(5Pk-d(8L=)RqB(oSk_=oBz$EVHL5p~U<_aAsw=!?8zY1B4_WvZ|NShC~Gyzu>a)+K&`g&d;Elw7aov2%chX|d(~8&kgQi8K3sM# zZ337BGK!8aL{Oa3K#5W}$#W7OEBM&rDas`^0l$ttrkC_b`;=KsB+}Jw7G?THdkgj_ z&$Rs^iEdhbm~k`XVVvt=I7kHw%iovVH07?r?x%u);ki0zIp;7&96J(W%KhE-Qqx ze2Y5LFvk)<8Y+5XZ3la(J`8Ek(+nxqq&ni39MQrQ1v^WveUs2W?th^<&{j+u!VoNK zf5Ja?_*GcbRU??jVV$>7zJQlEOIL&qQp(Ncdlv)UCk>?e7LQ{tKwRRVoC9B!XNGYf zBi~0+e2{Ob88ymLXq2ljW?DZXx`aHgF)NszZhss4b?1@Z0;jKvq6zkzeaBmb;rv$^ zDe5c-u$u6d1DtR16ic1lD|q_FbA{a%eugfHn5Hhm^Up)Ey`Gk6GEPMq`)+s%T|-1T z*72L(_STG;r~QaUVXOuT(baMnRdtXHwjfE&meKL87{n#T7(v}HV2(8=!&KeWT=$CN zzP8PreU=G5u-Yhf`hm#q^qtDWbWqUPpz#3TYXMG-!0_w`Vw;MH$G(?pXpJ3dGSG&?GvZpGj3?_@qNPH-#A@L=W_dvxpK{-5!JDJBJf0){yBfvrET6Jd zFmXXmjAt%!drK4N@kIQLNcVvZ?m&2Y+5?5B^@G(YW4y7pzWk#ruEtXHm4=NeVK&(| ztF8c~HvkT2mK$PXS3A?>{d}RDZh}w4YU!TU;a&YSQLj1wNEUM%fP}OoCEIc3-3NXAXFA9AmmF z!>A)F)2!s>{@RVhRQt^Ffc@Zze&%EZr_#$pzKrsO7e4xndeTXrIa_d@(q`v^LztB* zaj*50NdB~z_9EGTk>9O)&W7(a{tye@{^@Q?yY5oTrbWoW8W>+^b zb9+Nu+_TKydY@n;^`brBQ6yXw^SU4F+l?KU2UV8KTNB+9qQfM3M7RGq}V(^B07SSG&w^j{9u z!1tCCMqD4p{j}!{AYzY@To=KrMsnjIrzPgL(oG<}sgufI7SCB{9ZYJ!>oH0_e2(6F z$0s7=)zmnRNqA|!M)h})~m?=;8|2@iiSwnTL3m>UB0kU_0m`JJ#<-k{bC-zq861o;$)iSrK z8i%#B#(K@H_TF7;*+3zaRcM!?-dRT4o_${J8_0{&?-SD-apJahN9+0!^o#ESIqbrTNlrAW0< zhss{&p2xN1#HIBs?si+!HgM9vHwfEKg_CMHYKj{S{(Qt(8g>S@#C2evnJu`tAxu>B zY`F;us`z4TP3~L*GPh3t!amZ{+W|9cGPCBtBkF(`nuDOQz-F#3QnbdMC`nzNMHuZ* zYH8faLJ~J6$w=^phjYh^0z9SFm1LD$ogF1de~G8?AXBL5Sa!E2GseB2v}w~ST?){uQ6qgR@TJbLCk;ic;t^@f))8K@jfG9tH}D_>^GXs^BsZLJ z3DDgVM3*ghy0jgxR{0EElY;kK4})*QC;jJ%o@ujq@;T?!xDhY@{y^tb&@Z`KNgc>L z7n}TItfhaj^cCrSgwAb6DPz>)IKTCvSon0_iLK5|A=J)JH{{ltgxuUpHNE}Q+@3d#S&Ob? z4kBz|6e0+n@u1T|eV6`D>2Hibu=jO6rFbZ;!`8N(DLillJxQ zLi$nM^M##9$NRSJo71!>um8`6O{4Iw-Z)K>iKufYF5KB5>=ao;{rf-!N3>votgofv z^I-)ksWuY13rg3gN;1J*x$4lEvw=PI&P+dHyemZiG46IOe{VwJz8Lt{PT^_*0g&q= zT_4^J!|K?3nCLaAZqPdscI}TYp{Z$p2KjZL+vc=!Mf6AERqfI9DTZN^F&tsix2r%d?=ot|BjGNhj#bh+H zjt#gnisp~Qb;}b*kopR%qvSE_u&$uRom-Qpya9%1(kwy|Ju}_1hwUT1(>VP+K7`zP z4VEjeTHSG_aB)M>9`QUj|m!m>=+v7a6Jp8=%DsL+|iY1QYkg8MWb19+j}g z9sN{MI_5ApT_ShDf^!Epzj$()=>Uc#ZJYqi6+;ReVKuJNxEWHou=%9{;lUKv&QB<8 z7J6|GWt03;P@`uC>HS91K_Y4G3*rYKR%3WQV6=Bw2pWmZHjjTCD2XbSwzo3A4p+q_VuGy9nE|Tw*jU}fM=@3D<^YfNV_Jkt`-&MXhXk1Laj4()q4u~G zFJfGm61!h1;xOsWZv6N|k+ZyLLEu&@QjVi4x(>9Ce|+25u-k-S zN(yD9!Y?@MQ_*B75==!96_|?*X5TRHYpy^xlACF^+1ot^slgi~r3f3XLt7o_=;QaO z{Z8?~XmdfjNx-^KySv{+B~0a7sf;7bT*jPBb_){`f#E#I*9*1hFAzHUKaNngly2%i zYh4jSEr;p@p==!KC?>@qL&mTP`m5bkj;Z{^T|SWQuy2|2ftwFrQanPFy*&1)hC#EHW{zuEvl<%(7%My^x_!7x6L_7>R*wDO;IhN`h zrUa}egd{829$47a7goAGxjLHU_+Ovbb$0F3qt|nd*@(okwZlf!JEH!)5PCI zX+KcMH|{p-HbAfqH65A4{2xqgu1^o1w%9Z`v#&`WMWRB8K0i7pJD#o7)X~NEuJeP4 ztaMIS>LKWTjmyn-CR#c-zk92%!e&n=v(g_I{^VGtDB2oRUeJUYZzXAfN4G`t9!kPg zd(+3aD@lIb?Y9hBEEN`ftr;&nBKGV65%f>aI;hj`y5)-fac17S?;*stx(nwK`YfNmNbA!pnRPod} zExI=kxr6|pbu1rv*6J?PX&q}EmN{akg5QF!Dq_)$(nDBlbl>E1;jkCU=FD09_YKns z*>k3pUBA)gMFnMtkg@K&#nW(UQ}(fYpM^fLN`C?#l_P>>m8Bg!K>BIN z?(Xi}$eKq_<=uAT;xbb03k7=cquuiz>WM`n2A7A&`>g#N#JhX2-L7b=z(IvNu9f?K z;6AdF-B~w}@-|coCQro?_I#3@7{-Kt%K5$IdUqnlWuDVpo~#f%)8kp&ubps!led4c zECkyd?<%wow(bgXXfnXyYY7ex%H%sN>m+PztuRJ_)T{pYc-~xu01AzRes%%4l51!J z4KfaEJ)W{O4lW4t!I3axZdWgwr zJ0qIwtzwnnj~zkSuj_m&uT0s47hx0V(%DbrKZS0CPXXEkP(L(Lws)vXSTZ6sB2;E$ zpj`Qk3^JzbTZuVFT~ufTXeU0N3~5Bsxiq$2fh2!pdl6fSV-Ca~g=>LeG6*y<_PugP z(bx+Qci7@7vp&6pAw9TZK+`_83($x4x&f-6KZl6C%MYB#p$kAER$Rq@OZtj|NE;%g zHVfH)XhFOS^mNE46d#XwKFO{sP@wZ(jp1eE!@v}Y+KE+L`a4Upw`t7C$vqlOw{0Uc zYdC5R2bs|Aw5VglkDl_gAMrcaf>zjGCY2k_wvDrH9HjHBQm&Taiv~v()6Tu)=`Ib+CdPa4Iyft)ez$KFMh`8Y+%r<;eG8mPbuiJhyBac@GK$I~eX^ zpJyBYyp0fw2!=?GHo9|@CuN?%Q}7+8_N7lA*v7$#?;RKxX&3jGSiCyRnDlJXMLm)e z0TkrKCTE(Ezmm>vy#3e9aD1PV&UtI)&dY^1<8i5qBnx@Qn;vY1_lf~=nXxO|LUhmo z#L8@j$5q;qPVI|tL3?G?_a#&c%R_2>Md3m%*3Dnyc@r79vnU@DqOWJvOB+gT1%M;X z#?UV%f7Xsd(k%3&&;TlVu@Rev*D-m4H+032k?8MlT@H`d_5-88Gi6zr~b51K3l?boaJwIa~<2z27Gcr@Jovmrg)(TCr$>CCIcg$LnqmC0a1!^$b2W|@(4j`X2aMZg7pL3BZf0EE$i(jr(BuIWBM>w=%ffPI1mg~UAP%|20h{9O)Sz(UQ0WOq!k@`UOfi|51LpNgr`i`>&ONCuXyzoGP#K;$YcTr{WKc#khhXhq4XRXmb&4lOM--(<(iFO#~Ogfl) z!$my%wh@%yxuP#c=>&gW0C%Nna_ReBBpwzgPMLulM9rG2r}Dgorr6$m73lBtCAM@J zuDY3SB_sdu-dx!7B&&JuW`g}oHt-ix7#CsYLGHf6ft=DThJsSEx!>w8Lo`CwT7O{Hh=AAV`Ud}GkZN^;Up_x<6c`Fnr_<_+ss9*l$l#NJ zjl?oT0RQ*W456!9yJDu!x+^=9KeUg;m+&9R^Q~mZ@v!QXL~q&2v}4U1;B4b9B-wBc zY3@(Zz3@MOt-58bOg0ry+QYFteoY-7EOJrEu=Jt8v{Mk11ayg_4dWbE&eL1&H_`e;Bok;H zexfK3830S2MdyI$ekqp1Jh5LApN=@eP5Gvkb#>^W8Q41a;k@AZ2~7FD#yZ0*j5V4~ ze^N#((U|kxHgYsFaPaxXKZ>Hlq>H9E`rhi1ONVavH{7uKnjYILZ0Ns@V*5G5q(O(a~5ydDayf937U*UHA3ccih(^- zgdmeV!Jwqccj~rXA1k?e#xzIa2JxdciH^NH>?vB|DSIQ$}olyZ$B(ghBh2}eU4N2RBF7-TQiWULvj6U>I0FT5sliI(WnMQ zkS2%7D4{VIV5fwE>53#dmMOfZTaCH`o!DnQc=ZFNSrqX+EOD}jf;x6`c9e8ToE~?K zDE=Ueel%mt0S#;2VZ?flZ!)nxzdb7w>Po~7k$g;1{L{4BmB-YQ zqgY%qlTn<@K$xDM{`PE=50|F6321MGeA)PPqBf>tA``n*7$lz*4G3ARfbaB|@qI@^ zGWXNtr)76b`}C|L!7qpP#==|d#)O>F9aL(MGEQmD2DU|LlDEI3_{zsoRI(4Va>7vL zajF5~PC)~13mS*?=Z)5?e5TLY5z4y6BWk~oVkl0T#KUzz7E!1l5U_a2!`r)*_;BR) z#&bb}lUEvwYxC{KDE<3hm}zUcl@QfVA446=a(zRG;{==dl-M}w$UoB1HuOEoN14Ac z4NAv`8^P^L^Ilsr|EZVX-x8$4sCB}ZUGjr$ZTNe-KhZ=!i4UI> z)=Z~wB+TAV+&Mp!fV8oXaUYYu69G^v5xsmB-}k+2>(Jkf_FM}%0|qu2efk(JYp%2& zI!wxb0w2TX+{zENu2HPz%32-|H=L;Dc2NUPoYJ`PT*hiAk$*T{j-9p~A)kt;Hns4; z9W@Hp^M8XPHqCaz6vj&u7W0V9HSvUKaUhK{ukiqmMskLpe=oHxYh$#iajFTs+HX2X zOGLlLojbSHM}B`J8s3R(()@6sVp(eb1yzdsNy{ zwQ4*2(JcKvw~!iA$aB)`;{dh;8x`%X(u-b?UiT@C9U*4^{9BO3x&*3CsG9#s(cLrW zZu-pvz$vGeO1oT{UbF5mM<_0HTB28u1Ny~MdDvcNEZnL_RZy6ql(czZ&~5iuL;9Zo z_BQ<%j;8+Ou;flbK3vqo{*)B!-DN%Jq@kbU0Jx1N5wB&xlp^Qo`EXc|xOzngzF%D=94wrjm(Z%sOX-xSIJfXL1x zeZ4MMLfck~ei!iWWcPX}jdH zy(=kq@&X0?gVne_?C0CRKHqNE`99XIxxB6w`JOsG1-qF4_oaWDFkfMO&Nj^%k?4|> zXnYw)9$}%Eb=U)uX_6@w&UP{Nqqeu86^RRcxc*x&hZN825XA1-xMspqnhoOhtktM$?&b-(`mnG>Kj5lR+H`Q$#Mf6u;X$};6GKj|2hEf zw-ei%dnOs8Zp z+q`!<1-pLuUB#^P7AxhnU0ntY*e;IZ?uEt#VMy+0i|;%m@;x6l2z)0Vxl89m>z z12MsKn)V38#byp8gX-Ov*|lr#~w{X%6CYNbh}B9;g8QyHZH zgaK3GoGNLrnMj!T0a@f{&Q$0~mA8$sf#8J4%}?S*cq$%cb;sdWu`Xo|ag%tQWhL1Q z<>o-4?vGYjVxb0?jN~Qk{Z;T7pFT!R&w-YlYmrq5x^OAHKX3gqhZFJ^qjP{#=Y^Y- z4+!awayP+vVZ5gsBXSf=>)e>gpX$Jlv5k9u#uf6~8?G)4KU;qxjY3b%Z@iQ=VMEfR z`uJuB_6OxvOi4OqMfqpiZ0Sg(!aOF4lqJ@@UpQhcK%4%YrxK(!PYmPbXW${sji<3D znI07<`E_l!42)7J7{v^a0;fS`E(HpDECd`D!mWURb4vf_y(9Lm%cu+7{+M$Fcf$08 zr){2}6NA*>X%Vp!5~inOj^XiJo4`f-@?PkQtfx2z;hxd|^viEnP1u_$p>ZEXh@j)Nipi%Nh!w<&|t&(SX zmvFPNx=nFIt2EkcQ2YKH^gytHAgPQSlj+$Y=LdWeE;{*doS|fLB7K=i_HyrEmQvsq zKhOTFEW0JSC>L1j%Zh?S`<*dOg(%W9y9@6A*ZuAQxG}plv!qW&E1LZvs=cp_-f0q6 zQ*L)-pO7}LkH&DAOqvcWCcIH6LRpzkjO{y<;de7T&(AqS6~8JL0dm$ z%0i#9otOM2K8>w4Hin#jzE}A9gDGEG?2cvSMEC5Z+ZSZL5=Ew3PIGX{!yZ`LqUxBZa8YkiqEcn;Z8?U73YSUZOeMUB!UTlnB_DACQFWb zlv2~VUj0N58DqA120UmW13o)XvfJshebG}hL`-fj@8{-~@Kee&`H*7RoeBly#ZSlw z=K=J(RZH>Bx#9_*PER|1Lf3N!1BdJ|MRw4k{sczARoPOPM0s`SyEe z)$DWO6wJqLK-Uc~J-&)CXlna->lAZolBRDnKFwc%&p>nz$=8;=UUzO(_Fd!zr*Fs)%Vu*KWzgeu2Vv15lbXb9VGv$ zhdUpnD_{RtTyy@fi{QLT|FK5DYv@Z`_*+ShZzn|HQS)ix4Th%f?FINxzs+5&z&$4K z?Xu%P%F2E1q;zY9H-?M$WOcs3Cu0=BsNZ*ex zbZyCzoaG{m>bebi^;xUE*X~6}jAprbrP2BQzmqmsI&s|7ck_c!k1SjW2KDT<^U*GQ zHO((jy^HvHe^YuVdKerphwHobgBNt-279E7#bS+9U)ar^_VcOTzXP8{R8^ZF4vO8L zujkIMrsUfUZTT;g#?}`g89n*@*EC)mzRyIAgtzruNEQ+RARd}je-9ugZUa7p<(-0R zSA(C0v!^8tcSRczn2E;#XAmnEXMs)bYzBa!j1PkYQH|c|x0dIb*1Qn7t0)tSQB?Zo zKQ_4uS%ZL@OFA$zzNal&b(wgEqJQh5k>9Jol4B%B_zOZvNwIFDnD-?TEMfm8;()tSgW6JO8QG1)~5GmlksbMF{5YY$;&1B zoUabuNOc~;3VC6<(isbPj7LihBK26o*yj-Ol^8&SC^P2wY;4?uDbM$i_NZ`f~}B8vSsTA{!nIsgqo zWo(*l;aqm+V9GH9>wSYfv0@ zjS)$OycJubaJsI6n~ReE5=4T_>JfEY$8z8q)ctKy3o5XDxG>p8!j$bbuSJL#HRTGXbQGT@ZW@CX?(eHsiKGTQ)Qc z)p_5s;Copxv8TTmbK$i}uf^Z>NVOa2c^8h{tB3TR5G9r( zG0N2y*P=ekozCeLqCg=z;(M8zA4JUI#BUbv>VMT`D}x6L=bq^O_v z09Pmu&iA6coxHJ$vSgu5qhhmG%Si_@kGL=M$QDFhP@SeVaUnL!vN&@?_bF!YhD}W1zmvf2Vt{Jx3~W37TKE4Ld#j*0zPMX^kR(8GcNsjv z2OXTC!QCaeySoR60fG*0!3h#vf;$9v4}-hw$NyBFbKW{vUsYdpb>H>H-n-XYzx6D4 zR{uXg7xq3kozI%S8|wk{sn6}5ugen~!Y^m>1D&rss;^|iPlo>F>+bh(ttOm*I1=95 z%-~=L^X)gw6zGtNZ~jYoe?3*%j|RsB4|)`9iqc($XjHhSWGBI;1p%n@U%tJQ^skPe) z6($Xgj=j7g>mxAS^E^}OIdA?$zjj&v-*$Oe-5EEM${KJC4CH#jczll58j!#Gm#^RT z_^y6>e)3luPlMuFD7&n&;hW7jhuAQ|=yR5NlvGBra#&VI*oeGdq)vF z%tHBlo$;AxQ_~eS1ld$ETx=1z-yD5TwfHL4@VgGcw=c zwOfXCAW&wBoq5<67CIJl{xvY1G$2sspG8DYw3N90fc4{Nw=h8|0DUoVcoLS?(D(_f z!vC*<_s3jmUxQg#ps8Qhm`m#kS59KWNPPn~29T4!%BG7wrBydpAo9u)Yv_0ExcPeJ z?ynHJFVx_LUHa*CXMBm6r~31W2>aiA+7j-fAxI0D>4<{}P`Ub`i-l*hFL*tX;J73s zPn>8(^_=N2umj!RAND=h)7-VmXr_KWzQw-k<9RHC?Gu!_wUP6S#iQwT@0@po+r&W$U zs3gclbZz%*wJ{)x@JkbN4aWvhY-eWavtkhLP!bg6FZtF2Z{y~&CM_ACuv}jfjP&W0 zM`Ts{krKg=w8H7*aD6~@X~@1FH)p|;R!-72BZ0@-a-?{#pNmhl-@oQBtr0iKh?oKF zFj@w%ymQi}=7cj6@Jk|aKGhx3gWe|c@*aVO)i+L;5N#RBi@(t~%eQm6dE0rC0|*7q zgmlS%*AZPpF4M8@C+H^qXHZ1sHRRWqf{vpuRjU^{QZs>otMHU2ch)`=H2tp~dv+6b z+qn{SJ~%AHDm4$c>{ph^7MTDqJeot(14%SFcq z3xtfxGi45}UGx2H?E|u>7Cq{x#?AQKXbQjjp~vaeNpHd(saNhmBBc83vYPnLAYZW zq)aNh3AJ3J@oSGkLt#qE8g^sWw9E&V)AF2v)p^&SLo>=a^S6wrGe7hLleW@+0(5To zrZb3FZF*T1h?CCna-t(6vr2OFY_IJVRM39o1IvY;b?TXeF^%G+kdd@h}sT5H08)Z zoiW_kdB={^3heI>H0De4R0S15^WKdS7M#B#&QDBv4jJcNH>_NWfkw&px4$k0qW5tS z&&M92ijIS##R#{F{0yf_t%r#LMaOT8WUs2CAl|G0TLANHE1I>x^Yx(m1%={%Q0i=7 zF@TuoP3by()T}mWKYTQ_r@lu9{6_@1c|;ugZ#VHBY4jb@e0pjmrdZB|bUMtfS-l4G zP`u`mE&ZQszO_$XHHbFGoDF6Epryk9%f3@cox{n1TnGu$nGM^jL2SJebrf?xFxK;2 z7T=)@kw)eP?bTPFt6vronfW@kk?ws|6MH)tVAbF99-N|)^yPO-=o5km+C$goZX6hNgXBVKnHeFM z=!zvVDqBDGmc@-I>6cvb20hk&bVQ>hB|bv-Kev0ohqcmxgxhCt^@~+-aqhhm{2x=p zP`Y3@RKSgkcP|d=>|NE^^gb9azL$2g%_eyISFG)JHfMqrugunA&0pGdZ24Se9>R=k zl;cx!W-h*ot1E6Li}`c|Z4|VQY2TZ77xj1i3~a*mcQey{$F{$7vOT6As-j=2?kfDBGeOys!0?y_;NG~O zvWzq31nbFmhpS;LjoAWHX5BdP?W%tk963%d)J1%3U*Kb{fn8wnT53@P@hZyacF>qX?vKdw?vns=|=0sL562~K1u=pA_~?NJSEZ zs5=StEicYm_la61{^oMCcS;q{^@-K&*p^0d78Zj#d(oQ5r6XiWxV_`^1V#Ox)9=D> zw`{G!HQz`AoUsc=3~4mk7D$q&I%OLwrBNy+Md+vEt@kU-A zd?k0$;%3d_9^$hiCnji=7Nt4tZK)dZwzABaOHSW`I~vE!zzx^9==X*%?NZ9U{1A4((Y`*?cEbe(kX zD{B5?R5{PMTW{$ya?i7Tu`oi6syD?@KkZ$3HhwHB zi>wGFZ zi-p!F_WkIc{NukUCmvNUa?Q|d=@al=w`w??$LZr#m_cVH3CjozOgSB!Lx3mYvw65b zxr>i6KDToA;Q!-4xNq!lDRfDS;M)(p*q&IuCyV!1{sOwC|04H2$@J2Y0>5w#ZSQ3oq9YRd4G5je z>I)J-RT%!JpN#7&V?R8Gk?~Lq88mY{y@o{&kUMxD{R;OmwC5GF$NVMiIQjZE57y*$ zN%z)T9QvKy8|gp9Gr8wRP_^<7tA&ZNzF}XB!9cAK&%*^v1nIZEuFGmaWP*6s%_nDa z_>Eog`AQa!fQK^)>jd8E2^oQSZYnvVFX@oI?{!9m1oMeh;`_k)yQ_H#L2*;!75!W3 zVrME`IJR{AuOs|ZGDc;yUrAqlr@lY3*BE}+H)tO(1lsr|KD}#FtkAgGC)}rsuOO3f zPWoFw!wB$vwvpsdNRwuZ<#M&T5`YWj(=MM_8;L-J$JXd^uxIIXr;;k1q|Iech%nuv zO*gXMLkhNXq0>P}>`Kio(w}P-kHWcAF#h#|SC7dMJo!#v09zC3(>O;s;$QEI$X@7F zIh2c(YT;!Kt^?pc)1@c*g$=tEoakCjZMji|6*NbW7Mwvtzpe;~#%v7sjw@sjR#R8p zQapq12Y9p--Tl5I^Z{h)_3-`O09cHut&2#OOXD!Le?Zc&u`Y*`)GqCGBsyvjYhyDm z5H)t71;D&LOvSI6qBIJ{U**s!(@c?&>5?9ssa&;lDyypf1}x^O5r7Ya>jQ(UGf%XY zxfw#=(A1()vmjNe8=ynaCI6v_3^!}j?w=P9hEVWXTJ(8ze~@^=HP03p&CkhPTTkzMR}tgJL68?HTb2t z<3pBu#mR5LuYi34j;F=EB;V{f55Y)%a?rc0R3IzRpfNQ!=P;&-$AzJw0}nxneuhlL zRt`ErIi)9tDj-KDQcF#$;X9#wZ2kSPy;DkIMjRjaUGeF^ZGEZKlxL~p3cc@Ju5w9z z-ws=ee~&Fn-%uS zH(h7+JC>o031kt6H!<)TnXT0h)>#k}je`~eJ3GWS6+NMdS19R_pu&~}=TGhrxhgMZ zH^f7%Ip)g8*-?IdRq_fKRLV(u7~F~CI<*5g9Hl3FR4ML#jE$EvC&{LF^)(r@51Oxu z(cIy)Qy??9(TcrzB1NYBia9-71v=cHg5XGGr+rP1`|4|~lO01?EqjWtmV{0~>|z58 zlw4Z!%;o^syR{OF2z@ z+O`>csKA~}k!U*i#qc`2MeAHXdvwv5qPbn66I1yS#X9bNaJ10#0;L;W6JO-=+P?3; zOfku@_9#=|^k`}Me#v6#qf70gSjjUQSv+nJT&RvpdS;N7^isLku+DKy}{6LLfdYhT3B~ajjrSTKpQ?)Vks#F?T_n^@fCs+Ri|$L z%uZI*Uq_jvyj$Cg8NUN}7U%ka6$I-Ptt`sIL~E&i6U0vZNe%w-84|-*5tUya@z(43;atOX=%yE@^~vACEv=yxSyQSWcyz3wm{*e-xO#T#ZjK5LJq;1 zsKq_4_uKnI(JdwXpsd&Gjy7MV-}B$S@7u$u_4N)v5)7d`%DDJ=r+>qEPu;9f-Mf$f zAzR4T1Kv#Gb4a}J4%uz#@0`2HoUZ>MEt~)SfPAiQ3pTv}VR&EL@v5=?=zV)SiGKWl zE|Lz$)81fnMv_Zlp6XbQn^E|C&LKld%qiI)sdSQegqTnffa}K;7`WypNuTYd$1cE?)c#KudMM!0mTjS^4;mFf)K=eB->AD-UE_rFM2jl z%^o;EkEkqp0}SP>Ts=rkj5^o1-!!#{r6TW+az=&u)S5WWn#-St)P!^|w+%4I`|gk? z&lmk08Ff7}A5N^5&ZDzze?+|iJYFFO#+n(CC4go}l%3}%RqUT|g*L%H@58MD2%pNyT(yY>;?E8S0H7=Uh) zE-8@m|Rpi_C~$|2|1XCh_9Gm3gY zz6|XT&Wtis6DkfkZgt-$Gx>7k>UUpf| z=}g;e@KOET^NDVGSEVY~PjYh@;{}+aiWMN3z{sXjD&BNea+gCegN)SGhi8Qp15>Jq zv!gsw(Skw4#CI*Ky9}?Z*G2HziA%RAF{7<@=ttfsR0l9O>xx5voq7({UsHKj3Q61g zr~jZLF*cLtp+%}>La_F8{$|*_=A2JhU7+bH>Q;pB_*rYFm#Dv8;Z0mUB@ygl!5epy zPu=Mek3LCU@cYohe?%hi#~b<%%&yKv{-maT?4GZ&YiWMl6#JZR4W#8?rI3w9)$R>=7FSna<@mnu9wD>`GT8vw8yG?2Oz(0JAsbndvZfF95uiHwbqM zlC8Tck{gg+u4r&oFcP%KLWYH=xvVol+GP@LF(C|^99$rfIE9Iy^k7k?)N(FYq)x*o z;zkaPyz=x5bRUVs97}vRf)0snAuyKwAC}s>=<-JimQWjHWRsk_#|EnmLKD|>~F7dAzw6R%L|z7Gg#J!QMM!oUih3K z&J_H)&3;E|OE8ptC?f{*c3R&zf8ze#cZ_2XVaF@!kzHa?-T0gVw1a!~siar@9?g#D zF&D{y*t+lZt@ zSJW}~ifpUWXsqI7{b3JY3|TPRq*ac!^e|!Og8zX~^U1c^t;#R2b+28>9?fl7HDeYw zuT*`KLVxe@j+jsmFgsC4|AiRXGiR`$Alx&w={cYRjzn`iC@*7= z_SqT^-B}N_>2&mzdFJ_}l{TJEWQ?`APNGMJ60`%R82Lbm_g1+ABhdzeCZAWz?bt#t zJ^+Mne#PfCgufApiT~@7Pci#LZl~z{zq0@XZ?E5gC(moAn*;&p1Ws>&ucr-+7s{8* zfR~9(i`QL;7djTbroh{d+xEK~hgWysvk;0lSnI^g^YQQXyV&)vH-q==?Ip%(!0Y4r z9}NGqk?!g>YhQ=iwX#=-*-j7e%m4MP`Rl7aYy{c)?|D)wlqyp(AabV#awB>ypp7C% zL5Uzai0$hZEi)@;n=Je6IMW1(!z&Y|#CxJVgy@GSm!guQOKCbVa)Yay4;Yg;E#J~T z<~hrPD+2G4lp90?k=S83v9@1f+po1n{`UzT76vAKcR`*vix%glihd|LZ$sZ(FWYh3tF>?yj2`kFI>QlY z;sPDo#QyB=p=Ak@vSyji|X}3Hbt)G&YL+;<^pzgz0BSt3jCvrvkhD1jJe zKi?>tuVILt0-bkN``I$v56z+0!ffHGAxP?pa7{-Bfv#OVoVj35lEOj0Jkwzu%o!38 zw%HOXCH}5~hPdROnNvL_8Y6*cfRX%2jJ4Al7*IA-9(anpYv-O``k3q!b=a3tG;{A3 z@Az`ybBK(mjGJ`b=u$yC&-9qoiv>q1Suyu(pjDk`dkLE7&+U|xs5RPr`Er+0m;EaO z!tm=v&*haB7Hc!p7oi2;bx=zR=>VDK-EZ2Cqbv_1ekI6JoXR^OK9FJFKA1{0WjfTK z4|jPt)Q}ga(vX}%Z-R*2EodG{Eov{TLxyN^szo!c;BbUL=2|i8oh!jAY3f***l%9( z>pM*jW3Z#E5y~qcmkP0%5|DkG@B1@y*1;>SbY>iJ^F7bw$6aaqpIE{-e2Jke!f=S6 zfo0IpcW#$Rz=<1fRpB~125JUXmZn=71Cq4PTi2GSn4l>I%mMb10!J#oZEvaQsCthb&lzq@hYSL}ZG_Vt(Y7sdMa3Xd{P8 zYF2y0$LUJIq67s<3Q*m}e_~X=syXEng#1Xu^vjAp_20TJvu(PZs)D}Cw4BRo_a^0) zP}^Il;jM2-nY{{8`4V}4`@c`0pxd4)n)w-p7-R{dEn~WFbYNLhXhSq&dSYWX+02lv zMb-(;CjGE+{}Z1Rzso97gKvF(gyTQI@8X`>Y7x(FJ6zp7*Pm4#P4qq8ujuffqiME| z_3?>F!6$Qp8u7)jW}HHQB80~#8!HF(^y=I1mC%)EP}0XmC=XpGemjW;Zw@0--iXiVTT}Dj zgD>Tu+}q6%^QwJ9vKHOqaBEsqcMNtrc3y(J?BLc}Mfe(z>rxDa=nL;X=*+ra_2~9w|7BhoXInk6pIu377tIAdEvmbc9$x$3y;lgEwgTyj?ZmskCXq*fu{hP z<9qZAAsuMA_3x_{7IR@Js>c;}U>pa{0AJZB3;~x0q|Eg7(HC*DZzlZKHyY|&G&kCF zxN{G0+KfJ*TKVckOEW%S4iU-?^>tnB*a08UuK*?T(+Zpc*$FRmVOUJvfS;aSg@_S% z-RSpjV7^TE#ihQU0mF7iT!_dLY93D$Y}nV?KQ+5n=~_nc!x-mpLA7Hmp?HpN+-rA9 zIG}l|20a4haqGgo#QZG#`8~g42@Bw5ptB8Ly|0|L9W$rh^`6}q^t)WMdh5S5>vhBNRC9g*)jX8%R7u~|T-26lvT zUmZkSDhfx^N$MTtEEfnnBKjgeF?5;7q5p{{<6$yZYHgL7sM+gM|33)44NP$KQ}ijE~*#Q zx43$leZhrSQx2hjLSFIP=ucxOGWg&Ll4sM?QbyXtM?MY7FY4kx z6o+rJu#RXAt^Z7ps;VVFQc|v~Hx>xYdsT{$Szf5Q+e*~#+Tz`7TE|6i*?+HNQEZki zG0vO&Rplnz2>gfR?Q3ABK#t2xqA4N$FL0&HB>ymF2;S$)nWVhUJi{VQC_#(rk;|p$1fxd-iS{%_up2zgZm^= z?>&LR_)4A+yK|HWi*P7gT8El0>eP6hY9;LP$scN}4Dcp8Z9)}`6H7vSJ8pknoBwSL zhML^aimDiz3~^pXOC@NzcEX*zs-bkv{S!+-x3OW=XV-TkWyP=TvFQGXZe*ID!@L#G(M|)>2p^4?NN@_waLMmXXZc(2l8}}3a}0A+hXp>ut3qM0t$;(>+W08EO17xq zNV|}mtWh|b!8ng7m3{)H@GX+CtWVY>LdSUY;k$8N@rMI$6h_7OA10Sm1jd9^s=w~h zcFADpT}CWk!BWV3NkQsL21My&a|ylZPxo1=?`fK;4<6BDcyZ!&N_$!dOJIsu!=ea!QF4DyjjrdU(js0!sA*y7iV2y_Fe1toQUdU1V} z9FFXf1K;F&CwQq_Ug$j)SsNDYY5Cu!#89oy2L#?+RI)$TbJ&aT_y>{zppHX zmU|ZUpyju{yEa?6%6JUF7*Y{N@iY%*BB~!kO`x;%b36=lFt0MmGoY%g(Tx zxR0sr<@?|tKJ_R4Qbb=us;FT_RHqrC?)8y4~uSP z8^RtWy|s^cd_X$T?&;{?)YDpFRX8jBcbVMZH&&)LgKq6h7~QiwGA5M9q^%?N2md7h ztr8aZs`8q{$hqJTN&nIW^ApCWXX&kbS2E4vb}T@WNWre84y__St&D|q2!vQZl3ly{ zZ)jo z6Gh|7h2-`xTMi5i@Cph27aIit9-qmjq@>Ot*%5i{8CV2zm0z2F|2LaARV4f78hlt= z``Gzao{ilte){@tc={zJ@D{Fhw9|E)whg9#D*Cza+CC;oDh?mvco$IBf#kJERRJ3} z`4E+djv(6m+c-l!(-F~yQd|GX)RtP6ezWA@xBJ}jVWs=;o4jHjH zA~=YTP%u+D@I9`r3^6qza1LUnU`C?-#qnd2u#$I?tRxa=P@J7B^R&!$HsmM@@%Gk) z_va5RXBv`8?3L9S#m}*YnP7&d@%_LUqj~Tgdt$w6@A|F6DEp^h*D+2dC3ozzl6D!35ZJC$nYf5UY3N`*GC`7yKPpqf z|LFZ`kfWS&5fv7BbVGdKn*rDWQwK5=az&Ly$fD|2exolgkMZdoSmWE06` zqUtLs*Zoxg2p2v05ilSNvcM4{Bxj^c)}?XUBgaV>6S~GLAdQ`I_1m-xwbM7EDJN!^ zb*4lzOhe~f6Ro|esm4-GCAmv2ol@=}ct(GHI=gz1$M}PJ!VB+V!@do>&PuX+dv-iOW?FyXbAc(7g@2ir`cC=_kg*1H?FGf9B4Y)>W zPhBa*l6Z9kB|7A#qMDE$VM4G4ib#P8n7t&$X;{qMcAK`3!uZT4gNhG;*uA)< z2kHB@vv*$%33N5rsn_E3tgX_*fSJlq@-!+Bs_t_#^g`zDSmaq)k-F50c*WBuua6*^ zGbQ)p9MzbEoz-af;4YA7#C)?GSud!txXR3i>ichVJ(6_tN;!U2Mg(cyFuxw|3zlPw z#V4N>|4*X^ltJR(drF%-?1@V%*1o*(@tBnH-8~R1r>0ZK+}*jXnClj|n;y!%0n5I8 z$R&>ac;{~_Tqqg$l@F#oH(x;f&4+5-c3$dnD~v(f5BqS-17~g)ZHsH1sukzWzR<=k zc~51wQ{L}=?00(cHh(AlhSzen+I59kL`t!hr-09~Z!*Zv(;JMiWCKV&YzHtofZUN* zPP+L&_)+NXh10w<;x_d%XAA{!3eD=7Cb&;V3Jgq@iS(@>)#z)2Ym>$UaUx~!Tni#0 zedRR<-)J#8mZwkv)MS}AAXwM%_XU@hrm<2+k6omK`?a~69O6eK1rHU? zx)6EunqRH+rIH!ZA}LB%yV6)B!*)L*7CcUPakCbE6EetIWW51@-+gMPJL_;U)XuR? zTJS)Pu}ogb}la8`mNt?`gGpkFu+XU8+N`N?UNs)ah(F7dQALKyia}#Pxi3H;Zm%WD75n7Qyxauv<08R^FdUrYB zLXq{x%%WQ6rs$IbfoRZtHG&DsTZPdH{W#zG!(sJyBz^YXr?%tchEjx*L&jW$68hKR z)xWL3C{Td(!}lQy_&+QfW^@oTLa^l?EfIAk=~eJ!Lr2x}+5ir~OY>sfkTOX3 znJmnd6R!ObbW9&45!_1I^x=b`#Y={86zy!=r;mlnG^vd9Wy_#JD+aNaf>Yc-{ z%7!9R+kCc!pZuI%BLSz^`>-m3avmLHOwF*_!yeo!@i2*!AoWRXp4lZUO(7;Bjqr;g zP?61|SfU~n&?cF0313e7*=)e|YOx^~0qxL~svonk(b~6>Kne%pU;~0ktAdK?+h~)Y zv37*Gi!^fzRio8XAfn}^>rPIH@i&%}l$jlrW?ZLtz4#_h`?b@ZcDS}!*M0NjcVtQ3 zGQ|zT6WpB*Re~V*$eHm>gm4ik4g192JFriUxudvPqFy%gf-;>1%Fk0DKiFY^jtyqr zvQw$G_~r3;Z|jSrg9Gu}PuyL6|Gvzs#y_qZY7MyUW_T1AZX0}Zfmnfc0mU)612me;CJ|iTIM@{(guU99~)&lVE!xGj5Ea-D<#n8J*z4+Vc_F~ZN6$8gx}t4%d2z}MVRL?*Dv z5ciUfBGOy%SrmW5|7A;i@LYnPrb<18B+)x{rBi7(t;^lymH|}@Y%`zPXj;fXnqv>9 zF=}}!pj&^3<*ID}ptrPOQv)=a;u|VtuZkn7;Ap z&HbO>3Qu!G4A%;@XK+bjCw``AZ!IthaU5kxDjcTah^3|}fD^1cZQeXlnzZqYTLu|l zWU>#C!5z_o4)BDUp)29f)6EwcK}&TJRO)hE@{sCL;|nRs^Njwd*!G?vXpLaUOni$6X5k(pTB z1#UN^bFc!FoGMkG+JSo{qU*P0w7O`<*N)A2%_7sLLQ8%9AE>0;CeTGB2Cr|=3Z^O2JTh%Pp z>j{r%q6n0!1E~>V{^w5vuIR@=EqcecD@r!2&y#=5x~_a~1>1h&ynd5y!Qt4rfg)Ck z`mh7N{ho1CBs1Knwh(x)XU=?t3o=hO0FH%-`8|q@KKvumib!)iKP`6cb_<>+N zB?tG~@M&&rspmCbUqO5W+EBOq<*qzbIDkBhXZ980IPB1{dkVLuBd&u#-i_O64UxO9 z-1BP76yq?7B3&+}VsPE}vllC~fd)zGn)x%*TD3*8r5SP6oir);=TDJn7VTzU^ z3In1mem6AaVB%6b4Gkh>~x(+ID|@{ z{kUeYe8t;1Jc_5&5`||L7;ayGTGjUAeI$b)rl~*hk?96!jfg+1z>t%I9Hcaa(L)7?7rqqG84v zg^gdjMaw6O$AcFnLR6N)_@!`tXrj0bnUL`3Z&B>Y7W*lai zepfQ)*oZ0h9t-1(UAByIL)F~?$T=QeUG1darJS02-Xd0sE7tjwNFv9#<7uTi#Af7# za(EwksSquK^Fdc;td>m?sdmfP{JN5lG8Ld}W#56ERU_v_3lsQfG-Is5@iqn(j0K$% zRYIAJ)+3KogbAH4cZ_5-nt8^C$M+7z($yWNsAq`dtkrntAiXZR1{$46H{Js2_jV7#` zO1I!+dU?jB1>o$QPoSiz@zN!PtKde;RyP*XkTkYlG6YH@SH?%~|Ea^7&wK)U+<3JN*3G z{+|FQyMDv%b8UV2sxj6MnAUpm%Ty%aNr&{~$Crvx6=Oex@5YUUKkHL2|NZ zig6Z^q@g?|3rN*MT%Wz642iU5T=p|{xej}i7a9lZm#NQcpv2q}?%*IS>LeaSUg>QD zY{~EE_sGDt5Uq<24&o#NbkN?jn06pJAo~-#g>>3gTY!{2-n=2g+Ou?zAMEt`k>A69 z^X`rTIM|^PD*`*DpLgb z3Qb=ZwW&ATFmcdlFf|)ELRnnSP>wCIR2ErH6e<#qlSF+;6op;CJ=PW&FkD|bDEr&T zk5g!Q{Y$>lX{n72&^3OP(lR|zBymob6^n0-y5_do!=|tu&K5DILK4)Agb>U3t`=LT zRR2TlLnil3#RyL{xlw3Z5IHj->|}$nfD2C6LGY_@r!2-zfq3jgOIb+Rk5JQc@y0~k z@erFS8LyFujXKE*u2VRNx9SbGiIUApu+_ z9q+YtuQw{EITGfd8KN%ipjG0(gyl@gRam?fV1&T!CGOMdGJNDe4ZpZV3vbH7MwXKH zD*nt%(+7XiF!UjNA@A=8{k~8}T@HIk{7BpKc8;MjN|V$k>!oHWM~RrntQseu`If>l zK?;lsg-EON;b|HD!_O!w6w)t|TD^nOn$J_G+qFyk&Tz(Y83!MV)CO{O9)dr*AuFpI zrs|*Ws}-D~=B3*OoobKp%NzXfEPw#`+|o+uwK->T-q9N?mz4`x7-nY-c^hw(P0yHy zlB)3BY3Z|S3rb>F-_*^j>XPhLoZFw6E$MlQ*_g&o0zq=K<2psN>=6(3V8J3^3-0gr z0D)ngQdaE|Fe#Mtk9#(?d;fkoG+GW#WjH#mrk_!_62t$ypJ^{O%-mY?0WnuU0y|pm zM(sHEA$;Fq8dZ#;UX(x55tGmB$|$nvlTBHFrMZP*|$F&*maRR2Sg> zNx<*({4&f3cvH}gJX3qZh0}vF!Um9-DTj(k61Hwk8ce27Or{||4*8p|V;!1N)VO@0 zn)rgp@zW(yZL)OXIF0JhF)uxvAeHPwa5R#_uK4ZsPjPtU@AV{?dKS+Uyz^-Xo*63C zSfiIx#%=pQw|AE$4P;(gWD>YJYn`A^nhs+&)3tgS|EQ+x-M`T>&=(SjMjKEKHnJF` zNVx=@Ga-CEuw4i3E?8>&dak8s%Ub2($b)}4ieP&HNL*+wW$ECBWN7ASvZJ>ODfx0r zQ#pZvdMj1u zwF@w}gGYTgxTDQ*Cc|-vhHa$!2tN+`pL^WV;{P;Ato*Q^08N7aC-}rCAbFD(1|^=^YTfzy>Lj`ARwl}r}cUce%h3vn2*xW&j9Qud{ zh1`2F^b3Wju*xtPmyV>glzUSR))ac4{HK3!o%HMf@4`(d@0H3~!EK$$Ed|(>!_YQ> zw)$|CaTI+ER(HSuoSThrB(>tBd1(y6!sp^L3J$nBDIQvbh~uy(XzP9&iXyhsu3Z7HLSk0XU?gO#o$q@Ml$#PZ_Kd;BhO6Cm?pr24{{+d~MK%*dj zt2->lcjevRump50Lb&?+Ru&^y4K@)a)j0?{T%f)Az#symbMGK)`491GOB^7z!_!vT zy&oqvqqgqf8;Fmj4{>GFopTq z8Zk54p`}%vQ)Ka0$|j`o4{1d5sp3WA^`Lp?p{)#d%GdE3$kR$0C?7u;KXybqVgGc+ zYiSp7Lvy&p{t<91ud1tDEFU{~l16glBU=;89{C~KAx_=5U;)kIdWhAL`rzKz=^N`D4`zZp= zc7}wSA7|c4JGehvWBr3vyTsV`f-E}2t)$Y-1o0fU#h8WEckv2`lg&Skm?!-OpooVSFFU_$5lNs#!?dU&96ueyvcCq#ap3sxlGXQqZ;CU_anL&+Y;+8AmxxGJ#K@ht?&}p z$W+wL7YFHUJ|;bi-E(GP2;2nI-O3QntcX|cm*f${hpJ{(i(O>Z^Db_}VkARDr*`VF0_1B*bhh}GKS3|iCjcaY!K#<&PGVFy|!Hby|g z&u+mY5$PCaEDA2Gg(BOuvIyo3G=PiR?opxM^6OzP2uV3}9I^bczf&KVEm}(ODC0{2 z$zbU|>ZJ6JwO7y18;cYE@+EH%ENIiJY>6O3z(>hA=Q$x6kJ7(8|V zp{s7)mao`3JH!3k6KUjUM?dy=?W*?L-d$IHK!vGRImLx$$65su+OOu7*4Rw`JiGTb zNR#ozH=jY^LYyxy|N2xUX@2)aiZ#Y5L4wJe37YxD45|JJ%+DR8ylv+R*1|7Kn)9$q1uPD} z=V`}9D8$r_xFtkfKe|RhV&hJg%`5c%zPpX*`-5O6VW-d;F^F(6-{!2Gm5c~L%2T&JaMv{+? zG4glwU5R8Ysr@;Hl;P*?IEueDa*&AT{2+j0pz8p+z28cuk+DWcHlCdF*D69ew75hh z30-!?psT^B{#K27hMbl~L2B{EZ-z!z1j@t*C@ocV?Un8l`zM3ll~91uCvaJjIM!6M zSaXP~HM%%j4S}Mh0#2U9{Urp1cyJHxVC?_9Ni1|`#P^#fr%)#CPo&!0cZONDqvnCU z^Ru62%IgT$QTvjnMz6x*H7@xNfif%Hk#Kq^*0?PSB;beIU{Mmoh7y) z%`t@^oB?H{4heGj%z%aYTxW6IA##G&@33X+@|ESZKB+b%ms)LQGLl#bmLEYX+FIqX z^M3LK$G}mz|8&;u-YY7c1E6q0qv=`6i{4k%>U9!T=NV<{#nD|RY6G*lLCZDc_7VUV5I%7Qy_g&Zyf6#dZs1NBT`9k6mmVb zPHp)?HcQnx6hlQ;#kQrXl%HWytZ4BAj;IH>Mr!hGdUQ+^|uNx>LqhlXjxvA`a43<^{k=?gRESr9Ya z3mtj<>ajKXE4g{3@h`GA<+t}ysO<1~6FJzQ8Es=&nA8`_9hKW~!DSkw-??87jARCb zV?E?^Imw!pZIImfc6}if=WNUsrsA~=Uxa{IXfx%kaMxSm_eKr^>9>O|Xso0r)Zf&9 z>D3L*9UhN6X!+q-fxXrq`pR+NG!}CF4Y)G7qSpiUelFHQarMmt-;vncXlk^a(#fq* zvRGwj8e+M9?tAcNmT#wEk?U;V8)7ll%V~&1ZxV9Q8GP7yAIp zZG!nT#I(V4VUPOD<&Qq5x0VG*Vvk<|(yS)sED{xQHx6NapgUDCr!<6NrLP_0cx9i7 zz~{TXq#O(I%@X21KCb5fYLE6!#3I37vO|q!;BWg*9`di;nl8-0t9s5YZRsYF67AaN2^c{@eb;iK0WGR{{TO!Gl*wx3=N zxO3OjQCdCFw3)f|mmde^7?%MtpkIaPlP3gSuuHn9{e5&N1#h^G9(D6+eKRW0=we09 zjr7Iu1q$xJzv6E{|IHF;`Sd%+@P)o&l1Eq|JPxxse7 zyX?I?etDE^e_8E()20{S2Bjq5_Fa1a;skyni;g+%y(wFCxEhdu3^}{QzI_*yEriyC zvb>$V)-CMw{7MWNPL1eydotMkfkxpD$mP%I@}{VJKLv$TCjL;qTu?e3%)Hm_@WfXX zyio(>08SrZa6rTG@bGGuPP{qn+rdELuK3i@3Nk)J?<{M4IIc%F!B-5L;_uheud$|@R!&2xxXuvlu#=9hgYoFB7UXU`ZQe_CRh$L+^ zh7*4+V3$2{KY~aMO;R`CNFDA}06Rni1Dt@Pz`oeGci5@v8v52|}e# z>QwDEiJIkhIyMf3Vk8}HRRh?=7%$s<1ojC(JAY^D%rRy0TvlXpY0Weau?Wrvve&Tg z`XS)*SK6h{O;D?;aFm$duaJbxsXBFaK)2Au8~bDbSOm{|kHDphup+=*Xd-)RO@CS% zp#Aq}K5)9cGi4@?DNAGNiI&66D!cSAjlt`d1xMOIz~wLV^@pr!ISf9XXJm{ofh7yn zmLmA7Ofz9yHbatQROIabc~awg8Si6Z{X;nwYuXQeG=+NgL3hRZdht@y-44DV90<&~ z1`n`4elA3S^Q3pV5iGXV%M1-i&jQT?XmAu&u+s9mCL?*dEHTs_b8w~Ruq9i3vaz}&eKs{#r#T>F=oC9k$$tF@)t^*3yg2iGSN3{7z@5e&7r9l(n| zb4MdiHrhcnC+c^!eeRsJffCf%LPR28IDtX$*mj91$33=t&^#_^XlaDrJ^v-@Uvq!z zc`fcQqAc=GMXjcb3$hQ*XkH=&&^ViE$`pam%DH|HK@jT6OmfG4(tEz! zsSBsJZj~$l9pe@_4ZQp`#(q+~KqHM$6^gG(ZLbvkxo$bqXOnyKUR}6|dbZmt8sDbt zEL#347@i~M7U<-irSIjS-sdEKnw&6d4Pzp2Q1MINPU2e~DUqI~V2HPR<{B7}@kv+* zbx=Q*xt-|xjd6F$)4mb^73Eraa&iTt7@aQtD|Fm9$Xo^2zMM zSXM6`CYe5@wVFoSmp|8RFagVQqlf%bDJyOcuY4hJM>~MkwYG%MRy|Gy6m%2|ir=mIDcA%Dt6 z;)%B19gwGHtx$IX!_%|hk-%UXJ?x{tCL`4Il8CRS5O#SfdFBz{AU4|H1X1M(sN}gu z%={6T5!`&OhNsz0K?_KEa`CLrWeL5^75CNPd1jr&c^R;Klvs0F)cc2`wufXIe0p<9 z^csE$P=!0+IrQ&-hn&l~_>Z6ZFZU&Y-2`rzAm?ikAt&bw7{09m66NF8;Q5s33!3e^ zgGNV;pWP~I20_ND(DuUv$>u}6UB4s5(S72#;#m{jsn@iR`wMI{W^gj5S1}9Rfi!rr z4*%RwnF`I&4X=xqNgph?jeF-GF=gVV$9`V3d(Z_w+{fu88LqM~mC~OO%kSS>r2@+y zO(a~{5A_I_Y$ihQKs89B3zN1z5f1Onf~^8zDD=qh_@$ZD5;qzpg9)U3OE%_yhqh9@ zBQ*T2zg5k$@rXyI8WCPcMHX1hlq(OjuMge5dt{^Tma1n|v12Z?97m;RTjxOJgJNsC zMGEbt#K?Ic~#->gu z8;RZG&=7#F)@Gle(0=}i@^xsK-sL+FiDAw7@e|l-d54Vn&gmze{O2qg{0(hDB}m~r z7DxX`vD(V%dmU;25ef(4p|FYS>ZVs8gH;R~IkrV`F3W*RwjC*diN+4ITa?xheO*80 z+X;|=wj4`t<-S#;cKL?l9pPbh<(>QVR>X4I$g>Dfx1)h2GM0nBPV`zHXcSewt;HZI zBxl$6gY8g@PmopxChHP6yTH|Z(`ZEQsdJ+Tgl!nBWnYV71UujTy|JtKoZ*tD2-J=b z^i=dq1{`HjNAa5EO_0YS+pJ*Q{A%E6Fs=?7Jq!uFX)EUcRUlc;Co@Qxqemk~7jz#d zQ1xBiv_m^CB^jd;Zzy^(?rbyn4!j&6PtmSE~*3H*x zNVu;0b)7XDp#E#_LUY~%*M=~49sXmi)<984&xb#*Iaq`}TskTF{9k9jTP!L;8-! zzir=f5Rr7%w+-&LCH?@!>JdL3wZ5ev`~amYoPXzJsJC+kN=~w1J_RI}eV*~b?g;~5 zts!p-T~#vbe2=Ui4?!7jIV(`iqo~Y)1~(--C7u$uIZVQ-zboef-pU%c0RpzD)&?Qo#<@+a`*e{JkS-TZh?TaPNu z9*_0h)_>UDC)@SZfuF1e?zVyqs=*JB9ncM!xNs3I#X;J}aH_gi3VSXdL(ZwzW@TD_ zSzM1{sZ;#>B9p#;z3FfIVjLnOCSjZt;R46XDew%Aae9=P(R;3*M<Wz4TZ!#(S?KpDtF?7 zmLnL8o(h9Em5KHMYeT*~2Tr7o9<>Eb^?W+NLbu^}BC=#%F%Pv~PJ!o*1myGvg#6{Q zF*D*5c?<2ph3Ll?^jTi=rlwSy?Xb(`Otx%ZtLz$(uYc%ek^rep@*ummaTEs%-{;!{ zO>1K@jl!for$sh<66zDIIJz4Cofp(_UE(}Yp_%MX(^&&H@?!+esq$}zk_ut|qsfsH zbYxPE*Hezf5rqQJSu4GA9`e5}a@i@5ne&}J=cIWDF_SBEvKHnn&PH=~Ji(tfV|@a0 zqKWE4IZgJ^FEBH~6X>gb5@-=q3~Qt4a28yw{Gz1ktJ4VO3CZ^ce0k-&q=NDmK6J*T z=#glK?a`$^AD(iYo-9%qxKrYjro0B@@gDMq);Em#Bdonf>TaO)9$ED$G)JzY3wBx9 zNjg z(1(qII)fuR4p}!f%@d4F(#1JFmUOWzIj!RfI)iRQ>#+ z%%Ey5uE3VPp9AdXmFHBOByh-d(nxJyC*`(#B{*U~)VMf_>R;v{cfmBsDei1=<@I6K zxZOzZt;6a`$cP%wlb{26cSjOdGkQ^59eeqHZotm-CG^yBc)==j=*| zS`X-c!MzndD@7%deITE`yE!vJ^l#?>PsmLG8pT~Mxa;2$;Mh!3HyOqyM%3d7v3h(){E<`D)VV)ajz!OztYL!cVfddqx(GU zYrs}3lbtG(?Gtl7Fl%NzaTk$o9XKYQTzUXY2(GXkVvb;um#g@(;)Jk-7Kj6M$=XVn z%5%{Im44YGA0+D5+9OWx#6VQoRY4GaQen08LFjKo;zqqmc%O0DyT^7(&y;a$O&<+ zKN)saTwhh=x)ahEjzhQ^^>$&Z%AucNxKEGTWNiI1?!6nI52i3;)HG4^T7p$chP&_;~ zQa6;1PMZ}L)VV+i#ncWpQ7aX;$y7~v0`rrY?CPT$OSHQXeIooF+ygJmP(E~CT_INV zJ`=kLIc_GBX$XD|xY!E~3=$$5(DsEl2bHW4UU)RFXWH0i1etMhqRx z$Ax!T2WK#2D-VhwF4T%%Po%+0>zL0~_B65jDzg|m*rXyGI){BvTQ%ZbJU1HUCw9h$ zoZWygu1j63Y7)^8o!1sibXma%i20pIyK!W1EAQazwPU9oyMpL_wQ*#7ONmA)<%Q+_ z?My%G*EuEmtmbbM_wJsw#0c?Ms+%R>sEt4szP0kN`7`2r)G9WX6z{Jn>P_4R+0uKl zFNS+H`_XL<`b8MaqLF4%zt$EW$8rKmhNfSB7>rJX*e6bxCH;MfcKKLQClv=eZ(Q>d z&yaDuuCS~h{rwE8VMYA;RH@xtkj|<2etZDF1pE`%09nXSmiXzR0512kCa)jl+la*Bai62)S9a>LdVS_%S zfaO=qbG?=nU6D@cum?~x)Abb03`LEfi?n9d@1vVcajHxyi1O_4x@FrVjQhTPAM>fG z`MJ_boml?5Cp>Wep->gcB$pqG>EDnZU{kA5dCK7JS8O+UBjK}`b#(lAx_l%z{d_qr zrJG!yras-%L@*jUGfutUnnyO%(IE;MX`~LbG<(5vd%r=cn77MT$l`hs*z9!J)`C~8 zxLa*Ue@V&$Nx54K&`r(}=^zhN8hM@(7z+E_$3L6HIfnUE^*kyu;*;v6oL^Q6QT`KrK^>ICY zJaAuZ+ei}jJJQ(<{|B^j zhbJ0D{3ify!YM0gvFrK9!0G>QP>$)x5F5T@owJTX@gE~g$rnrj+^vFiiF%d-5!r91 zCb4B0=dBj}3^zrfPk(xcUh66r<(VCyu(uY~j9&{%P-P6b=if5`#8Ln^(gW_gk>Q%a z>70m8FI}ASs8Iv~-;V8&=PHfuf4OU2`BL*$#xQtdPFRfZb)LPOuAbg@%^*eZzb^WZ z9PtmAEp$Juh#Ko6wDa$DWhQh*>^>yjOUfrhEblU3R{p zxq%5HO?LZLvTg>=QIND{AP6*Cw39o<_-ebd2)|Kqlg9`ziiU!mqeb!~^%otQ1%9Cz zPFrQQP#?|fRZ#EQzmswBN^jOSnluLof>X*-OSEZ{ROnvqs*?Qq!640e+0bpY)$E7z z3w>;{D@D11li!?NtWRJlA|a!6U))ZyiX@I?v6`xauY{J#d1833C~K?665~Tu#&wwU z(2WqOKiO5qO4E~*Ap0xzXeNo=&s_008L<(u2_54d*FUAU0jjTyi5>?RW|~Z8swGgv z?T^lOk&`q2o{`1rFK`_44ycwKn3ffh9jW>#zqk%xRwH6&I@!qi2-ptfYZdI?fEdJ7 z-k&GJLS0;xk7&-t88SH>#}EqAIvZ}CW0M}7ZFat{SIWricW-U+S&tm7KkQP#Dgopt zbuv{tS}2xX1sw2v5~scJ>5Opm=sO>YZ`#A6EOcl(SATi^@aKEY_j9hVllauGQbdSf z+>8nlGACD(d&B7+=bkmdUdC}f?EMu|Yc#m*D6QqF0VWmP-_nn!2c}#`*`tBQD+XN2 zsB4W+rDmVPvmJ%wc||g|1s_zrLYJHVbWBjfB2xc(mn=+8(AM3o-+2v#;adNjfL z#5pOOHkn`2=#{&=8U>YR->?FU%Gaa1Nc@Z9%Bsf*1;zqFi z6u%hN`1zWHZwAJ0g2p9?dn?WB=76f14&O7H)&JfFI-N8^P+UBCOei85 z$tM|wBs3W|%NH)T_d@SA&|Y(#icmIAS{yO{fg@molWIarJWLi`wo!8HxIfuSh$MwZ zJL=#r(P>FR8>_{ztAmeh`^lWnV~}lA{Yek^!F1~$o&nx59yhUCgtJHB+OP}IhotTH zFQqIGI5w!21S~CH@D|L?r=q=OdqwD>QNZe~7@v?c=}2#%h!=JI*^LwPH%G5T2G7t< zixK%jVy7mn4ruv|k9PulKH}%Cps*i_>(Cf`CZBEa->Ivj!B!^cM#>XnbH{WDb71yl z8$OQ*AB(0Azq!Ez#Xd-HLcf5zOiffkQUP_3hA%<$$NWbS2BU!+IW{(vA!`hvU|8HsLG1A^*yqBJ6(B z@A=Ao<0>oUU$Fz62NJde{teh!n|^SX^u?4Yw%}gow3~ zi$hCY$U219|HQY{Hojw0VV0*m4`P2nn7mdzV4Lhh`h_g0@}`&36O_x3@~YoExW@ol zqzeZ_;NeBJ4SrVXqSAV@3zK`cw86K4NIQ=->X#3_nYUM&y0>yUJE*N&Ov@f6*>wFog4Y&xvn9GjtgH?b4|xEbnS-97<0;)q9NADX}nktBz_am z58I_cU7E3M!^N4=R}D_Dprl*02=-d5wgglHVYp(uXH>3DE~56m@R9C7QBc?ewPc~8R_vH!bM-cLIvOPd1+Ws3m6^S| zaXa?APT}al(|-c%6wRbDR-bsSZkzKv^3Hdx#tO15+CNVZl@zQ#RMq$U#dw>-S_RD< zh>oP#kC6nIp?%sZ0kfcPSy<%(wZ^zOwWfKq=`G-ZBVY`~*C07AA@1yC4XOsod+gUr zOGZrJ-pF^rKN*5VGsu`VFm!__Y)uE@ICDE+E@?0G5n)V)v3ouR`dX zi#V%iG|ug>_g(wf_NCaPcK3G4P-@yMXE^530@@Y6;bupVFl8!GGal{fRmkz4vQefh zmNUI2H`9sh7LO#isWSegbTF_^J^JHTIfHO8t)Lcy=~zg@Tw9b2UE9z12N}3RofnpT zez&u~l_F@?#oun7inf}-Sb-f-O;bPeHg{r+AA_NehB6+m2!Er*#OS_7B4ar|&3=n> zoXUfCLk^z`T_{j;%NjlG4!Of*DwJDl6sxh zvjB3PLy&&ek)b!T7)RHa@znZix7B$ph&KLMPFed%C~?5v+lS0fqUA=L6<80E_(L(l z^=a6&T59o_BCdo_hE8BM{fw-b>`&6^Dh&^H?b`nFls<1JD*4?9)nJ6?0(0+EVP4sa zyqR36lR8YrstA0BrF-GeJ|ciabI`b`zCcj_O&T-eeo_0w_(e&k-34rh-)<6%~>|4+h>;g>!>Uz#fJ*q4}t`akwj~@)2FG(}&vpAU*`&DKg0W(To(! zh}T)7`g_SKi?Xmoi`HPhisTgOy5jAW>^UY8DQNX9J8nGYgf${iPy{auv0!H9JlQY_&`}BWeQ5i{~0ZHJHh9tE0Jztunp*^prM&?KApioh5BE zULF!=7B&gRNwuGE@X(b+Tjj6p2(nEjvgHcJZ%cti^i1Nch%y!$(+h{IhWWLY?JnfS zbJ=^tcI6o3^ys(uw*=E9rPCwt6@0AK0R-ii-ZozIqPnQHf9pEShA`>{6L*m|y|VD7 zchEEaw2|i4Q*-eFHywL?0A}V~$0q8~77jwi>MYA1MJeILyx$gVy1*emJb^J>R099i z8=;yr{7h$U&=+ru1DE%gAQrT@2LunMP@<~am4IC_F-OvTB&NLYY8;J4o$GcJWsHK= z1&{Qlhny1mMj_oIfvN%5>?S5*mDEE;c+iju9bV;TfS{T%GJEZ41=Z#McApLhziYvCf@;unNNGuURPB|LW* zEc&lgv-!5}*QSiH+(sMJIBRna3HX|rBMQdiNnU9ccuQKY$C8_55Y62?T08kOfXHFo zjPJRmLqLh*61=tyQP-6mIWttJ=ElS)Wd}JL9BEh}>_4fm_bh7S8s2;rb;rcf1n>RI zmXDGUQx=vDIfOcj#p}12G9TH1#p^Za?UL5`N2WjThUNJGP6w8PHaXAcu}A056?}}4 z?#VOjW`gwfCLs|5uX6LrTx!)zckCyIC!}C=i6b2gFNLbPw_gg|s~A}HcJaS<@Z2w& z`LnwO-DMV(!Io4O`-Cx>t-hS$y%c91RTo#R!#dkSnESDhoJg&lg80;c8x7F~248=E zam;mNeANyuP)rAP7=D9;uSOXdH}py@#04e~BAx4cos46mXoNoOIj#j;ntD>^7ky{p zgs$yK&=CsX&RN)^ zd`gG?mo8JOd^C!6AmSb;kMtTyoSltPJ=KqTila~te&Ypl9VTCqM^@}9 zO*=06m|?MjR!b(cFSwrYrRkXF%+r-hetJQu=!_-Q&u+F?KVfSx12k+3_(i~_!*!&A zy4Dh@$uXDxB@6V`E-?%p%^q4kzxczLWJQo74(radXreH%8ey$x?&2LQ-lA8A6Xc*d zYkRjzHOsbQuJW~ZfQsk*CXpF@RM3a@Vq+Vabi-(7Y^ z_8)w%&w})MtRfXnlVc{E$lMZNHi|alv-gfe}%c3tM&Mt7(TTSv&aj$|`gj z7qiztQ*NY}nN z>%Vm2<)ElJSr(s)n3w-8;4CK*TuD2eqt;sOxg$&Bdf(rMp_Hkad&D(SdvL?YP~2l2 z^Bgr>#C(FX74F_$auU|lto^p2pO-@u118)otVQA)R%HIp9`mmgap_YJm`OjHv}e=! z8{J55Y%lyZdWY_0VIXLOJGJ6Q(*iU^HF0!XQmSayypnG)E8_TCYPK6S2;9 zH8jUfCB^0*se@*da&FDF>Z{}RX{Fx?u0BSHh>EY>f=vbh3s1N>w0{NvG zadFq&rgS*BV{-RMBR|~#Fr|luU#?o1)#qT6Y{(uTy%@S!{+DZqu<(zz#XozmgQ3^Lj|+B^yBTrz2?+#6Xw<>2E1 zx6I`C)Y=bZ0DnvJLGOO_ThtGwS1V4Y1)>dpjl8KS*}3^B{vm=v<&v$DRFxXIhAVyw z=T6X4=89tL`S*H;pO%MKd_dUh3;FO~G=ZH3k^598Ryt)vcfr-`@vXpUTmd9@RLWtv znm9>iY0Y9}Okx<&Rl~zb5;aN;ZW^JDWj7Z0j=(t_e~0!felNDnQDMgY$lAujoph+| z=40=-O{s})Ufh7(w6^%J^&TI0=Y`UIE<|@3zWn~w`BqqXT7AlNfy~0!@Ef&+ae6MQEY`Xpq!PT& zTcqo@OmuLUV0SG*myj>IPj_SmB6hG7Gj#h|5<0C(X=49nq+Cj&qU~Xi9)gd@aJXj; zm~B^EF`9IuGkzJvL~tY``&rINe*1-&qrfO);k8MSW#@IoXRlq)bZ0dJWfDq^%Vx6q z@4oKfsrx~fx$Tb25uIW~2(=nu2n3n^}h8a$wKJy@|3%_!`2yJY78CkY(%S zerN9UP|Y~k>AI@$L3BG4(5HpV>r)-kMQ7|D-&#$M^WaGZyEG<%5mRGafy8sL7`A*< ziOEZ|v9xG~+fh2-UWeK~;Jab=$qzI^2)(Q1pR7=BXs4dxQ@0`t+a^vmw`G2FQX&zf(gC@Y=%KMgXvWHgvz9g+>- zKzKG38PeMY{&42LRXIjm4oeDJo;=6a`O$B=jf;ID*XVS= z8dyy@%GQFfbFJTGj?YwV$7-eKnn&;P!KrdsN33}rhhM9HlWyKgz8HS+F(8AGmktU%b~v>te_0`O`lG{^Xh8p(^+{>Bjj_KZ6k4`u|F0dAVfW z!2{nR3q2hu?r8Y#X*`R9U(y!aQH5c3!V%c;_?Le!pMTPQRoR8X|A;Se6~84*DL_mQy!~UDzF)bGd)VKis#5VK}lb<$y|J{ z1Ikz^V1>Dk<>-IB08k?u>HG-BLKqXGw7-e=#kka z1Y4ebMk^mG@F_Wg6WqH0=|lj0aXefSe_aE95#YY$mIjrAe-esw*e@+6l^?HTN7B4Z zk?lpVZQP&Na0qp&iYXfeTs5T|J5|hl^r&UGr5WSG@}fjZ*xt&}aGw{s2p; zoRPZA!c>Od2N{e{o;2yi)(n9gR5L1k+<%|i`4x`nr-%Tx1Z0NX?3tJOS#p_}1uUdm z5w`x>@%TgK{Zid1$if-A-lnEcnr;orw?v!z(ZR*0l{h0``OS%&pJdQ`{q9{DJ5lF=9~ zY2C?d)uDmKpC5Jh5BUC(UQmhVqwc}$0F%#^Uo(U+U@jKO@s{k=&M_0=QS7*J93ZV# zj5x;&?fbnP2U9 zSl5Pl3g2u72`^@fx=5p8V*}SDw3f9LzbZtu3Lm6CDIk8V!#Ec4EMhX3qL(aFm@4W` zzZOfuWArLM%VbOQM)@DkV5qp)R90zs4UY=rip*GuE!%mFNce52*?EbWLKD$(mOtYi61c^E#%-k@hZ+b zVU>F3rmpAh!T<-I)K=bA(NMk4C~l)y9ZF)qxa>mS?zT)qjA$|@7cc7%d8LDz_l$Us zm|r%qoj2s%3invG)^T20llyy|eC1F(_)+jzf3`X@V7_f4;i*7s*-;>n+6pm+X>e<2 zje~Fa?Sa6ZZ>C@TIxlt9*DoF{2_Vj%uBDV%>y`ZXw50&mQjH9Qo+mFms;H(c{`{#^l9YoSuT)y zpZjXzG=X7)1F(adn0*tXD7b&AsUyPy#Q(}>&0CS5M=-;7jXZr3X-|g=?fr02#>ZOa zzt>Hoo~>kx3&4pAZBo(YUdJiGh;Q)>Zib&|9p#=}!J^LTXqIx%*g;q-`b%+mTr zV^hbQuJhMjvF<~R2KO@UCpLDYlkGd?XaAL)g+zG=(0`ao`NQLP#d8tu)=usBLfUmf z>b`!YACl6(`@Y%bh+yOKFV9XU+#fXC2{Ro?^po`()!7I%cecUA0o)1yFXwvs&2NANN=X(>EXgK0Ylz{Qr84Cdbi?HsiA%6^)%);RIGbgGZ4Y#WX`s8@K$x%Iepx zQpAY3OPk$dzg~nkl*D+^htwugtTeQ98?@LRg`Q`0?}ooVV0Z%+Qs%G^;vil3_tE{CUwqAmbms?s@B@ z&T%SXFXSR)Im2SSW~5iYxK{{Pz%I87tx^Qn9Wh zOD)$HQq#RVL~+}=V$z0W&zxI5v>Fq)6K{nA=g9jO?Uc2c&uRTv3kAz2C%WVHMQenD zBdRpSR2@JL2J-S}#&Bi?y+raN2>plx(4AOb8e|U*Z){_*d(h&QHMdEuLESSqhqq;Z z_PopTxU-5b5n1Uoo?ZQi>gC$-jq$4lBelj%ni)Oio?5?Xn_SSmag`dU^XNms%;#|D z6RTz~gwi%)(BOisd%y44yH7MD~}%q;OEPeBkP%V5>^&H z;USj8btyrx(=z%OAga}z#pF#rm97^pQT8##dirkpjLnw=O{B%QCPt;5t=DuhjNYH) z*R0-PU#>mOLpY#i4_BN%M_6LGVG7*I$8b9N-^wBN-G@;78Irb?Q&qyB{Um$DOw=f! zys<>0jp{F)Rp(Z}37M@kdd+h9mm)CJ)v(2C$zGvJt*o6Xg4%4?W6 zU5WxtT@y6=+sByw&8Y*qJUK5FEW~)1$Cg|>Tt7< zjeowt^1wgab_|5>rGy~7P+z=Gg4Mhjq42YZ%Cq19vZ<<^H9A2jM?Q}!t``6O-1e{X zzYO{fHg!C9c@J;Gin?GrkBb`5?$0nmziZ)(k(b-6yJRmgiq>KoAOw-lJ%Cueu;uk} z#oH+M=7ce}pmd|=o}aldAHEiXxBwsdM%eetM5aQsE#nBxQ#|zlA6I7?6h{~R>A~II z-Cct_gF}D>hv4oE?h@Q3xI2NMgS)%CL$HAW!GkaFR_*S;w(5T9k6qQ(eQ%%hJI})` z+ZlExYOEC`7b{K4A$k~0>&S@=_=%Y6(MHJjJ>zQ$eWwT*EnL4G?wH{nkHUMWhqrdF zy{?joqNIYjz|fTJQFN-lThntHT02P5266FF-eK?X^5}3QrEaCsRt3ZJ#$ya3eo3$y zz;s67>kW0*unCoz?Z4FtEc0G2#j@VTp`e^Oe^Jk-5O6Lh`n3%3QG*A14UT6sxoa=F zPM_3Q@>=3uEl7G&c9x}`swT<8RQ2hamj{T`&NN)qI2J2!9Vjgh{3fBDwpbgZ?_D(je^RBJ}O3{|`B2yo^ zFoUbtINt0%5$@*)nABuiVR2OwMt{rKc*Z6YTh^7zuD3-dCeHxeOs7|tu>bNfBSA$d z&}Q4#L#I3oBgw{_WLRh+L)yMJ{EnWt4TGkB%?01>v?9RI(NC3TUrok1p_9P=GgXE@ zHr-MCVklQf&YvOW$@!H^9K$>_Bo2_9&Fw%*lPqI>78pTPSAgYz=rt;Yn7w(g|;^M_TKuOMzvJzD+xdh|Q_RKIp+aRL>df z#Urt#_SVoKh~GfB(=)l9F-_6(h`dzYpnn&d`l03ixhV zvT#r3TM@~24r#P1qLD_WOL-dDscvgwyPFovNUK-XMK3m;l_XyHbX>u+;u#~6d9hxK z{y@W=Ty~=IHycRSB%|mrQZe{=nc87%%Lw@aS_h|2n!|edEH`e^Q)AC(#RhyIL?SSQ zpn)6&w?dp}y1><=;>wzgSGCJ*!^(2+GY%7}n`Sdy=MlYqdNGdLg-pUzZkC~A&w!Vx z!;;X-JpY4h{6=>7x%$p9TFd1W658mOdT?`Eob)kxS=MS}embf1^7FEV_(>k-v9aJ- zRnL`(U<+RQPqwzmPLVwrHFqhU`uz(#qCkijZTqEH_nluIDRkL*U zF)I(EEC+-v;yi!v?ftDxpMX#;*9v;9&HsrCz~nw8S&>W576c3AgFBE+nM1%TU;Dw6g@{A^%_nG zH}x&c|3+P0^S#%NS4l07yW!Q{(RodXHCZgL;n3Sjd)CRv3htszXp01qhx=15OeC-I2-#(p;ef zTP~+3zt#iC|24!W{{9|4xZW5PaCDU;o93BFIoK`$55zhYGV?1*(H9*2+Ey;IWw3S{ zTUnyi62R8-zvUwO+t>L2MdknfmxX^hNq9TaZdZEO-&lG6pJ!N>jU2B>!f-xKQ+^4C zu2FXt&QfVmvL4*#Xs8jtKZB)K00N@~10X&!OZT4vl|fk3Qd9c-12vOvv6w}7KSGey*T5} z6wh1zgP=5^Q16GlnlMB0ynwjpIv4ju*C{6Qu4{!Q4~IRYgcbq2Y!ZZQqKq_HqDRRR^uBp{5!`>zo#2LrC?)8(KVo!(X@AgWXmKH*J+s7k?w}i zQ3$t}#WvVqm&uI?Tv{I%hLChR-$L1{M~fn$^&5T+gqic2G76Frk3A#7QZ-7E9NIUs zVFfcpxSK}##$I-737I%;zwr}7X+9auSt=4)Ef=jKayt6@S?zUeC@!I+D=`?dfy=-T zQWrlgICDD=XIM__Azv2$PLwLRx^$@oB=BvnZ(25?N^X32GYdDcN;-I|p7%u1#k3ly z&nyUyyzkK9ihzMay4=EvoEq)tN5pbK`sD*?a@V3+Q66-gj zlQiW=KGN2&lggxLW1Uh|(Grnd@P`8@&%Z(ZMk0sUfqJJcZ}Hel?9;7oC+8`Np3JLr z-9=>?M0tc7hxV{MwRn(NTo2K8|r=)|AW)yh|lhv?*_a4aW z?I!qvWhlKb)IYCxj|AaE3Px#!IK6|`MWOZ0V~XnVBw31@BlCY~te=1^)StPiOX!~E zii(9{Y_`Vl_x*eX-(+^qlz-%qJmeIm(#+S1nt5oHkuGvKO2JeIlM6mAep%|O#8}s! zpRtX1y+3iUD&@(){?t^O%|=8aU|ur&SkCy8O>4PI0QQ{lz+sxcnj6OEs#D25Y>@5$ z_4)Yvr8zk?_6ty;`AC;)%~fasefEhN0WFhh-Z16fxy-O!Oqn6Pnclx!Vr{j;s)>EC zBnVVA`j}SGpRIcEu%30&$qVDihIhx*#+#aQDzU1%{_WF8gKu}d0RSPKxbb(LO0vVt zPyKVy>0?2j*rkE2$7jrPs(+k%YfP%U)to3ob;)WHx~x-hBi~>G_TaNPq)ofWNRY$o z5)$qdr9fA96A~S~j6dkPDB}92=-(rql&OUtQ03d_LWpK3$b!yO{gc}@Ep&2?!O~ZC zYD2lB(7wfW-aU_LJ*Mhd-#sTdj$a}*aI7Y&M%cqTkDv~BAfyR`W>G%p*T>!^(^ZAd zj~!(q$*4-f1S8mtRZ_R`roI;R-Ltp};zFxB(+Fzj4ACza_}L_mALF7Fq5J&1g7dhpl-;hyaRNDV#1Gi{w#sv&%{-IKNFBXprdFit+BKgz!7RrPI!Cua{Nj_hkz z7TO?2@$A39jD1kIOu!gHp6ff`a}>T{y4vP+G-xuT71nJ9O#NwL{>42{jr3Rucwx16 znJl|BkG|1Y7yI2unuPj3diuFy!tSxtA!X_-w-CNX$=^ksOfU>}AJm>WcfJ_MCPW zjp@3a{fNveJL(0aI1_=Iw0%1t%;YME3h$|jhq_xw1Q|lcaVuP%40&YHtQsg@nV!2G zi_#X~Zt>w_YhBr^D3G3(Ea&hNTYe2n-O+i~X$&)3;gulS;ztW+ibB8%T9i9P>vt(F z6SVYTR8b@D-fXRXd*s7J{gdpNBIP(!_H@+4rU4pAIn!Ym4HJ$&S;!C&~X>VDQhAx7htnQrPK}Mf40c;)o5?s%C6eFp>%i!K zvP%G2)E^TQUVg=Bt>vS#@9&8)4y~VG4gozaRwnMlCSTsx?p&&9Cxk zj7#UUBo7lk5`g=m5wlVTuOh2)T!AM+Ew^+0Y1`U2W260|wu$XW+JTJPuG=p6W>Z|a z*6GHLD1+#a9~?_CTbhqv`w*rtH4V!@ky5|Q%Bqh!*Dg6!IZR3F1KJKIF(h=Q^s+q3 z95ls<^yfwDC$|R$sT=ts4sR`AY+cFz!4UH=)1S?g$bw|n2%d9vKWW*C#@eAK5&tl+ z&?v*OQwKpGc1rZbin&5Ll;YsIb7%r8T)xNi_KMsUVgde4VWFe#0cebQjecdFz}GGF z6_ts&cTVR`VoKx+b1tc6m^j`?_c=G%#89 zzCt5R7TzX{e3IEX+z3YtB-PEWy_9l}{@x%MJc4P7RYq%0EaGRNQ&#b&fFOT+Xm1N5l9sBoG=KEe3&6VDlJICI# zL?~tV?{3bWr`5@MIV_dW*Zx#*1J9nPc9?h~$i*v#Q~XLow923n8Ukt+ajk0{CshRs zcu7q1<9TTIJkoJ6H6oa@p@Sy#pdpQmlXz_;{918X3wXxg)Qa{u^Go~&3!nNMuFw07-`3B3))AZqbMa~okHG+Eob59f9EHLa-% zZEI#4kH*3b&&p3y$?Hrb_3Q?YcJ%&! zdBqg!0sSJ~1_)vC&1*d=x|Q5zz8p5W{;hc3o)#shGf9qLbQdD0)eddmu&KNZ*W4e> zSz5V}sk=Ok6a?lRk8gf1>6~-S$HSX?H=6wW=np(MM{b(t#A;463z_9_Qh@e zjq8+XSS|XKhh_-h<#MwN1iLX8&8%E8DOoEzdb@bG+U>-$ixQF|B$mNq*XJ))2PW!6%r4G&ILIBLg7_ zbdl(o$ja{Ez-^nIB0A~Z<%_*P@9TOpnrxE%fOO$G)VJ)T&>Zo7;1aY>M}T*| z;qd4LloM@d9SdI;n6deK^gO7a(^yg#68V?xsrreb&im&HbTCo$D9+s1%5T3rAPx#) z+{u6cl35d2z8M;$2KQU8c2Lj=Gn=N#z~ByPLHb!GVWB6WcMS4sp|wxRpuQvlIC~fL zvxCr4GxVgp?Qj(cJsE(+t-ZL5-^0@LrzS{z8GPtMq``W=4kQsN&Ty~?Fh<63pRrVp zc|W@8 zd(Cg9g4gRYe7{tUHl-aec_(z1P$P2B?@4?aBz1b+O5zsGB1a3^#?Dl-!qgr{ofaLT zB!iU!jpy)0er9oYa29hrufAt4=YL2vKWU29c{f3-kQExEMpT+Utka-Feo{TTvtf%k zg0R-j2nEhO=jF;}i_@T=v%tLV@whB)48 zI+p)}KZ{6X1rdmbDcn2b&n(+$!5^pisN*`~sC1_IlTCrVA9)zf`wGJvNVGoHh%7{U$GF z$Htf6fEIggX9Nqnkgf^Qq_`h-s?mQWCkuLMQbHeZF8T|fr$`NjkOXaA45^-p{3OIF zIMW>K6#(xnNHb-Q@rSLb^&G4GocfWJk$e0DM!`I@^5PBYh+Q1FN}eTi(PE}H7%T?| zM4MN3$cPMpe=QPGmH+7Z#L-Wq;OLJ8d#s5tf00|7Z&I%&gL)$9axv%8A?U~w!u1?Z z9f`0oJ*{iC+=ren(&QUgZ0n{d#vD>RcDYc)qc~Es-OR6M6dzhuzt*#Hh71G#X1)&~xPGj3Gv?4hQ4A8;mUVO>4t6ke2VwZXi!NvmR~@(gxjP-+T4xFI-nI{_PhsRSwp zlx!>&I~&`SVzqY1uTFr&OJe{dH5Ml3jwu{4q~SO;J~Szsv3G-!<`5ztwGm;#Mo6AW z_+FS%4|t4j1?}A4qlI!7xO95Xtb8qoni-1+3b$BOQy_sHIk#G6t4n2_*BeY&0Hq)fx1r@HH8m&cF> zx2q6rkiVSZ1rxN9oyGFDr8y(?3@A>6_#`iw1#fz`H!Bhfm09!Ac37j#!9bgGBbVfjw@fs`*;|29O*%WrrZe#^oQoSgfdD#L9 zUK*$9Jnul_-ZXm2N_8&{l+Xa`#5~}O2p(XTjB#5K$J)_LS2m9MoVzzG44oBz=WM^m z$7>6veH4G7VNlklXxK;ZBuNy7FuIN*B2ws%-u5?@0-(32*t8N*}$h^EJ1s*Qh|;JbZ0uuKvsGl+jS!|GH# zXZq_DOUZ@}Sh~ysbEKGOBOyYr+fu%)fQ+1On66P^k(QyTpundskvZtD>=o7v0IiH> zKcbJSJ%a#xG3zCJ&=q3CX@5>Z1rg1IC{pl(UXlW^&Ys(p`)t%Dc7Ro5rp+w*>+P6- zgY_8mR>u4ZG9{KEN5LoeBASN^i8{)^aEdd~nk0&80842qT5UIs5Fj87M<#?%gVCKP z7h^IDwJ?!MH18ShLXcbstD9(Px6l_n42`+Pa_0s3)tD4D-GxQzm@b^aVY$8w$+LN+ zH+}!5B)bAL+HQyQRnCP=7|7-oOdG1%F+&X#TdvTx&J^FCd1<9)^?I8EYV@c`%&TJbJ>+dAuFbu zcp#*c#)c8MYlUWU$8EVCfHumH#izWL^}C2XtG6MQ9PQfn04h(S>)x+0cMa-1>Yo9` zJzr!*eP&FalcCMlf`Ks?98lZ-$JKe1&r`@(d88fqjjx5}tb_#l#i&AQV2|})TM(P_ zc&9ZVBvw5!ikqc)UU6lKi}Tz#Q>CjjR}(a+uy09QG>we~qcE?$PW+b^_s|~db3hyW zG|#cE!x^6}qTad)%hUV*Jw_bg@S`@hTXmR`KeZFR~ik&%gT9wwHyeV~)UjPDJBiTqvM{Q?Ly zx|c~KK1X{!-Z>LjuuV82_BWlrf0zgz*ec7J{R6DCAQsevKHuZpy2xh8ssOzScBO68 zG`;2s-qZCO$uO>zJeD7S-W+7QMRY5f`90gY_Yub;zd*f$Gp=uh71%^wPFVyN;z?+> z#s}36f(6_!_8rHf+%y(S0_aw$p>#r+nUSdMLm* zPldrK$J0nzuNED9xIh|Pw3Ks$*PwrAbY5J?2Xb7R`Pl2?Sbu69;{Z1GM*4nT-21kC zL;Io2?1=qR$snNpG|4?o#jI`WPd(=4YsMSkM!))y>yPS3cfUM%;m)zpeDY-T;97S& zy>}7mif66f;V{Eoyy=kUn3Q6icXs$fj@1*tu@V2%ovB0iMlH9ZOVssG9$i1JTk^MD z|7n$OJ;AsKMoYo_O+EPOaa3&6QG2|rrcg5s3n`+!Cb>;k9%hBer{^z9{-xExVGM~r zxc}Fo{NJt0cOtgjNfVtG+JG~d4G=WwdXqI_eP>v$ zzEuIr#~B4FJ+-l)xMbQutZ`;5l!!LH1FLT>6pJe^5qa5Xm9e@z4O}#yhB|H4PWyYa zlwk2ekMrN1gSi@F(#;y>VaD`>*kMAGOri(J^^~Cb(}Ws>y&JbCeM-JdCr#(zh#?py zK|`k;>{VB^lon@I`{GotibPco1=+EOi-05eG%^ttt8oUm%rc%0PXQ5BAHs>Mp2})HC{>|vQU*g$0=>~Av zOy(ynTz+$N-@LF!MZf7vpQHZSwT$sNDbjqQD%7svF80PY!i@S3w<4^+S z*VmIdc`$+Z4~)=>AAEv`QEgQmcX(5HxA3+L@X+Ud-|v&}kAh(>0(o-99^_eBLl#146dyW;h1?;M4r+QEJ<`a}SzV(7oS)3O{t2FScChLsEdFomq zw$iUPqYv=Hx`?snT7%20x|@&5U}r_Y5?SrD*InkJhsAssW!X?U^fOmFMRlJXXr*@# zFXDAqzMM6_w=o{Lx= zCK{@?4)o)vH%44gy!w3=Un$c(i2QXS5Y#3&hPrn1>oLUk(Jnw9bJ%>&)M((!qJ*|U@hqwHl2ywre_x|^% zaty9{=H4(sv>cRJ4ubdQ&%7!`G}(6Mr)Qa&!=9INjKd*spG6ftpn(B)#$9IO&)y?Q z{23dyox3`{7DmAmKF`D>|Cg;swnKIakpdAg4Rm8sL5n{;XT6;H8NF1$9xmGP3&-14 z=$|l)#o1d|Y(z?HbMtv1hP@!rUW{gZc6?&(vHQlTKtGX)RzH{)ESrPOh&L)z&2ZpM z+LbOlYk6MHwZ8>BJc+moNaX_#Cv~QEvQ|r?eK|io4GhXVT7QL&cJ#W zS8uEZkSxul$>9IOlYZkU8EI5QYiya6YsTsN-RwtzP>p1n^~?klwWQQ^?E&fMMZ-~0 znH-%9i(!G7E!h_wj)kohzuCMbx6yfxz=uco_)qulvKa`GxDq?v!gf8#FMngh@LjZQ z5U~dHWtft{I>r7zWd%FJPV zNX_z*xVb0gt=k{7pZ?H-LW57a_yc5Tk)vNAz+~fSN?ZW`AQpCJ)|YTN+ayke+-mv; zBX-szj2!>v^%%cTEJf5u>`yls=L?+A2t>uRcneZ&4ElHnejS^{AE^rpWS>U5%!O#phNTVw?5*g=w zp;`OyCU!xB;YJ3D-sskK%N)A4PrSKC1^(&cvi@>pN)y$H>t+f9R|(6mh9Rh;Y)#n$ z0uOa=({2o(?TOl&>ZkwWB1X}8qn`OkQ=C5!HmhT#`6M(>qH0ehOI!^v9yai4U9_cH zX`S8_%2QqhLdY>?O8x6FmC4Wz)GsDO2*Hb8c^)D5r5|6Ymacp7T$#cng*QEir9j-_ zZcuTVr~pvblxh52#*kfimK0q`Q|1UT-Z>*Z<=SOM)*xyjPIJsgofW;QEGn7UNgW|% za>$fWAi5aH@jQh!=j5Nji1)T^?&*UiPLu>md*hiAjt?{`dE6zuW#6@qk#~V@`{r>z zt&Hh{P=We^m8*W;b=P9}F0<7bo75bVQv@0j@XOo3Xk5y0V5t=vxF{9Yq>y_3^~i+q zCH*S5xqe<`f=iOS?doOWO)c4UIqQCBD7QRkMS}u0*RE7aG2qp>L%>{VeeZ^PT-D*S z%4VwB|3?a*slTwv{1@qNeYXN-7~=GJ_p#&VpFm-xHIdqV-S!oMQ+C_~h0bCS$~F6^ ze|6jC*(x(DLeYue(vvJG=~L^gia3@iz?011|1H?blMsmH;;eqNkW@!tFgv)stdy&q`R z83i*`Bj{>h@gHVe8H{See-1ep{n|LGbKm}L)FPNmf%b2+S?>z~3(_az@*01F9h1MqiI#$CG&R7R`;G(K`5bvzMt* zE4tD(E`i9^CCx-L*Kd6toGa=4OkAPf4xqNOU*x2}kt5tL8t*mkdtCGrdt#cc|L=Mi z(hv6fp=D8Kp0x=e#WnRO^D(zHPYj=%Ld1YphoyufT&)ReKYO4>GYC>0!-@0_y*GtG z?*YXTeX68v?~{_Wzp{;E20$|0RXcw@Die%?tC0?`G~8&{wcBmSA5i9w-RILVySbG{X;sn?;S2C4Z%)&w53zs0w_ zKTL3b8OqDeCW}n=W7>7c-OH;~P`%INPIq@i)%oSZ1sincxRFrYQd3>25(CH|;xJeT z*xdiYHpUpKGUe{WRT_G>PCrfFEq&j{mVDf-pdb6%IE|gZ!*4WBua5oJ^3$;m$JfIi zeYT*NJmMN1!lv<8;KBFz}v#+X2=vq-a2r%gh)x3_s+RqmzxFY&_XU&%n zZ$7RAeX18+1VNnhjGdMGBOLM!TOqFqhM;bY?%r=1yaNzkJq>Nxx3aFGxTF$|k#;3u zxx1W%H9|hs8)ZqvH)C;KI7|m%&B9}XH+wHTD4)I*rqZ4v)e$>aOO8(?DB;-^D4-Gj zq17x!h-He^sY<%`bf?UuJMnedDxi{UG$nt(Hz;T?Ms*kKv3pvhj&98-5|s?WfNd^S z*fCf-Y>C^o_);;!{s8CByTYG9kYF30G+%|~zE0r602OnP@T!k@Lp6eAj{7;pPjx*; z2gFI^>?g!?*JR#qlU~|Z`&Gsk{@;cS0S>8VOsqMryo{n?fAc{Sz5_^NxmxuVn}|fJ z+utzkzy^l!d7F|`&WcnW>3UeA&*N=r2ZBY&Wknw|Akc2W=cX%|j`ZUzMPNj1h865T zKhinhFqtc~DZwP*jBB8bo{36C>ip?U<80W&^$=ps3#y z1D9tq#OmuFpaGt7GX=5G9=Cp!J6*CARJC$>?>}y7o+%hRtI!8(0>b)dyN7~K2l02` zQfQ?zs+PaX15ROg6|R?b9wxO0ZqJDPo&00kD@7>y?%b^EtzE(&N@0`q3|cA#MwQCp zR2V+3vo>v=B+6%xA+iWf_x1&(V3iek^3AQPBk8%ReW6|3-4M;gL(dk=FCEL1KE|0A zB_mm9)MgP4sR%|rO&Hb^toUx^76D}Z;ma`n=$K9?#1#470?bvS5VzQQ9&lqT>K8bI z2GKa+&ioDW(*jO5yIG~kA~b<=6#J!v7-_h*KG@Ie$*FekWzjxq9#eV+2L7lD1ywko zkgudl_a^tATiRzMAf>0UwEgksx8DT(onyJXQtG!qIZ)JSW=G_f#1Yc+dxaenF^$%% zPE=Y~qgk*OW0pVrOl8-QhEY>P1U%A|fB(U-f5&@{^)D-SC~*TOM{QErDg5CdNK_M- z@taPKcYO5erZF!p%SE9pOnt(y-;X;#@wdQ7?S0~ZSU(0mrBY{Hk%n4XR1(iv9r#78t4K%Z4!sDUld04Aop;VytzIe@#)&BX;~jez%(^U~ z7gSh~GLDxqtUm@p$24fgupX1Tv9mTp*9qyoTerlR7i8A_XC&(XdU-n2u?tSglF9#t22;r*CCZl-m(bkh zz>7TZ&fxt!CbQ|>KP906g~ac;!%EDTL1tD7(+#bLJAzq>ndVkeTlYy<=~x7?-k-l2 z`MUYNb^Bfp5r_xUP5Tbj?uVcKQqkz=;LFtkA^)!MINyp9?|$)L?QTFnv+_5f{K}Jt z^_w2i4`-G-vJa6rq-?*yGYMaSpW}v-_VxO1%+9g@;asdp0S9t+K~UWa`*q0bR~J&k zhI?4BRwrACIt=z*$e(Kt$)H9Ln~%WKu{N)}ig%%{#0GvwCK3{RI>)#GR2ko#b1^ge zA}o%nKc6JjaB*dqKyR>L+!AK#3Xf>7pq%o89V~@rv@59>z!_R~|4FF7sH2@4i%Ky> z+V2gqf+tz5_{{IZe-JE$Scv3`Gi$rhkE3(qo08OwPB&(kOyMt$E4zrm%10xYhSh=H zs9>MfD-D<#l}F3wkh0}(?UpZT%4s`Hcc4dj9 z0}7MR1Qf+u(kJ4oPoalY5KE-1;*$r9TJn~~_1S@|fI>ZqL}e%Fv!P)z1wK{n*sfaG z_NWC~W~iG8L{w(KO+l3IJh`Oda}Aihrr4F58@TVes4)dWUM#czrs7L#RtPkU=T`Y^z*6lDhW zv=R+$KR_1Z#PHQ*uqd=-aV?R81dR($;+Iu#c~SNu#Gcdfyvs~g&S!hrI~UI7+Jp43PgGOH7b_zift2Yuda=ONoSLy z!=eb3%T1TqpW_kvW((tgr$suB`-Ct#g_f@`mxH&Tl(N6`v(CWNKs0umdm<2p0P8_Tsgmn3OQ^#Fo+Yo!C#GR+ zePRcsG^9*$F5eLm8kP#5+(>+lFzLRSn!bEDyt=coPji-Ugz{NT$7z|ItWoG!_|3J@ zo!(PZC#<+55FTW<0DH1fs4PWp8f#n9-pXC_iVXm{9SsIJ9;p%&?QSki?>$fM@e~uT z$q8{(ERQ-Czp>}-(A(YTG7d>{dwKTI? zHTE{eD-cJ8)b60?0pnI<-(Yv!=q~H9;_+qQ3h^+$GSm(ZevwgAO1SM`7fJ8tHx+_)4SvMyk=d05lBW%p?*b-tQ$Z31%mtMi zco{P{n~F*!)9{B6iPw&*>lRO+JX163ZviKiX_q;8WgPt8+3tpaT#|2~k&3?36(_Kr zc>sSeTv)0Yh(){}dpe-Osbg%sCp@REc|83psECsu)ReK?CIIr0sf_rzt&V|r=e42G zV|AaRx3MfoxXl#Si6uoo+2KA_s8iMqOa_;g$ddqi1;po29qHP#|nb01*7yo1p6X?Vd0?@1{VlYT(l&HTG_IbvmU{?Z`oCJ3|o)PW0 z+VS*T9N~igUDoKg?6+^+!x%T|8NIDrS3iy-a(s{mI!%*>B{G;%iEJbQnFMs*ZkJpm zyMX~GH2;=XI=2@(p5p4NaQHkjzr$cEDNVEh{f0!v>i7n_?W$kwA~xvq_&Ds|4$ac zdu*SfsEn!)jcV8Nm10Dh?L-$|8~XMtvh6%$0&JMRg9F*}h_83IFztM&?EsyQ|r0)$P<%ESs`9+lYEj3SbZ z;GR|(;eb?-xuLVrKRZ_&GPnrxaXS*%U|#>3$;SX1a1w7wq}ha>_}vl@Nt6hF1>gE8 zUrl+!W;R$F$*%(YrOfCcm#nnWFu`f3~4BxO`lUG+_<7>v7njL&R z&#V9m#qhntLKQX%cdrI|l;5PoGoz>#1l6d7Z5Lta|G}nng$u?RQqp$e>5Bha@55Xmx1Z^@DqU0Jp!v}fbJ`6*QWs-F=^0FU0`mjbm29D;c-H-m zS`~YgTLc4&k7Lu6rQgsOE08io$#+cD(h7? z8)%r&A|4R~b(gO^^8tU)*egy0zDe0)Hqf7Y7sMGtt-lk~Qhe+4*CSagQeDcb3>TE+ zdVhQ5*AqFWS^1fYZN+&0{gfZ3c&e42c3xkwr4cxnUt;ijdG=3DM z-OlRW-!7ikrOuD$?v@*1Gpm z%eSdOUE9al0NP9i-$K!dRosjdnmia>BObgzfl6H~-_x4RfUR59%E4RP<(dIMoaLq@qL^Sj1xAQoSgm$4qjSQp%!pCWjPE~-HP!S<&op-pC+MHj_OEWVk5FZXjy3D3dmNu~FcRivj-gS7KzxyY;ymJt3l@dr+slw05#Ahg1hHH%Q?jC5_82}r}Cbn(0{NSa7w|n}^?NJNEd)8`655 z=S!dO{b2-&-|Fx*+iG|B+Q-R{Bynt|dh^)vf7tr~xDOvqW!L*ZdvxA|Yjge5-2xIr z-ESV0IJ$6s@Bj48&tsF{WQ^?oXJ~qP?G1+U>O(OKn#%rUHWE+f_4|V?Q!wLGz#mUD zE%t2xXR{55gx|iGC;w6TKOrE(-DTg?(|=A54!=E=-^ZG2qIfd__l-S}hyS@@z1le? zAz?4c?N}ey3<}S@)uUNCIyy z{w=5(eW2p6h;yFXcLvAHRDwd$ciyGddWE+iBn_^#SAI8$zYFBOOb^L6D? zyauWdsTzpFmp?V{+0)_z%X_u8;{hZ!OBLfOQ!ir{bWxhPkKGw*z2Po;K$+fms2kJvVH>L$12 z1LkrQJg~^KV~7&x7#gQF%A_Q&=*m}8AXS^e4!n*IasgTeJ5ii;@~22@Xv)G`00t9xvQF^&q_|(4 zWmmB15oc26gpM13BE1zmED>8TVqQ1y&pj5TRk!@J8;a57d{>{n_p$KH}882XzW3OE`~qOl}Z zfP>;SaS;A_F#mp97{LSG!UKNDoT?rm0~0+oB3kZ1Ca8T%xk~t60PExLryGRcAB7_e z9GwVLfAmGaPz3o8ij3WBsY^DTr!|h4gS~ZF_cSWE0nn=xR;c93fTc?v3AtV z3v1Y{i8h3@kBoW7kR*#JMW1mmi&G%bP%v#QJ}Qh--5SgIN5qy(n*g^{HV@bIy2P69 z8Vz|)zxD=MCf8ZtBasOd1y0j)x~A{mo+c)3HSd&N=lAxUIgD{*p4tTyT7_(=%*QGF zqbwjbs`mHwMdY|0+?X-3q^vqRcrBYCl-V@WOhlKc#xOpu=P>vsPJ~@yv}rFL2mWm* zilr|7jdn*-u3-2VQZVrF*9mzgUw$@6BGB$Kz3h!Kan7V{y|Pl&^_T5pdbvRoVKnX` zb&6HeuJumevZS!$Alx9muH_%fIUW8Z^&aOX9mXX%YRj!h zw-0D8C|~OW{1|BSuRF1!ei)3TnOdPBHAkAu{Qk_ifJ#x5f}!wue_ZI(rN5F-#<6Dm zAiWGtZlGgDNA_J{0kjYCqdqG3(KDpI8gC!LWH{h%?*i`7azEkn#&;*j8!XNN`n71H z2;KH>B#-O&xf@PP4TQu|3K09}hpjn^r3F{iR?{(0D)SInvy&n6o=p-rhU;Ph9_k#- zS=RRXESBa)ua%q#RhhyAVDyARf#_9ou5x=J-g&5@9C4cjEx0OQw#m*5{}b)^>EJ$6 zKCAyl)n5k1)jiST@Zgrl4UUsef6spsKEtctyJx!7@&ZN}Fa*`D4-M={kl)3v--@3HhA10S;|Dh`tBR?`JE>Mp)yN zfbDgL=wp&-pU)Q5=ya_WL-eUoG%`s^fbrG+e#O%C?e(Q?=NIwiyYC_)`P;(?{g(aN zJd*AI3{`e80th_Toss;n=>xD!bG>bz&;FBLbAq0=?meBt`7z&%CaNaO%zQhJv6-O+otS@r#4*~uV$kig+X0!}x zBa)B%MIZR>c-(V`u!lrd7jXG7B1)$Gl0d)R(Q{J2Tz8-%1P*=sOVIAM)zJZ8AGsuVun}ErJ)r za;16J3F?|x#sM!t&jH700kX$%>Z^TnA5^lI6P@)&0ZgJ^jJHdSz0$m^J-*|FxL)&% zZW6W^$J%}yW`OLp>xD-ExsvbjoYSpp+@Se|KZen>vH!;#y{i|W*zDW8KWpc(D$cXz zJ%L>#hwJO^V1J>vAxi?2Jr|FMbJNQv`Zweja&HD!pQVngpKteDYXaV8^UALipxu|W z9^$;Wv8|oXt!_-mj!TcLbW_L=(7Eu#dRlihe(vLVpaQj$ch9N&kA#y>w^*KtHRr0- zZw9oiL(ze9r3l7g8)#|UiHA>w5veU;7e06{f)d80mo@i(d$^F?sZIz*iZL42^hqzj zO!9buw;}zcEV2wLw;gJV31}3dmj0A0umJfXxyS(H2KBpuCl|L`i@%?SSMyUM75e@r zTSQJkpn1^S!>t-97M;M@C~GE>4LFW|_|PkY9B;zZ^Z$2H#pO_2TFU;HI=>cnIi=<&sGil$z!Y0m-X-Np*SK8FJ9;UkzF!c(;oDJ@~fQoU6N2S=ZWmtBs{ z_ZdoFxnhJl&^T>W!4#fj=JmlZb2nhh&RF2)$jPtDS|JO)u{K!K_NC1*rm754-4k-) zhgeX4*YA&|wgU0S5^ZymmT0iJL@5dK4`D+&Q^c|VxZ80k&n4*8&a-5+jO)o2Z>u!jGWYYE-Kxn8a=Xq1be9u>u!tCRJoYPeJBU;3Z>ab}2i$Df%5h|4;*O~v69Q{!*7G7A}+3L5p zWs*w~IcBaq-$dVv;0kP4#WjNbq(Yn-N}Q6s(u9`vCHI!euxNt=_mU)D2>KErzp?b! zx_0vk+nHfveqiz40SR)pK?r};q}9OB8^sJed+#9|9+}Als`Q9_v7dD(VpN%hKrfHP ziGm^fZ!ACbb551k)W7eO*}Gcce&3}J&H3&6_TdKzT2UeRwO!(qeTZsI9huOaI#wh7 zzx6f^qOZolAExnUhepNrS_lM`MwxKp@Yg3u(nA%3AEF(!S?_3s=e%Gd!?g~cos0)x zfBoj8b7jTPZnVg&03aa-)LsCkCAUPsjB!&v`Q<^V6jSr($txv*NQFX>^xqceytE_r z0<+@G_K$6X)TBMkv!CXG*@Xd09j6WBm;VWkhLL$QwAioxTIxLH@dOKQ z@jp(y8-4JeZgvs>2Rx5T^J10#j@7SPJ>J#uu3pa8TK76{rl6_N%hjcByf9LC0$zvp z@U-sR;)j0xZp?s={X}`EO)v0w==~Yre!Rrxv3AdszV|%>zCqv(NR<3PP1E{@hG6Z^ z-A`@rH_?4`;kemJh;Qu6p~QcHo9%sE-uAE?Rqu6k81NkRf0z^R7h9~8XEUmwuEQn1 zSZBeavzz*uu_PfP2N`Eh_D;z%!)cLf6i~9ENY26~Q^;qn#(_d)izsjK`aGC8^)+e~^%eIUDd&TjGd7dxdPZq1+ zVKVCG&2Q$*b;}p-?%O5p9YNmO5z4iey|c78#@K*~!aDmof#-wfFN%u?EwvlLdEQSw z0}D$Vfy_OZ2tr`X+z2*f;79kGs)6^%a(O?#6}Q)Oqq^MQK$iDs_33%ko*96f*L81k zy3v6T*=)xUFW@6L-0Sh^d|}cE-btUN87*uV&eOkFQ8L0rqD6Y&6^$NU0|&b zoXE=##%|4;V;{TLy7Ly3yPaN`vau^ptiUnD#KlV7SypPj^MLpBV~X+cK({Gv zIT`UVYit}!nzgu7H{iZo@Q$cQL=R_{>l@JDmz4hB4t)K{|GNdl4)>kTFFgovOBlYQ zTB!n`+1PewApywruh7!H!>l(vL9N9-$NRI9sT82jmy`O=&S($6f2czDZKju`%qONX zahomtV(WNLG_n|NLOzD-_=?D%VdKK31jzaFYt`c;DX321pxs=X0BP;U?oNDSbQ360>4DnH##s^t-azkC5&5~%cWm!_e{aC zC7i!DAJ%yTt}Bd~?KvSeIktigwbj}S18bH+K<_vu1sLaBKQV{WsM`gYOrnaVNBO-4 zphW)j!X9oiQ4;izD^^a}hDqFBGi0i46ExddiSTV@xpi|c^h1m*egHW--D|A1nY_S{ zbkmfj4d9B+-)9un{hI-hIM!a!G-Kh)QsR-nenuSFIp(<$t9?o@GlrC^KDRxO5lNE= z*djvw3GJ zw>tWp&21bA4h8;oJ<*(s@oo1>k)qzCDv#&5y~Uf}<{utPDM3P$zMSuzNYQ!ba+&O- z6$A_F70*I!rqvOq|CMzF&$ZVz*T|^4iwHCc;{21ygPT>&O*yGvYUX_!&ThZhl>#?K zNi$bE-$309HR1@4Z+32TO|;T_?Z#??{Kb37i5^ zzu8EZugnnE^V9b4Hq6D{gE6%cQUHjtpPzd+I%=_0M#E*m$V`}?;h{~Gq_c*nf0l4|s7tkk*v2DXp z&QC8m3ISScYeFNk6_A>rgtQmNF+S?2ltF?Ko&g!1Ar2kh2ae(LezUzNN01&Zxwhm%wH|F0yyvhXC~xYrIpT9NNn zjVy6V7Zmxrd(a1s%R+??n@wJD{l4f967cdus-o%p(o!qE)oLd=VSc*Zm~Zd5wfA1W z{r6|;i7!^C)q(Wzh99tG1E<54WuNuJdWV-Mf)l?RtX;V7t6^g2heO~$$xDwfThV809wu)={OBuf zBp_^np!@kCl8BI^M`1;q53rZ_&FeiUVqyusyIPF=Cz?*;b!+7NlG^iL>lVBc74>yu z%I(1Tz*psL^cg{{S^Phk?YaLuYduQ8&Tj;+=dA|L)o!aPIxWYY$^Qv#9Ktol2Um%7 zKH>#_MiqGilZOL0S{=#Boc~GR=4@|5&n31XI;2cgdY@2=-j6C6GLCB@-MH(nY@&iK zFpC+i8dZ)LZ__g5CJu+o5kQXIF!BZzKl+EUyQQ5H;+m1YyayVCm%kW05z78duS+R; zL&nB$U-*2-rAZ*^BfB1CCL8C5q;$3lAYc@cYeN~rprJI&ohcfChjF$Dp+w(AOI>=0 z#`P|$CZL4*-f#xqW^cAY`n3h$P+A{bfg(_Dr6u~e97S_1c5fzkNHpJm?${1IY%0G0 z$7}6t5LUhTC0ign-}Zqk_u%W@%eU$14J>GM3e;wro_ta*4M1nh1vISJQ`*D`c2j}F zg|*vJ|0XV_n6K|bir9Rci}Jf8)>@40)w`T6)tv~1)s5_tyOzis-N`ZF?cz7xH0Md= z(g?RpSUG(AuDp?l8*nN)RIw?Yz1bC3a=zqNoq|#<7-zKk6Y?Mo|sE7zll}U`0cv^u| zF+aIk%onyMI~Fy|_WQ77MN)Ni!2~iJyp?W|&Lp?-NCtIwD)w?A$qv?Qrt8F& zI2P9R@yicx9uy~P&M28dI>r%Mc`FHq@C$pS=R+k1r71hP22OKc6xnc`Vw;2~nh@l3 zlvyQ8Ptx*q!wXi3VbMyBrt_OhVU?7vpw7OFy)0#n2n^xI(y_gCK-w-kEqb;)jS@0; zg;K6*g8VU-x?7uE7>YoL#ufz&*2W{5gVf){Ov}`xtg56e0N;pQaM5i^qrj3Q&8UrL zaxA)!7Sr!=v8a&PNM!wVb-+P%Lc3EA&q*nKfF|@gu{J7b=un5I-o0Iv5V%q!tr;52 zTI(-z{eeKpUcj6pJAB)uN0!eSK=V?{@A7Y2l_K>Ukr9_F3T9Te+jEr?N`8eKZ{pw0 zKsa!fYQ_5Y=v9l7@>!2QCh=-?DHa5%R2fuZ*sS=l_ojQ1)f@G5obm z5BEi{KUp9Nv`cj3I^TnuFE_v26`>n7i(M^+gHAMgv37B=S|U=bSVm z-PsQ>8fHPxUZFWDUR}>I;GXQ}nSa)s;8xQyZ|?Bpgz7A;IbrGX6_S&- zy#0Fqe0m{|QY!hHW538(Q!FBDNeICDM8*hgf1KYhKWX&0=hJITceCaFDaKB2b+Lc3 zQrw+jC}4KyFO6_T=n@=}#1tP(1bgl}mEV$y64`0k|Kg?wd32zS{q+6t4&Z2AH(5mlofB(xFK>`hQ(TzR61!|I5m2F zg3*9?6@>)RfXhxj5Nawmkr zhg}PNOCQ`HO5XuT%Z}sQy`%Gff($Icq5ILoZmV1P^}RnPf>ZlmfxW^Jy~5Ga)$MzI zfzo5uy`#Tn@vXPFhO_rJ<(CaN9I~r$ndhY3x4JOl55~{C`1RIvB>}gMwmId?uiF@} z0FO;CdcgL7)jsFl2zs*HjQ=~wIW7&0ttn+DnojzG0BqL&^zL5YlfM@AVWGgKr=bi0 zPRC)f4FM=Ws4<_V;V~s5$62?5<&jGtZi!DZ(-2Ucfam2d2;onPmuSJz)E|;Wn}u5? z)w#APQ~-X3=T+hW;xvO>JYR5O+`#WJvdDMyY?A2A-`~C7x9aWpKJ_O<66DvqfrmwF zC!x9SezN4WUOyuJwD%u3Ctd>miXrp)R&|Z{yF2KN4?HpFyy^IinEJ(`-@bL@DSyk* z97`pyC$;2M_)QbRY0Vzv^%Zqn-uPK)%5&$h=PifNWnRFQTjy<0c2vg&dA~Y=32E!_ z8i{AGJpZ<;-?VJ#Y8UyEX}BfHZJ>*;`b=NKlr3Dv7=&~mG-(zNd z*+`1gF;a80nloWdf{sGeXl7rJGlg|4rJP$SBqk7|NpdlGWa*)?KY;8RT0PtPEc9@B zmbq$4t_GEGOza39>-wnumnAa62!%F929B9s0*9m4T)wA=bwpz zSKYTm;$BE_J0=$V1ZMicz|H+8xhTDFCI0Hh9vC}TCnKw5u4=V)Naf%iz{eB3#+vN3 z;7~ERc(sFKk&{?)tU>gpa5Ek2Lje+MF(;vj(>`06uUPxF!ur%K1(M(FKLXkXg18r} zT)+JgI6e-tOk6rWMSY6JVx{e6^iKuKflsxYb1N@|@0(-v^3kcbc}_lma{!i!YvF_) zv^~BQ*GLLGVJFZW@YA^(0V+^`^_?^_-L)!^;L2(cGi1XPQ~L*FdaMu*+YGY7H+GMM zt)+9Ekz82xWeEL$CFlUCKG|FE^N3LQB2%v+TyifFf#G^UO`YQFyiXa70qqVXR_snPHKG=|V3eNzF6$y`;pp2o_#Xwmk+1eKu=F#^$y3Z}BAwe?3G0(_?oTqa%7EfvgO07r#5_#tRrdF-&`7l4wph)?s z`+_ExQgJR_#b1OzCzfycDAU?NtA<~Xo*{up7A4y;vef&VaOQ(^OpT#RRw5YU%Y4rY zlC>#EomU-AEXZYR1_$7N#-A_tVoQq=rdlQYg-4r2susx~&k1W#PCCQpU=LKYz&w_W zAe1%YPfSmNJfC4wRb=&JVrHNmAThYpFEbT<=}oqcBuxo^goL>lj*Zw&E^AZzTPY0c zV$dY-)x~a;Lzf9#_^o%&2wvd^AJ(C#R>8bPrOcke?}VE0+fpH}RD;cV`kso?wHQdp zN2vxxU2GG0r#E&bGgOf@uGYsgNaPx$tH<@ulglK(bWN!2*z0k&d#%j%pUr#`EjCf{ zmwD`-ii`*v61a+DNqlQr(;8CvN(WojUm1((&}iB(R$C2Z0tb;iaYrPT91MBnd1-Zh z-%XDV=mJxLNpH@9&Oc$T4XXIX?###NU2GYBaOk2bjoHuyT zW*a@fNHoi?`y3V)zukG|3Tk(*F4r}CN8~!#q@iLK`{4E(#1s|hc$iFRJlpHWAG@!1 z+W1%84n5Hx|!uwZ5=v$9Tv78bgER8he@?S zV6cwMe17o14`9G42Ao(-aKiOOwM{WHc4(@55dO77r)E0due&ojGzC93`^0$Q9VQ?S*;t2O;&o zyKC!3eU&Ts>O(egQFr+r4&0xu{nsW$19=W}?Os4OJjh!dHX;uW%-5X;KJuM4&CzX% zUJc^xL0h-{1>eEiM1WD)Vw0utiLU2gd81%`$F5KR^$3mb8`Avbw?rTJldf(=-)`ED zO0wAVKvx+cUkgr=7E(d??dx&25x&@@t$;IIpQPrk6gB0-~=<>BsA?prK!3c6|~pWRdu9*R{J{7vA8a61L};3t#Av=L@k>9KF!F z>ayQ5-t#ib$X*<)7qk0?P6W3SU^lq_Vp0Dx6y%R6db?k`Gb_*9f3kJyoqf4%S`V#b z@f`bKd^@s?y*`Sg?a8g%2hB>U@v_~xx8BV+xGmu4d*2bQ|E)@j-}9-%y-G~edCJSN zH+Q4s>hcVuPomYXx9Z|*;RT|6tOS!DsC++$$Y(n&EI>(XpNG2~0M1!%w$+{%(+m>z z_qjh?4sb>GKMlDU5@hX0?r3q89(RNbe;Uhc-!)yX_an}|pA(Jpx#&j9dzeUBZtzDj zMMzCez4BdgbuB@^O4RGl)V&sbX(`8n<=ij4xzH|4}~9BX_P4^*0Y@EascjO&=8H~ZRc(@&OBsBQD)~~XYst8wLk&DkKyHTBb1fWM ze-b&9s?+!;ofMqAwxA~V*je9#18(8;pja$nOa|})g2V7~5EozV3M854sU_`I5bf~b z3Yo=!(YR=`9NV1p)N6%Bdig5<#56@hR-4Gdg-O$Cw4gyTo%>BzeiTfB-XO=QVig}t zV@BAgk+V-ZU5PGfwE$15-CnzqSvb>q#UhQC3r z)wcafYrVveT72bCZ#G@jpR{}7QBWH}GRid!BY7^Kr?Gf-ifY?QbXCZTW5aeS5Y)n_ z3nt>AmyV>5mk-N?-{mx{VY3+J`ScBJnx7L-0={+p{CvvZ-j}_*U8-g~Y|NacDf3kk=}yk4DKk3E z8DG{2R^zbjxM8n;IfN3rSiK4MekVJsrw9h?9iJ~e-<<~f4A%?S-tW{`3Yxeg_7;qwTGQlGy_Hhq1>Ozr$l%O=R~c~ z1%3o-qMWOlx+t<#_)BNvE-5rED;~#kCf~lbNS0H{eHkPBJ3qUqcDNY?p8&WA<&8W| zCY105o?6Ek9pBd<3Cj6~C!9LHC|$>@iYmC~4tD%~WIrUr$o=MPhm0XWsA)FXwb%b! zTk^A1_1A%41c+cb_%778BF3((F~_$fVO9_T!7tUXuQ%zr&PrO)iF?)r-(>uYj^`r9A|kYgnA4Dc&wmp+%W{SJ{XVy{-B()7WqhS=44uecW)V56vK_zC7(8uT_|5M#_!mvl zC&^aqI^+gL(+!ZiAr}FHZxBKR(%p%{)YV)FjkO16O8;hep2rhP@Qu{z-fj@Jc zaG;ip5mGDo$Ew?6lSD(w%tTs^bYm&J<^oh!>wZyyaq)2F9R2iAi*n}lPtbFnpvQH! z+Bpt+E1V9<^E&8*REbIp53ICBU(iP31L65lH?HgHUEg$HoGq`_>SF$cJa(7cc3I6{ zH1gzU+QP<6fAzo6;j`)w&7pBlN%NIeuAKhfH)w_z#!UngDdiN5Y7S@!IH zs_h+)A-=i{6D9G1oDZSUXI};%Etu65?)ctY>iwS(sy9nSqI^dSQqU*`Vf zu9Cdx(1$+qXYv0QEX{U7&ArJ6liapzzdI=M9VDwyLtcvF{`1@lOi~sh+`19o`neY; zN(S=TytypE@A{`tH1Pi<&cor3vnpJ9m`OC2?O&cVZ3;>~){8EljBxo^7xQ)iIav9| z)u;piw?@vIN@Vc3HrXfgY(FWU~w=09MXXzlW0JI0>MR z<^=0rE&w*~33>CL;^%w59B>{NeTMUYQv~nHDf{U~e*)CB?V>(IL|-U)?N>uEIw4)2 zL+!QwB?l|wzpnJRd_`UdZj1uIbRV4Y*@3@5WW5&>vo;^RpI>qyJ9U#Md#*54OqaRx zZOwYCR7s zoyJ`Ae%2tT`V^9a_@T7*4#v=9(QOt-5prekGccDLcvb(RKbI6ELc@^?(Wp#@ zP3fS>+bnpz1H@4nyr2$^MJH>BrOvCQ$j=v-tj-xh+`9C-e}nkRI9lrCcX%c}*r*SD zQr5R#PAYw~v1N7^A>ID>%&8b?ICvtON`r_jz#)ZKSJF~!w*PG^1EYv3xfdHy-3x$4 zicxq}!6|a%OrZD~UK;7BMpao1r-4MIVSgbLsaEqYecIAeRY};JA?iqAlZdPEeY8uZ zq4n8u@f&@-2_NG7-}CFrt?kmmpH{3swGY#gWp)&1h}|v6fzb&kxxp!sDlk|dO@7?+ z0~%O;w&XBv=|sb=?)zL560FVzl?Bfwu>!-9e?bHd@QEZ_D8z|0=_duT39+}U9z;UM z;X_SAg1{`u2G8v@TPd!Azu3c@or7`3Fp^9MpS)fKv5+PkVozya3gPmyZveLH$&-xv zlrXRpZuDUkEZLGjG^VB}dc0A;^2N&(>+@q>X(-z(>H?9f@l;@8L_}rV8;1|M;4fu4 zIll3!%>?KxeQ|PRUe-Q|TflAYu3#FbR6md@S+%PAFC^nuO1u1ewDnSt1-8mw#E4}M1Z7#{8$kChLSV7=yfKz2#Lx(kZNQl3)W%zV^sUyK>?DT5;t0^))L2{zQjs zApkhkUURWt;`Vs!Nc>lsGgDw?ltUoK$vDJrsY!dyH8a5l01`}^qr#>^G+)1U>f__Z zI&;8amID3_9IL}$BxR_iWXAz!%DxB}6NJ1SwU`y?N@zh(pr9ZU3Q_YqW2c6|*L zykF16qb~$u%%$CA&@`=1AU)^i1hvEpAq}k0N7oc7WEK)rf1G1w*X4i>`{RiHef%Ys zCWz6pu=MuOS#mbxD0L02LnE+Tg|3Szbig@_r}eSxFNYK5UbGBXsfg&=g}zs94VU~} zz+yeEs_=smdxz7Rcm1M;B5_FzXBG`7RF2=_FSH)E*z6DsJu^UAKciwK{IfvnL+$jV z|9tazr*7ymvrQL@{I!uRRYhL_8szC*tVZ-evRgo|yj)KZ^3Q&<8TTIo~=wF8h>?sXT zTTwbFx$Q(#s_UC%`2;ep?d|vMy1Cku3cRC!EDlR*jAbtVTpxvdIJA_(r}u<8808Y> zT)`n)$L2#5L5Zk9{e|I`RUX*Z4Q^5?{xo|;Op!bfi7N!)QNJ(AoP*shO3rr)vIGxW zRggc-Dz*hE{3I~MX`&@Fjs~Qw_qBc>EE50JQz&vBpl(4KjysoH%nHE*ek$Fhsz=j$ zi5+d!`9X$h-RHvwPegiws^?zg3LP*i zdre!`=(nQd8#uwRwrvMLY_PrVviZ+l1mySB`n`tY8-=5>bz%le?RQ_N)IR?L+37PP zumwDhUtOp5JQMq$7bPk6%hBh!O<%Be-Om06z0Z!Ee|b6oe~O-AbpFb9Fa@DkM!7(OV2nGUuVvM!I1Eon3RgthKx(p&98-aF9Z@E%*UTLT3X$W*4a0tYzB8XOQchnnB1psH(MU|u(D zyIaURJgWGdzNeXBnQV1cKKv0iEob`=o$2#_{$3W@fidAcB3zjc-DU>5H;rEc2t%-jh|AW_Ios8RXwsQ_>Vl*VWmVx8~yx=OH+lt-H67!q?rlCk}D|oqaQiZ zg@-E}|M%gTyyj=XQjmCMoRuj_#nS8zs9v-%zye!!kcYM{nAf{L0vmyDi?JAH-Iwgo zk3ec$W0%~8IV*Rgk(4d2-MsDl`Ji9T!6;NX6FbW&h+NIt0>~*Q_R^zu78Pxu6ZSJc zd^@Z9M@qAw*Y@tfeA@(q&p^U9Oh(9qz|WAHVTZh8#4D%ky*K9&3J62xFJpa#4`;Wy z&LOn z6h_1m0GM@CMv7+MKS*zDD1(cwX33SQ)msH8XH;9gBEK89cfdusF!k!Bux=~1I#o@k z>oe7YRc~Kt(0o&f>e+tx_hRi;nuZ<|$heg2VH-jFnrnTq2knlv?kMd_FzeNLCA23B zVZ97IA#pvlU6ITE6gyvd5-HApvHpPIw_ueZxqUA4vJ_`z@TZJl_b`hc z3!oYDCM7eP7hIL7`=Xn$H~y)bV@T#Q@7b%(RL3UDRJuoA<3Wwd0x6HRjKr*iLr$6} z@09Jw6)VULpVqBmQcB=W$>^x*KH*rj)OY3(qgHU;2h^+JI#s`PN~F<0m9CbMe-!U; zR48f`9+}1f<%(Txviun4L5d5)JzTgT(Q}WrqXxNcvQJ_awE<6#nV#S9(~A3-uT_Rg)nu5!B`UdTYchf+AJ|L_s?I z4|#So?ICxXg|d=&SxDO+{jgb&?%h6|{&eB^!v2EPp^$rx_MU;X!88|sM>bzEz*EFU zn197Suid?3w85mBltNd{-0qxuJ*(Q(*;cTn`QT`-G}UM+40dw zJK*TXb9PQSI#2XE$YbwF)Q2f{wFP_KL9|S2i<>WEfmIb!1S|wP4M*-{2=k^1-F-LU zBLdjcVdLXnK2rHJCc;lGsC@zcNWf$vfc-96K6ns}pRWX8Y087)X=F!m#DJZqV?>Ya zus^iyzm*nT*it<>hwH0MD{)g61w{@SaPg+9L zO_rW?i|jtblKgSzpQXK6=_VADPCMOrjFC&CxSPRcg*=GKP99)>Qfl@TKI zF|q%V>EfG}!;FGf!MTvP3*ljX7!9X=K)^xg21QmIm!#6lGKPmFB<>@#?MIi;mfOrY zv~UR4?#araC+c-(ThL_lYekn~0n55o=*A*}ei7|cC2|TS4@eAOuPOIiV2Bw0wpcEJ zRp|wOC()QuSD*qUP$S_8V0z1fG`K7!31?V_kkfaukZ5Rh=_ka9q9!U(t?a1-c>LjA`p$!*Z4uVs4goFLH)tE((?q91ZnAf z%m2d#h(1pSgz?#(1NA+UBD!^M>kGWnK(5-Hkv(W;xd}%ZU)AChYB{t;EL@Rg0kI}( z)sd=gJftST5k~3y)*?Y)VZGU3Sj1gRn4v{;*bs^(gZP9J8d6CD>wHCAU-?LZ`VSET zJxp^wsxr=7Bm@)u;TI9E#FtNh$>LZP%`{KH&<{s0WCzx!e4A3maHgl0GueRYfIs&Q z_@@_0!rB`BwR#eabT(EQAmL-9mxoosqhBB39T ziUVcbLhI$?l}$nyf_bV*Ae0t{B|Jit^C>t zckVnT3`maFJ0#Ir`Re^cB7UhTrl*|w5UycNK(n}wB4cUXqe|( z{AI-Y*IVq2xpmLsMAOEvo+K=5ny(ZwIB@?A-o+ihZv}#54hes*n{H=%7rqROl$(7V z*Q&vlt|%`2`kIU0E_8t_7Y$UT!zSm4?>*M3CJD@wLH($ovbQ_fgf*OyQIgTfew67v z=S*{mlrg5&tb{_k@3o5UA6-LooVjI7z4Xd8e=#%Ab8VAurmV&hnusoi*$R!?5>7{7TSCCp!1_RK zuPYgmcF;YzVz8d803O#OU+v!J=X)@~ZRJY!7M$_)XmVXzbOKIr<<1dZBckwY=&*eE zE*SKe-0PKk)E-jf2+rPbdg?c~K+G+@r#;6R`=!;rWd89e`FleO=U8)&&+4}B1te}GOkbiP&uqzaoYaN;F$LHjE>^P;5B{}x07MLJlWQaIqRulF5C---3 z(aUr;M&W9EZ%3PXlntl<;ELGw#vwmRtDiEEw2`;T?0kMEM$#E6>u28q)A>)E2EGqo z7k~Zf9*G6k55gg7j*$BhdLbCmOE}R$!HZ6u|Izt7dY~O|vxa*AfBh;csA!2)1i9ud z%~#mzOEkHyglJ%$`lM@H8uk|iSXw8zbbQZHslu35$x$qnuikxM5%jnNO*gGP>-UT8 z%Xp4aXU4l^7lllV(74`>Od4)=6>}sJv_@un@+d~O({2&D?$L6j&j^h!D*~bh)rwd` zBtMG6;vS3HRHKYt3agpmmm}J;L#rK@J_}vzpdKcdj z@~hyA;4#l!N;Pvjt`KILiFT1bBCDFgVqdEnXcm{)HgpivPsnle5UaG)qfC_nb%I!l@n1ttPC<8eCKZ~8xm#uCcm zQDim*V5dR<)j}MdZs}&-zVuJtmIo%#Q4zV0ZK2Un6;Pls%=CS&_&NIeOfg&>Aq10O zfP-<>Vssbu8!>+H76LE9P`P0K2UlD<pqU@asjrY7j8p09}b;bjp-c}QDB^@Du` zkj5$&kb+G@OW=4@MTxNsjvAcjh^#>@lOLgW7zZ>h0Wzgf2i5f(FMfCA^s!EMGbA!n zpeWSy@`7@sz3cdiP;Q+*P{24q1!a-Rx59nd4k!!05;$0*k-s>cc;e+TERL1wBMHaZa#{lp?!u31OTQ*87t2QWX<~(bTrN3;& zxOpUCB%u6J{;gR$W}^?}m)LdYZ}xJpnhMFg!} zjJ~g~DC-Y5nqxU!hy4sO%)Zz?`97%haSgA6Fe8>nvLw9`9n`EvR)#|tT#($ulc(uH z#~9O?aQNJG(!5BwXS8qg!2u41+wAYu)$tUa(mmXjt9-l~Xl9sl#@u#V@}XGO%Q5?o4#Gc0yQLkdN9^~{J*=3;sPK!Y!9p|{{VIuO-`yhq=)!0Lt^8qi!IpJR9eyG;SXmDS1 zL3|}sWZuoCWhUwBsLtP09n=uT+?i3UDSCnAN;<=3TLZh)Wxgk(U9279H)` z73aki=^j@Qp}0}j>nCx(#i18D1EgfPMXe$UjraO+vYuGy&o|b127b5v5?8jjoIRSw zgcG32bRBbgeaN4y*WXXRnVo4CB4q&#)Nr7y!^V~^m#*0>>*Lck!IMcrm8*8Wy9SBf z3+B-YifVuTk{inS4B7tfd?9n*-_rr}1IfVeAsxdnaab4jD}XU>kZ5Z5Z!Y)j@)}Pm z%w@4f=p@fH-A^KjjxoHSaei46#J{5jEc*87`FfN0#LkV! z8^Dif?lVdDepcPi2RGTcO?bUIf>LnV0%V3gc`sN*uR?XP^nK{k#we4!5NZ2ONll)r z0F`~ZD?Hx=U`kUaw!O~Arn%EAiRQEnEIz?r)zaxnoVFJleDo*+*O&42T2&u3A_os1 z^gQ~}OaDq13&Y%BTNMn_ib_@Ip=g9ekJaxkx zG{Ka3*0+p5Pjq$3*S~UPM(=w`l2O3Swfiu%_LAI`#(cw`-Rz4h(rhDLU2aokM5i++Abt6Zi2|@bRyvs@HTea=7%0#mvC!FuYC(vWEkK_P&2do~ER0E+;n)nw zk?yDiQSn+|{j&w@~KMMwm-C;86x0GqTc(n^V)rI5pN67b26YJP+P*HDt*PTmoDYCb%fdz zA>;r&1h5kT+C0I5Th_TEZr)05kq8|9EEVQ zu^q3s8}j|3gXTq}slPhWg-3Cga!Z{?q7QR&mSSjwk_X*_iwl{4&D?7le+V=t9p-~b z)CM0dC@PBsK1qIaFX1+ew5@Tz-B=2>w1gTY+F>~#_mB@`Nx|RzKGZEWXw0@%s)J3( z*pqBcsEf9ur5D|;x_udF&;Nu75!@PS2S=S?VZm=t<#FkW<}IXP3j_v=G{#MTPZ+P|`TGy>Cx}m( zGYLs>%wvCj(EpU%j`B;IgoEO+i$gzUk~f-l&t21RD|OgF6>#we+P?3lpMN&2KO*A) z$JJW~#nnY?w~af&-5U+TCAiZ#1b26LcL>3q;Eh9YcXtc!!QG*e1eeQus=j-^d;fJ+ zckilQwQH|6=X&NCCk*K^9QMT^MWU=Gjo3Gp8I$SWJI9qHkqPTXHvt@SrIjoq!`y{f zv(wqRzs^`0A5UOLmx&5CeujZ36I8EjNRNGF##{yr^S#?&{K<9K_{Rq;$J--gX@9u_ z{(4f%!g$`oRJ32;$v{Aa!ZoLSQ$60F)inK>+}O5z%`Ups5KRl&KjBAa( z!jVOlYM08Q$Jnx;{|#=lWJVTSaGQKt?t!70BxRf8N?TU9fVVm1vlH3kA9r4=%*s0Y zZq5VP#=Hv9z@N95hh#kyD>3lmWK#D%ogqYH35{!|yyAqmO7SXH=?2snYQT9oP<=aBVI9pr=Fwd@i* zSH#$wL?tI#+kOC<(PBrJUQh?()pbus8GX@D7*Ao~^pzzNgziCUxq(9DV<5{orLjs; z{1W>ESz@8|!ZFJi1u>`dK^DU!1T2 zI3`j3fFgQ~=AIReS+|b;C4L@-6r1=plDc^yk%)V$xVk}}kgYD=>?bmq1(A^J@pp{S z>WlDi&Y9tFvrglj&ordR1G9bZXbqmqJ98(ScWRrlp9KS;5@rtJ5@7=)-RF1=KL)1; zj{ZB*e(gE$@@=$Gcc**GvV}mhq06H_mwpyuz)0yIjM!ZBU?(!2X;e1-rQ=c|^n^*kpiNGzo+^+$+`LXPrL-=|R_*w=PLfpec~xzD_h z=M8kN_7{<4n@zlCl9E~E-D)G=A^1oO^VKw5{x6-Bpgy8l=F|p(Dv^Q>r zKb>(o<-A=Hj4X!^=jFoj+mtLi$Ugnhi!3~Ej5q{V0`e+8I)Pr+G^|oyg;iPBK`kJ+ zr3fxSf+2LfO2Hi(EGCmq5vQ57kL~d7%WYR^Dm*o38je>KM-jf)HSZTVJT_Ap8yk6Z zn?k&*V-hWEQGoMyZdxaRnN;BD8&IJf#wMoO)P|{|C+}aA7 zWE78myvm15pI^cQCfH;Ck^h;l?07n%5i*Hfa$A(<+7SoKhNPlSE}c~pPi=(Z6-G9N z6cA$?D-AbJsTP`Di&Dj151i?bkPJZ$;3c*1q{dSV?nCxKKERR)ZjyT$T0_NaS3vi@}^H@y}X{z66)bA461mYky)?$+dz^%L4g0Rt1%t~sVzabZZwTi1iH8m4) zo8mZ1s@YxpSE2;lHBpY>l|QE%93Mhkm76a zu|P9&SRB$QLh8Oxnzap+dbQ*~Ej%dQEh>eSTCIf~t8rc+b=!z<;&Cpx4GAY{p@rUb z6@#0ngbu?$n9WTU30K7goeRvq0TCR8( z?4gSq6c?qP$9T)i;dSCnlPpK+*M#mga!eW^~=GP_iz)_)gt37EcNsBF>kLlVi2JK>WcvJOw1s9*LDULiB%O^{_k7QGDbAk?C0@sQ4oqY;U)B9}6{ z*lA>!j8+&udRwP16=;al{xZ68mPA3vwkye#w|qH2yIIB*{^=uih>0!j@JWR@)k)c` zlo)T#Oik20wqhxLC1yU#h3wo%6Nu)ci6$N?SL>aP=DjJ#0S^t67WUJja#XvI_O!1W zSPo+LS&stkqo-pCixs+7xVAFN4L}3bg1f=Yz)bw@-!myBu>_cAsqhH* zbEYqqi$V?>_lgW%iOsGZhuPA9CxeB}5d493Y~9P-2#?`udfe@fe?5aHJ6ZJyYYZc+ zN1_tYhFgfwUx&6gCx0>QYpDT z& z&>SXA$}Lo7zo)bf_?1H+FhVDj-7eHHT{Klw%k^>gz4(9c{y#nkMre4|sERuNcwJ}+ zfNrEmyF{+KES~rsT9jr(3^g3xQcSlmw}GgUm!t-@3l1fUWOuDqc%|%wZK6)nrxx@F z%0QcS@g`Btm#)P0X1t+`ih=4ypuQO?6H>o`Ail|~O|fK1tdU>MTTUvd3Vjw3B}YDA zByrLLbR;N>S6qpmLSNCpP2>N#T{re|-n$LuK@<55ghXLUxR?yHC}W98qinJkYcCyP ztrVv-3_b96=(Xe(4|nX%L2NIsf~0h?gMJ^!bthlpIJnN?^~w}={^iiAxgM2rHaf+-4=fTR{h5#!SRi)^ABaYdE1qr#=h2*5rO>w+y(fX(42z=G%=bO$1l zl^LU)H-_~o)9FHfh?$<$q4-dtbqVHBP;pm5XD>_P96nuTry(plk6|Iy?_k${<}O$s z=+nKS4o13U~l+6z?%Tt7=auSi&e~>}P5`kVALxVZ^fob5$y9{O(vL(j` zFviVsB!yC-%|}OZN<{zCfcPS9%NQF0g}0X2NoJ4tC^U<1o0~2Y zOw|x-B+GJ{4p_eA%}zz52T46k*f^Sh_LwHx_LU~x56&#?m8B6$yJ=(h{6nd=zh|;w z4fu8nD>u1tkgt^8YqWr64jxJ1T{OZ98&aFwb>(ffL#Sg3X!jaaULer~!WT*N6tlvy z*~2d-!wGCuyn_iD5QE?uj*QId;A>qj%UI4UN9o&Vwi=Z=i@TPhy4`lHBuyMDxk!L^ z8VcnyuZPped8xisaW1(tDigqM@F`^EiE+2XW<71ewtHV)4^Xk_KyeqYEnBFIo(2}@n%PzuoVjHbHf3$Kh zK*gBtwc|60)Nwdm!Tg~LpGinZ9DzC=h{(j@`~EXV4DZYm!o?Ka2qSHhREze!)I*F} z$XVbQ<0d8-v~CN<%^MWQo;f2}9y5I)_3fng$ zua1MfVuH>VmktSRKu&X_lqwJ0?df+PnXzI8lEAOe)2epxJP^}u-ii16cc!w>qurWK zA3PtqOzuMA6ie!9F01jtY`G{Wk==N`Djmc2Mh5F&VFvlti;Z8~Xx#wPS238AlF^h?QqKMo(D^pv+7Z0mvxgOnq&I#B zM}_UCD9cmXlAs!-@p`tG4hiA8oSIYL8nbD2RS1Qmrt{ zsnUreK>RlMh#a4AMNhJ4#iqRy6l>nt>UX#P(u5hBiIv`4cLD{Fbik^K?$#t8{hQ}d z#7F8v8@kwsvnA6(JRjSZFDKG1S?!{(Bn*Ae?JkKTO4YMCl+UOs+}mRw>6i3oXs>^M zuRN@L!sG-@ssc>9@9DqI1JBDM+i8w6UILz60o9Fm&gTZHBGO-WP>8xns%(z?vU{%! zj;AhSR5{RFeAqDZTV!ohpWS-P zi^c7|UK|j$szZF_`+81Z!D6=sc@?&K4^Y|r|8(X@?A$!gfmBm0Q4Rg2L>-AzDb;2R zCPC6yoWo5%HY^B-oM#Fi;71?!;tW|Iy^0Oe-3^(Q>v4r|y?qCGl`00^1XX6+f<}qL z97OJDtRu(R(7GZ9Sb&TqIveZ!qsv8k48{VpS*N7!FqHuL zlSga5xtVfYcSD7Y>Wf#pFvH4R&4g;VU2;J=$<3~7yvrKRw8&1-IG)l1BTA#F;B^`) z>`UlVVE-&I|E9ifgTP`X4kr9Y&Y*;tIWvEa3Znob_2{r5oV*#O1>k(mIM#TAb60vq_ z?D_PG<5cyl3j(XVUw0PwCn#TEy7kM16&8{-h4^8EPhGPs`1%bc3Dl$vTgYZVf;~2j zJv6R+qRY1={Q_R}4A$mOoQcrrtp54)af?!uQ1@5=d)?%^69x-tAElrNH4=M&`LP#r zA3kNm?$UW`Yq%HJ#}&z+MlrQh>yMKUBmH@{FUgX>v55h$;+E)+`&oN;+hGdS)FGMp z#c@Z#Wwk4Fs%Ce3yEBNpJFuEb6neaLA1>p2@uItXhd~AnU?;++EFLBGg}2bgY-Ky3 zH1=HCKk3{5;R4iZlzv_Y)j5EE!6{junP$3s947k}$zL|8B_*hz-EL=;JSE*Tx1!bR zXmSbp%ego6k9kU1k{xFwg`KV>DdSDfCSyR;qpQXS@1j}l!h z^tqW}8gD!j@ew*@`A-~4l?Uv<{i?hl$*f|~_>+Ui zvtMO`5E21avGXjJ=ur=i(>GXWW1__ZV?;ccb}YJD#(1hi1n32)l8#rqB1~J6wq{6Y z3N+Kzh@8!)+RZ9cH~fkI^B>3cpj_c6)+>0K0{X(Bo14K#*_iK`2<+5|pFx&Bv6ftp z8cPT`D??V7k8-a8x&7)GiAEVjOF=Qy2JSF#f0Wngf)XY5OTu|_xfUuPm!U;v#@T7G zp(A$vN-Vozuon*|kZf_~du>3lvy}Zy95Q6k$8ZJ}T3Gu`P83qXn_Wd0(C1|DXruCg z7yy4?Tb<8mNApuzSU^_ZpAje_?f@ML}p(Vq9|B@*Xsp!gI;~ z7R8+b{V#P8s5bhnaQAssus|w4FD>aztX7%}X;i1;chw*qiBP;-0Yx4D(;&-T477$q zLMcy>M18b75)jv^L2AUgU5Xc>Nh5|5Ws*jfeaJ_`^5IAstuzJ|8lB9>&LzHm;jhPZ zm$g~ChJ*w>R4OL)>}d|9jgG2)t*~irRTCt1WDp)-$U^q75>(J&yPkzxG9OKGX8ZVq zLInC-oJ`QlQJN1h3`o^DYbvfTtzg6_JtNy+3$^qL#^c&c6gT06$qDhz6S_4wHsdDc zKmIQ6G+OZ8^fEA6w@Z?{U*lPA_uKqm~dAds8T!|M!%?4xG|LFDv zk%hGMhQzp>FX@<}XZJbE72fc^E)xdCbI~hmtA#uP@EEeyJmc&lzekBopo*cl*f)x_ z;yEQK$zRCyQET1OHv-PJLM_*OI5%7_rqJ6*7095gQ-32UVzAARmMB+xc!EnTCOX;j z)e^i+9W}F2$YFvSeIkpK=E?~xPo@2nJ1ceJ75j8vOi3(RdAC-{k;VcfK}{tWWap-u zJ56cCgsdH#TDHp;U+l0~0-maG`Fbk<*q-3VzGR<10F1M|F|^d!e~L+jQpxaPt%>A} zb#X)xJ;Q6|xXakxoO^(|;-b2vi|bzxl)D9d2jEo(JFExTK3IAv-3l3tKVVN*hd&ax z!|GgfWQ_NDEz()5*|V!Jdas0f9mXU;QZ7J7# zs{PW;1*PW{tdhMR)0~8^-exXU7G=;bvXf6pf7v97Vm~er(ZGlWw$c%jn&rE}?sngE zOvSC14#|QqQej{ZEB|;Ku6T}vk`kRPqpim)qgAgB-e>1lrz+R!JG63Mk% zZEMO9uZDUTTA)rimLGAO5^dJ){lX`C?CnsmgZu1uIB0&vIXx9cGwrbb85X&LG{|i| zreXAgb&2QjwITE(6pF|b{_CeuJ##~Cd_qZ#9C7Z$YN=Eo;L)SdKYz8X$AgUD zZxIlMoY0TH3VK`31jCHbsJAKTOYfQ7R}X#7D9m@NItz7<0uMVk@ng`nZ<%i~Ho4B} z@BMCtHe^fsy1H3foI2NNPoLBMDg2Zh3-qeS0Tp%~z zw$X@-lD-u7lyv_KvApZbgw}F@E18atqYeVV2pEkpKK zRf6-%+s`sL0Q4MK5t{4w!!ZMxqFsEe;}~?2Qf#Tt1dFGy_Eb0x4wwoqK0l^N>CMZ@ zB$MM(K^+8Izu6>}BFzS2=d->>DnRW*Posdn8s&%uo&PL$Ts9cJ`;8a}2`8r^#q|OV z`}X2ir3O|Y=@A{e5+->TJXBtOxBm34RJd4mCb01OQB^gFFD zAtGLX?3nGLw{rze_`AJFHh65#eh>`gE%u>{+pD=;^2rBN5~odfak?__!jDt*H7wSF zzBk2qV}j#Tg(`v4JNWuZ;d-tiYI{}&i&POrB0*mJR#>pNs1RUL=`__Lov!Z`T>OJmL zsqbb3eqmtorfKO()+f7HP%Y!orxOF0Vkvop zZ^a)kqQBd%@vVfU#qGl_3n5`7VVtth10$ummkMc)8F!Dsp+gnuCM}ALKW~w}bbfzi zA>okJp>2ZP&`--P6hI12%ct@_J}SyFNtm25MW(UiJk_LZIMX{?`m<|3vN4~k0zCS1 zpZSsy;}C(@rGYXCsS)*Id~FWwirv*34ViXKbS5RGI7_p%FO6-^!Gk|ow#?V*w^eu&ReWTn!udzRSh58?ZW389G zf3OwTo){&6%8^{0Z|J{Z#(5U_P0h+=#uB2g{)NR|u|N&^FSWjl4*!*pKVhV9lu=oV z%nz(p6@9XqGR-#TYRv*gWAO-2{Yb0Q)CE-1>4@J{T7;jAnnv`bB*>|5A{BKMp}*4K zmDYB(mfW%S8ACrh6%@r9Xi!ioSi;d4XYteztq!fstHsvgBCSnEaGd#K^bpd=X`jSU z*xBjdg|;Ui!NqHw8U!S8E9OsfUHfGxA-te3Cl@gVlFxbulq}->tkvxA`|h*)zOl+T z-ngCVZ~Y=A@@wXpHq&+JAp3~%!vB;e>8WY}kjqvRm9bW#haDiyfiwe}@3vh|C;xrKXhUW@K2P0FmXkrjF5;x%egpQ{q=+b0+YGf1 z#}iHlxeKCszM9M5J?P^t&bgDPS;4etI zwP*jt($CGrS~&A9Wo5Cp)6u6AWT;beL?JL!yC zN0dIKcJ4u1mpX|(hMqb-36zcQe@+PxSd@RcM+Gz6GtXOall0m%-s@oieuIscGF-83 zXQSfnRV+gNZ~etbxUPBY<=;6vnr+#^y{&f}bJf z%)cjJzcr0D_H912&7Z8dGzr9 zL}xKsYHpELuwi4WpxWUMV8W0-YA?31u?aJ`W}KCgpzY`e2Toc_mD|V=cMS*5J2yPN znIAU%|J(AVw4>}&aHnPPNWDC*M%Gosuw*-l-4tzNHOD3l@!vNyaSJt`eUoV;39GzZ zSuP~|FAS4_33u#{WqK%3QUnIVjF+Y)X$(l)Vb;LC5Gv4TMccbnfGWWskpY3ZQ)6W4 zn8i7YSSGKXAb{ZUCm(PMxvfA0Q!e6j$8t}XM>%Vg&P1N<$4`H;lqy`BA1;9r*#!g|s>Y8+ z27}5mW|L-i9wgTw3kl8OFePompX1r}|l0x0o2u4y0r;t2g;Lkf?Q+awM zNjj18hUb!}^cntj6(18XWaDZ`!Mp`6OqZ9uA0~6vNuKb-*#DR{&+ZM!AaF}C<8-lG zN|O)0u!M70ft&q^LRaW0a*DiM5m>zv$kzXL)RW@yTQC7+yS|lA zV*wtF+OIa;S z_Fs^K6q_u?SHfaDT@6tPft;_JNqRR?;?I9iSC;x4!ix(v+j@mx&u#;4t7^SD{OWqU6Ut zAGZ*h%oU0aZ;!`&OMMyt#l{2XK#^yGk+e8|zrfYs_pv71){0%TX(vkZAJ)6P>jsq5Mvlm%23L z=U~X;n+-6YaItftK|rLM@V%&O{5jSIMN0T4E{%_4N&7ZHR{yshlF0a^-^6Wu`Ok`P zP4pA)f*cTOiLLoI^BFg{iw>-P(hJd5>A9Dzr&K<3S_4SyVH-?3$7JOSuO&koN>mzO zzC!c3+emEoh`P*;fj;%vTYkx;{X((+Fr2E;S^H`Fl z{{x3n=e!4c8UBC(-kty9c%1kj70pT=%m?jufaU#$E?gJ9h2IkN*Rx z|2F`<-$5dG=2mxif0P?26esj#^@WLPC*3rz55M~=?BR8M968{u<-;2G)nV|1$M_#g z-+$WjmHwjduEyT*^;FaOyl!Oow4&xM@wvfvnK|3_16pyIZc6LVbHDED{IC;l`ug$mPER?oBOnP=dhP2f`8>)W9TiBxvL(+SUUUTE#djqG|)`;v7(Z$O42@w|rw|6OLK z>8!i&|E^Y)3aT-%AyS}jG1`xX82ZBD! zi==&)8TSc~*&mG#))(Ru2_QO-IZu~he}c3A`##malu#eRZQz#<&CIGU<5B?^PCz=S z=(rMyEp+$D@}WUf@Cd$9uG$I=)bl#QuMK#Ay`B!d=IMm=zemdT1duYfKBx#hKj0G_ zYvL-OyDIS8oWY;3G-FDUn+1~9zkUQT=mMjnYg(~#-%h!BAWHAV=qvR!hgY|nkf`XX zgXQ!7TSGsrx5M4(UDvHvsPd?3!zPsJ*MIoC1Gx{V%&)8N4-kC4h;WEk(IPFjk@wOb zZVfLQ`TI-SRoOelrgLZgJ;wiTV;PBeh~;G$`va`;?5y|HbawR>-!RIO^j$1E2y@%; zWe)pVSm?&t@33NdM?Cl8OV0Bd%hjjo zk{)`W929t6UODCFP8xYkZ4V!Epbi0?=fEqDYuCO0jV3L(t$9S?cQGkkRnoqsm8@} zWz{Q{l^tndy2?Fe9;9xdJGY2(?1q(R3>CF}`o(D64yI8voT#h@?K{ph;Zaetbdw@N z3`J0HW58YLEKd0(Pp@U5vsFoX8R*3+eD>$ZC9*aK(Wv-(Z1~X zApxQ8C52`CseIA&DE>%0nhm+DN07bYw=Fu#ah@xZlcJdSJ!CCFj>luJ%UKjBDyOpL z;`90tQ}|Rs#*7yLC%PkPKie$7iF{F-*crWUy)Xb^2@2Eg8OTip7YJy|!1Vo5`yav{jk zd5)u=sR;yG-kiS%D?{a7)~F)6qz$mtPkqhYNq~YL>Mhy{nAwHC;fWZ9;Dp;FmvX|N z^bYr)Nr^sTPXlN}!RWt|it62E#BwtP!>qduWWlQ5 zQ&+T1kvA<__8lZg$<7v=ZyP+PxMcmukNyr(;X%=X&eYyj0`ekIQ7urG7t9qk8ZDup zHN7vN9((!8U$!_U9~vmmUn$jHbLLNa&pA15^K6BFw-pPx#WIQV|Jg4B85U`8QC)uN z6>8Vt_(<_x6FlxJrS0x(BrxBnWjVEP-7e^R;OJI8Wf zhM?IJ%`CwmNmvCno5I`eW`QLhJb>0IAJAN`B!kWvY+bhTXPDd~v3TL$O$*`BZB98@ z!}(~lY^pwG)EYmNgO$qm69l0%)CFL#aN*G-H5N3}7V+A=Zz;3Qc`>RlB|^h~rM2&T zX($aU37;1bFvVSe9AZhTa`pe`{G+Oz*CQq716{3|{KpkG!(S{^F z{I7rKotO1JcmDIZE%&^+`#sI)=J>TtW?y%$A_zZ-`hA#Md%>QYk^hNYc|NF)d!9Y_ zzCGdmm#r`#|0C_bj&=NSjXo`elHJBP1lpzPxgaSDTuXF9{2>D$y!wDrq5rfv5WgdS z=XK|i9p`volIo62zRnNkBiQe7H=1RbPWVw~-D@wl^{W5F&icvhwcF5kWV)y2*7-wB zw-?1&-HWTK7p&{h2A9Qc-_P(X8>=VqOm{2lthxg|-gkY^>A&lOA%1ipxArO?8~DEx zxq$YpKb@DbK7+w$Kle$9Yi?hBpJ_x5Vyp!$IUU81qY@1zrO|C))=>jFQX)wsC~RVp zS6A%=#@zPW+Z=hl@Jf*od2y6bMy*UT{>tRD8BF>}i-}N@;Wv?~6R|G!WSk`6@EZnl zcYFMEe>i);dzX-1-V%5;=h^OM@*1izjJB<5!|Qo(2R~HwJhF1z3t{|6^qS&(#X0YB zfT!qsh3mzy?!wIa>NxyCNgjmL0lW-J3B|ci3BbJHCQTcqp#QpDj}%82LbU9DYN=a5 z5%OGQe%}Q7y_FMRz1{baI|jTGJ}hl*#pHj!?7UUfbLxZRxj$dt`vF=1k!<)xe%1I( z5UuCY@r~=Ldi#4?7uNg8UI1B*&jF*;ynToBUDjrdb9Yor&Og4t#oL9s&sb9e7ixan z1LToxojaaNeZ%e?et%sJ`_Gj4asN{Q)Sdvyw;(wo3eR7l#_0hacKQLau@FpM?(KS8 zj~!F;XM!oOi;Am_pHN4yN5aF4ngM8#r^1$x;r;UYsouK}z;(@sI&gP0f4B2?^T)?i zSa$t7w#yCg7(z%*Q?K~xAhP~zi1pC9<;%xPCIVbj`2vlb6hyF{rcsRG2CdPl)$&gZ z$i6Q6z4@6+F+lAScZ($eDfRGX1%%M(E6&C8LY*FT?pQL~7|qDC=so+>%ki%%8YV$E z{v2q78j5=I2({M;mLNo$2@VrZ7e<7WV8{mE_Php9_?` zqXEulFmkT$#IynmX^vee-1O+c-^j;dnWZ>lc|;MgiUs0$qM!HBUF{*FcJ><~bxkjK zEXX7FMsgA}yZNI*Mo-@4A4wgQlMA*GAAO2f1uxr0YblldYm(xhK`Wup_1M}U(UjPp zf|3bwWqQo%HY?~pMO0*jv5Q&Ru?Dhjaf6l!QKXP_e|=bC%UIYn&rQ`UCUuFsL^oJB zq0L#Iic1Fm)F`7_?ZK5<|QH!(XUJt=l!1*$*-Q+nbn}LzNGck8=JKl{* z<<636sgh$02waG#_gt4&^r1oF$g61>0_M4@qcZ{>vug&#Kc^3l+G-Tue=+f7_@0v0mN@44 zi-vIJ{tCeJ8lUWr{@d%v^{=+kR3rA-$X*y`{-~k*yJCs{pD9D%ZlybYX2Z<#CS<#!TYC)=9K82_$LM$Ye;|c67$J|Y$rZ)j zuKty=m7IIYWlXIedbanj^Ft3LV_GFN8Wi>48jJA41$o7dnlT$>@*V~LX)tm&}q=e^F?}S%#Ce3#P5`@2~YF=m~e-iB&WgnvyYTrg^S7kUV=Fri*v( zMJ^eyoZp>mbE(CfHq#BQ@1Of~?8Y`!CaSwF%{eWRJn0YogO%T_8gQrK#(CY5>Cy;M zK}~=6Q~9)MZ-x(aPUjfr?Rb(av{~33FIrob)&#K?)zVk#UhI59S7}}RVK+i!b~v3G zBTj=;W$5>UmJE;qs{_xc-S2^LT600u(Sq~m?@Q=vLeS#Y$9^ZhAUz2Yoo} z!9JVgpp_06dk{<6On?;i8Tb5bu`J2&rfv7*ZOw&n&-IesohjdJJV5#QoT*k<^wn>O2{{;4^)iAYzDlr(xA#t=*{!|BWezguR2eaa8&e{G+CJ|KcF}?mO^1n)=Xt`|IKHRtXcrNP0JUpZ6$b z`1YI}%g_MX9V?)>rTZTfiSK#cf3V`q``iD3jZg?ALB5x52!N}EZ~@rd#|g{b=Vik{ z!8n1NQ3SWR+oP{rejMn0#}t5G!Ta@4g)DAkcXwQX({Xs&Y?)@ z`@XK%P9YtQ?O5d2abuh4Fb#kRw)}N<41YF4LL=RhweZo->NHWYk|RA0(_lplztt2h z@eh%8|Dag9?|Jjq@_#CQb{>X}d#|Z$mfqZ#v9&tq4OB)(-@49g07=tpzE=Bv$HM@J zQp>6Yl`?TftXk{s6#w;Og~!fKh38Ivg-3qG_G8Z-3Jck z2|NALGP39X>te8)_?=8Q4F@6wVe(p?&yC~1s}uuNR-O+DWuXto4Uk2-Gj4rAErrp1 z!!i9aE6+Eg-9Nri4j07vegEc|{rogv%N|2f%51V9fP#Jf*6wFptV zYosCP*|GLH2iFa}UDk7ln(aM&<}^b35rW)^7JlrRj)OEbll0~927RsZ#4&_sXOdPO zj7aHjksiZJdxiJM>KLq8ia;kHS@n9eT)NX*I^c`%Gk z?-6@<#lC=ulC4@I@oaIc^V`Q;=!gwO#OCsBR?z z)cPb+bLkQ?GoP6#)1R9XxApn6YJ^0RO&&+ktKPYgsPCZjUyb&GJZ)mzP5bE>-97&4 zc(x%A9i&;JxO)Z%hgX_^bjheE)|#kAIJ78Ai|OqE6wsv@Ig(dI`FCPVxWxhpS_C(} znd`mdeiQAJKl9QHK;Z6}V_+$9;$)J@w<57(fd!kUfehxfp#15vaetNN)r^tc#qz}Q z1_;W+^me&+MGek1P6J=0ozWn7VO+XT19nai(al7cn2J_9^a_qhcAry{ErIQ5d^z}j zFZ~Zjds2PPOpMAs+z!7a7KPGxEoG^B>%!a?4yB#3W1f&ukq}?JYqR#L0#m4^JX#*H zBji>7nDg`YsodzpHb3sZ!`=45Db%2Lm04d{Rt`b8;z4bkII9q@X7Q=WVt1xQpO&Ck zwR7!^XP?wY{oUJL8Ud>wR+S&Ojx;a?CpvxsR9Lu#`Q;94bvOWt*{@}wM{l_kJ=N)G ziAJtv9HRw%qSsu^Uf57Lq;Z!|xR`3w)S|IMlM(}JPgn<(^gSF?#-b@WY$38@j{Ug< zaff=T4_|@i;!7#Ha`go?DfEoAzD<~asY@!(j0y(C9`A2(mPQV<-NKP9eg~V`SSWJl z3J&x8PbFfi%IV{On6b$B7Bn>B5Dg2nY@Y`;=Qj_VC#6r_zGubz3vvekC;FEUek-s^{#Q=jbHOH+`a{ z3z1J;ouca*Ng44Q=E=OA%d~{^JJ*vEN}DFLm1OCazv)`wFHYx>3db^Ykh{6D;}&bI ztH9l1{ZLgZjiEu7i~PcS8b0lkQ0^CNX=C$+uaMmeo-xdO)0GAYH7W|Ea79S|i>yg* z1Vfp~+yCauBiYLwm&tBQK! z&#HeBtFGOWc~MutnW=lJf<#AGYdID3&f5pl$T%wSu8uLng~VS|;CECFBS!sfYKhTT zO@vAQ^d3FrPHK_vP)p*AoLVTJ_t9rqQvJ_gV4%#uPqS0$nUbnc;MvGovle&8iuQ9K zt*cL}%_s}eEhK;h-LC!Tag`p0mu6lC5O_2v)=ipYx_UwU|8U4FwZ~mOcM8em1oBi~9UVTQpe|Aq*28n-x3%Gg`T=AG! z__{L+jE~`;7eyd->zQ^0-=l{5IJvZ0{lCEzVM&FJvJPmP&duOTUUfuvewp3PA!N=b zzsXWabn#Y_30ceEl|!1KEn;Kpegb?FP#-0#C2of@frhjRJutifM4e-`BGv?Y&Iut% z)K+f}r7{o$5AK*P*YEc-eRiiMe-f z!A`pe6`%!%NPcMGGIY&mo9z*HOmkm2yZwLLx1MJbJI@vy4yH2c)>*m-Av>-9_D3b} zMkIe4EcTkK5kOm8su>v9x?WA|fmQPRXys~>w;_^u?>BhOspk9$<*tm5c0=K;#Z>#x zE??{3V~zv$_BO2l;g2Q0T(u3lhth4{9k;C+Y5sRM;~ApceS3fH5B*pyDcQ>zkg=p! z6kAG@_e(T24n3z1ZSepD@v*_Ji{=!}R^0fSNP*7Lge@Sb1syDpFWE?GqqzK+CwzMO z8{=UpD3&tpwGvorABqIcsbVgcC0L9u;f;JY?l!IX<=IO+x-nLb>kmu%bMdkvKD0&7 z+YrmDe4;+^vAhq%=dZdx;hcvn*L-B<3%j(>!#mJh5hzv+Pyl481*UX)vZdUG?s)wn1%{&sb2* zkCnTCGJ|y-rnng2jwTY2FL~^BK{R+OeFQVh@f;W{cT9<mdS{PQyI9Ce@9;Cxlaoy z{Px(H=~?@oD_0YymNpWkJ#6n80er!8Af+;v^@_@s$2KPNrQ?4XNI@(z|#J>-aX zVkaJAj;@ANdz58q<)%G{Hx2Q#{VGY#!!?sQVU3xeL#<_-499dUAr_dl#(HAVeeq+U zvHOfQ7_r5laJg4yw0dBn?`?o@JvB^ir)$I`YV|C5rmFL|ISnR{%+XCs?zsP%>t6aa z!t1~%cnWy${v{9nfOj2qHu=Q-H*w4Y%@PwRDP6As{QCGy!^qsdk+U!uoH3Sn3S<9NEspi2WLMx2w_)1Og8GYbs`DHULHniLYOguT zAe#s|0OwyA5?>Q>`4RIA7szCZN8N0-UB*g(n?iGm^>T#id;v_z%w!wdn1w6TP-bLc z^L?c*BevF@QEsqF3J(3O5zbcMDnfl1gjvdTZM;PjOg-9>GO1s(rUw{$&TGT-WC5z}y;g$}?i?ns(M4w6RmH6#Ye^#Kl z@nCl*U+51z!EO$OD3G*rYLt)2h$>WFw#uuz@g89|#jWr$j@byhs8~)jJKMvVx9Sa| zBInwr&W1d4K#RIhRL}0p^WhHmd1TJ+Ecwd-4-ac1(!uam#VO=>74v*i?uXuO z^d3gQN^*UqEgClTPHp}d9L8|UHS95{&K1c*P@O}pd4BG@_z1F@Fb_0vSQ@5!$0WVA zotL@NTE1{J7*_tDTK{-IP4p;!deYR!KehWY>SIv)-5uWn1@ z+cpObzNE_w#_!9@wZ`7P&1IUHex7cdPLc4hE_1)tSQq*9dY)JRNw0BZdHwar^HU#* zeeYa_-uC)`F8>bi47jbrG`ql3rNd5GNEafx_j@qpU49Q^TqSHzdBUA%Uhjz#C`;_>GRrS)j7UHFa7@q&N)Afs~i1#ppp!X4i;J0Pzj}5leV|-_%_g8n%+Jd)} z(cMXKn7!|4B$L-KJ#;SCtbsw}lxYSI!#iqVyyll%y^G?kmqp|YZwL&cZ%@6Cc0zJyh|JTylF*gSN`qSn>UJA(EKiB^?u+0%J3*)x zeZhC(>w?ddEvo?JRKTvE5>p7bZq0u*i0pD=aG@EWA%ts$=H#EM%2fzK#Azfthw&f; zrmAPx74;e&F{cYZ(^pgu=V zT<#)Oap3W1+a3nBAU0JO;uzfY&JP2AA03~D2;7_wq>XGQ&%kdOE;>MI*eQRk1WnsW zuzdIve(4`fWEH26w;qUWA45_+KIz}h`iFx*2%sQt$HYn$BaEp>S&u%TR5zvgmBG=8 zF+BQ58r#Z#rXsk?kv7F(bIE`RZ9SE*o;u@Bmd$SR|C&v?eRR99q2Dy`;7RuiB#oe< zEA9nlyTxS~e{s#IJeU2JrOa$ zh&;`Qyygn;lf~bD^abZ19Q$!8PMSrb7ES2b!+ypHyzGwz*KGzeFB zln4z5Tkf1yj4|x~srSlcd<~H4;#=fvJOa7)e&w1OQRldH-l|=Y>rz`c`Hf)>d$vhPw4&rj|d-*y_jYq%`Y3jq1xY^41@U>OUA@!^1dH%ngxH zSagZsS9?wd`w>%;b`KUlMenBhnXIfq)>)`KzVz(mKkcY-Dh#kv zfNhwYNP#X^G>#-Zux3Md*k>FSaKki@!IwR++2hcaH*Sg&o>jO{!XgK^6N2BCFc zGsJfvUL9JtnlGlmsu; zJ*S>UqG`SqL&G&IOVz7UwvKpw6(j(12+W&NDF6}7e?CjfTb9BLL1UCq+)5)Y$WZVZ z0{wC3z})IT4QnXHnYz_?maWhsDz*3_M^As-q{24ia!E_c7ANw#Uy-DhXFLZqrO!Q= zen%_JM%s4V0uIcXq!$+PVSHcOFn7~#`dN@-k(Ktf+}AMwMbSs_Emh#U{$i-6fw=s5c$DGVfRnPns$m@h%|q@Q-D zeac7Bq06k{B-AsQCo8!~f~=UEaVOQQ+w7IH=p-nzf!`{-LESbytDBJzZyra8nc=Ph zQWORWPs}X|G!c3oV%R=bsNiy>MJi3!|M~)=_pxy1NA0)gXUvmR%=9^U#u&UL5QGBF zLEY3fB_ulP89!)23>Q&&+>@Hr;c<&A!p=+5zIyF;zDA1QmkEi5#$*loV?nv=r-H7W zzDJ$os{2rUXpOK^o&2-q$>O*#&yV+Z*lMer$=&JdLW?tf=F71~|JhmlouSQI8`1Fa zaP#Zq(SIBP@5`5WDvof6Uq7ka#*DhMkID;pIrHrqy3JkXf&N}z@~n73Gya3x`Q}4E zI*)L;&$q7qn#|ktOSjGPx&2SP4RGsxTK&&HPJ~jQTz0wsJB||n0gb-*#lQP4g3ge< zD1MYGk5Ox~3AcA;R%nkS`W@QSMQ%KvDb)P1mv(We-TCO7RcE`*b@+#;z42cw^c{Tg^Ib}QQQ0>7Uz5?SQ>{dz z7=KRe9RjJu>m~RP$#!Zmj-fY*lkR(+OMeBQ?MXrhHB`Y8I)T|?#jJi-&uykIvh=j9 zjCoobRU9L@#m6rF#OCNa-#Tk>0~DHMw`N!aQV+^ved>n26c9aYEJBRv(1E4*BeYqN zxlf2&;Qr1JUbice@@!93x9b+j{#%jI%-?x#$B-Po+kVQYvvBbG_N@>zhg-5y9dn2= zPn1V_Qn#bWDyQAzi^1_UW0cP^^+lyyn~?Cb=gi#R*+EL`xF+quO6AA*w&kna^W^ec zF#U5@bhqkno4#q^3+P3%-z(XF!8Z(0^%m6hwSQ9P>r>K;V|DaqQtPP{J%nUj2vZnw| z9(q`M8!M8{a$_cmILZ&9!;CQS(n|=Ulc6|5AxNrlHcm?DT*x0K%MS8)*Fl=cG*d7 zp>(0=A{qgO&RL54PeOm-=EN0CE=08bU}kPG4F6QlghWw7z5)C){Cf*Y)M0TT2=6(+ zS|(m#Gsf-ZuEHW3;khwDPMRmqnD$;Sqw7IaseBHZL$%?7BAu1t)=2s*4ht5dVhVz{ zYq1V#e70)C^;1w00me6jh_<*w_0sEdWiaJNMXD2L={MJzkgz>BFkI3Ex;hJ-=(^h} z!%l2WrG*ZgF82*#9^y#sAYPUX<{5|?-(ZUoJ~7K}5r@{pj+3n9VM3Cp)U#A!oP`2I zkl@18Uy#}0^CMX3&KJ*JSBBe%?})R3P5oEgHE`U#MgxMSs&H8>`(XnsR^es;+jL9( zBs*sum-=Jy*lfaPmzedCt$Z7Yoy4PP*X)6>k7nU2lJiEZ73|KQ#NXo%+&Xp`t?wl8DX*;w?nS1cQ zT$m)3b0#m5aAax}<3bi&LfQHh>VRI|8tRY;d+oyyqv@8Pb|okt*BeqN!9q$;Ln_7} z%3t?M6_cO!adxe!)bGq|iHGzwvB4{VIaQU>tLM zUs6r_C1Mo%>9Q)kMS|K%u0DZgf3{Ba=SOvXevx?jeQvDm_Pk@7BJ842%=rw0a^TGr^Q(Pkr;!>PU3`LRb34cEZouG4hwc677 zQ~6X=*yN>T<)j~u-Nhb2+VT`a{s}hHSyxz+KG&L?K#zvTn_~NDK+8S{R#V46YkzP} zbLg4}-}>(O-1>4*RiE*p^3hkEl1L{T$%)(LvZcO=UjAN8o7w$7$KZS$%SrO1ys-Tr z8sDF=5Kyi`jn>80Xmn}_- z^vIPUx6F~%_Xe-^ETt%!6Z`d67b?bXFV9FH*_N+|CQIBw%fV8;ufl)HSXj`1@gg34 zuz-ePt$;zqmGZ~rqcfjlo9MKItR(kY-2!*PODCmr2%Ou9AgB5iHA{)nS(~fGuIm$( z_FlAfNKiiMvD&9>6T89`dKs(GEk8`Q zxs4(Ivb1h0h!-I+2$1#23V7+JezPS<^WUJIC0wSq4PwHvohWnjWNv zf+6zk;8uL*IK~IbA+>?w@?_mO4cye$0U_zD^e^@?H*5*O>HU2)6ro&G`hv0W^px;pt=rox_!(pr%#6YDEcrY?I~j{~~9y;+fAN>+mZ%3J~*hHs$R* zmk0=hy~N(&>+b{zjC;c=J-V^=uKOID@S48)Py#Y9t;c)is@(A!$$t?3@Ht9zzXDhF zBMN)JQ|OF^fYJc__ml;5y;krkoa}#Q0VrR6cLI*kfj2cGn?}M!RlGN7?FJA9MH>j@>)Q#oQ90rb~kr&_#?v|C#tMdvH70L6qb#LS- zzs+!mb1}qiy?LYGZs~V2_u*G>D0-jEd#YZKEH-)*ep6#CU@}2=wU=AnY?l4U4gUF7_7haLU|D2( z&>6m7CVzc-M8CgZ_eH9Dj;<0Xg)aQ{B~40Bx=3C3!^wOsdqeR$?La+ysXFT(tn%i5 zpVAJNu>q3YFy!%JYhX-}A^_nhkH$-wq(zx> zlgdKeaf=LoAY%`kl7E*Ra|w7Yk)hscTjH5S4v_(bl+Y9?+?9>SO7^mf1$BTbvVrc2 zu0k9w*QQ!Sbewdv=ZU%_JOlSVz1ta5GnUw z_=ee<*?9-glJ{&GsFXqlF!8rPEQ^7s5RIA8i!?;Q1}ZPc-b?w@u#XmE@C@d6>O&%K zzh`wNC*EGw+|scHlNNsVX2h=j_YjTbO5OsPc8RPtFBcY;PIVFqgCGT^9=HVQT*V?2 zpHGuZR#zl0#z-Xprr8&K$&x{@U;0_w-5*-juL4fyyt9Xeu(rmP;Y*hDT%JI&I(v{T zsZGnr_`1{r%|?I_VHmPsaD%!dYlDCl6CZU9ptLE}S&dC2bC_MFA^|vngu(e3t(u^g zTFgomco{`^%vhKzThrOMI_+X9r{q4>Ap-O3tRjWomVxVp8m)wu(s&lwgvANR zKsgb4P~R!o?_ z(Ha}DIwMx>phX5x4HkscdyS8sJSKaFoC1EtLYd=(&gR(v!p>IvN?}%-jwYhoeaLQn z_rK9NHrzg2Wi5{3*a}cYO;6Mbs?#-wSjEN1^VuGwQOv7y<|(ANN9xx*F}z!l^Yy2C z2Jv&v_o|muhsxZRv6*qQ9cwe5@9U$(V#Muw?(fWyDGG`#-Ml-=tgbHEqey0zntQI_ zw$kKwITKAg2VAO1xD{?YrTrB-?Hu*Z@xf3`OPoi}OjG%ZlN8$U(#C97`+0<}WD`kh zOHry@YjXw0JbA8E=TN?!-f!GF<7(L1(xp3&?$_ge!GL6@(;98Y=<~y`GX%P$v0uys zA<9^Q*&U1bU5`30b=)fq0_V{BX?Lx-HaG=4i*|)6sc?!~Y{n_+9o@JI^$CuK*hurs zvT->7>L*6^8nP)#xnX-hYKV))GL&vHq$HNUr!|fzDHYpu4x** zVEgW-^!Im)JWQgVj}W9s$k?nBHa2~9-0*D26wTx61$~*czjwUaED!HtMixfpQk zrocer4?tykg!3tLED7nYhGZqnz#-z~@35>$fQXg@3@}-F zYi~ds;tzUPf2m<{anZI33EBxs{9Cp5nomyKc}=&47cAzklAFEGKDw>7T1gsdSG&IO zAA^oKX0Yni97a#vHaGQnM1jrkR5pj501`Ti!qRW!-Vjo^Dr3Tmq^;K@^JbHAl&FlwJqzza%9in~yM z#(ArEsEXn+zsC3DY>?w)voFz6vV}j>sUeX=e@$jQrd73NWSloBi)@{=Q zW9_H1&k6rW_l*Ge-bVE1k-?2mN6C&*p|WBW8=cdd_v46$D1UGcu+78)QzmQ7S#`DV7V)3^ZPsjg-U;2|8WsTSCUj+^M-YbBN z%x@N>-@va@eZ7XR63V@UzZxUA-mtm=q z1;^U*Sv;zD@JjlJ9;rh2?=7=2X>5QBtZG;X+q7qX0=j#CRM0oPl)YL1T78*Q*HhFR z$FZ=Yn(!N%{ka%aR&AKvuwLP)@hj~FMT$8?YpMBAnK0}8uDW$a>fFCuN4XJd18x!2 zM%fpv*lU8(_eueeb;J*Dt5euJjAFM$nI$vSJQgLINbmZoH1PZOauEV#!M`5}GKsFu zLL!}Vi|C*bv)NeWH7}Lt-LKfl9B5yWZfZPYC%4YObH3nlXi@5d=!}_naxnco06dTl zSqFw=Ur~GO9FLlhB~1SM4ssCTbSiW%kkzy5n|bLFUKx)#rrG}zkOyZlbTJdP(Shn5 zQ43QTq>xfnX&?F$CCN=PPCn{9cw2k(>u;ed5l$Qh^q;T9htw-kuj+d~GAwp|H!(?% zD%#S3J$*6iXzR?bnmZo?ukDTc#LsR?&+Jz4LCb-vUd8u#ErBrxY92?#AT&6nkv*NIvWg zgXQt0or%3X%K4hcmXal3g^XWLK1=hk>ixeOR&|$8?J*tOH=de=EKCf2GU;D()|>?b z#vC^D8~0XE+7T*9mkQwYt}9ZgrDqyTh2~T*SwDziwzG;^^%~whKfq@GGpF zC}|yg3a{U4BY%^D#C;6$2z8F(|3t?PEu3>P4EKn4ss7Lewi#9P`+2f9qA9K6G`flp zH_t$=*rIJokT0n74k`HNr}sT`FXL`nL%q-4uo0+_#s5iH4sp(MFQ0uIi#JnVs2iW8Vrxlb~U78R%uJAawX4Lj_Ggc=Iw{tP} z#yU;nwLYOWI1*2lui8uw9^?-T2tTR1>Jl@`dhJ-;@s}*fFV(?iOzOWzWEb>Msku>_ zMVREC;-v7~I;|~TRjz_2X0(s{b!G4>(?YPCDM2|sCwFy9R6-oBkQYwJ0i1A^(^ai8 zY@%r;brI2`sNo;U61-ZR^28t<%LV+B(50KIRIku8Qy|Y%$;l#l9}&4J20^`F{hqKb zY1@*=9-l=NV#zcN0$D!wC(`8U#^KiA6{HLlE zy9u_+>&Cj@`)xJv<9hE(UE4P4*}a^b_5W@a;GY!LzBD6mopA-26`>wOW`O^ey;9;)+?b=(Px1R2hUuZjXay}T8-|UbVx-~eYhEK5? zTMTvu+30`1(oF__2T`32d^)-a$$9{fibEI}n9#!>mHb}p_e)+;U*DH0O$fnyTYzFseoLY(4r4eY1L)tExL zoO&1TdY#ub!ozO0Bk|}ASwXtQ-YgoZ_nDz{R0rWWs88o?Fj@{wSRu421ogUWy<4&# z<$K@w6db?5z+dgy=_SCTmC?-)3gauyU&)NJEkC-Un1Jn%niN&;zlIGPL4rj+4wPEF znGN{MM9;Us!>sq}5F2!{TX@VX-1y=5J`r&o@tEr{``p5F9WF=H!?M4DY(CD)@gRIsOn7~FC zmzTNY2aeHnMuSscY7-@aW18daTq3D5+FF&{hmMh`Vu}aUW|p>!zMkKwD*{$1_oHlW zXaFpAN)#~!hh5q~O|Btp;#C-^KFPIKC2(EboWf}?Qu97fjk|npv$k_S&SSHDTszv*f@VXHf=A2IkA_?t;CirNJ{ zt_Gr|_B`LE&4~%-T5}l!jFk0b15_Z&{KI=u^xA4nZ zc}k$3qvW8Z&0n?VqoSL!$)bS(Ghqw|FgPf4t+mP-*C&A?lo#ZQY>1Vb^h|nbU4@;WWYJfw5!=Hhc@oNu7EI z2>sro_$0=Q1TZDP1t!yY5`z+PCqj@-bOAFHUF4fkyhbd}T>}zNdmRkWFzxz zGg3cfm$_3J1I!x-PXT^YmB7;M(RupKhN(DG=xLZM~ac`;-QJw)HWPakv-<50-L0I-3iq4J2;f(M)S)KrwYf(9@Gi)kbB zNx(mJ4@>7FQo`e!yWYuFEcQh$s!2hj{5k=VR0X^HeR&ZSNdr1e+pJw4Zb=WjLZ9ki zP4KeLFw9{+VSP1Eqd`)OQ3`q@0mGy_fT{xF?0ANs5O2OyC8&1}e1L2pFLgM?32_6V z)BOwn{mb33x-u!VFn#yS->`Iqgn+Ls-$&Et_`!qSTjEUC|5VMqQLoFhlY#u`4ybWj zDb29FfSHv*J*$b$O`Cra_Le=XHLd^aq7Uw0{x{KL;L<3JGV#EEgI3cT1(=JX;( zfDS6op|!Nbs0NBVH^qXJ!Dsb7^MRi(D>NHr+0is@b74m{EDgvjPD$bhH-b|*^I$PC z$JX@m5;O#MRB_XbEk43n7&)N8;EXB^dM}E4r+Lf3h*D0vt#@Z89t`_GRtq|=uo&oV zIComX_NBf!5uzgo;iL9K2J|0LCq1+J{itht7Q8t7JJ^>778{Y^-$hf z&zCXxDw*L|#VL}+n@Jd#fS|M*Q?_q@ET@wo2tjr=EUs4kE=Ou5^d;naTmdsV%KV{M z?7lUH`|IcLk$F%%@{)cm|H~=91TO}%w!8Wh(}ZgU^K7T6%6Nw+ZSyE5bU@B>@{qas zODaKON4%GwMMCWje7<>K@n8oE5uS$uNFVSc&QA-tylt{~=DDYH-29e~dO}~dR<1e3 z-63Dl>#_VHfMbc@u-N1bs^FpXlKM;*dr11nb?nCK$T9?weBW6h%$ob_4y4iNq&nW@ zOk|cvr!uw@O*B4W4Uy}NW&Jhh30zj%!I`|eyxH2nlqJCx#$}Ix)>q@RBnPlNs z>Hu{|%PaI8rk>5!P27q6IGP8LmT3GFi-4C)cvH6l9wD>I3+{o}fHgfY`BGqIM}(Qr zK7T3yHxECLqXpFfY{nw30-2{5f9S7Ta#|=Ag&@v+<%t;_R1?O+&@I(zb#0h! z%;VjFckkuz@0E~x;*cxhYi|R+M{hn(2*Z4;(P?pZtNxlf`MZ;JS+Br24qWp)XiSyg%#cZR{JJ={>z)LoNxfB*G}{@vtGxBOd(cYKi(hZddK zy`}jD_}wI!#p_hrX_e8WCk8K=UvAm8$F-EeX%KRapZ+;!yhdqVughf-N_2_bzW8x8 zO2VuoHTrsWnoMTDw!Q(YH`^ujHgL$zzDLO^yJp3a1?v=V#=Y754&@$o{-3%z-FV|P z@zr{VfB&;#g`z-Gjio&wn)U3`Uzt6}p?F5>#fJ>ais4z4#sO7$-J&=9#8GB1rCK}7 z&!$tIcrzCGUb`F8LlNegUeQFPQ*a4=kiq#X3kEN#9~%3CyvddNGB-b2b6Ya5yu%JY z{pn6aM;&x-vTr*M=DC};uDotpnJ>%uHxq*xgvu5{MMkL$rZk^IjNu@?JJzYaTe*4! zw}^RFt=iF-xSGSDtkrkpw0T!n94rYEEKR}gMx&+Q|Q+1cal~4y&S#e z*l+XL{qN}%*)Bcuz#JPBN9_l_VJE;wiONR%Z4t& zL}ez%n99MC+*bif`Um~(Fl3zj@L{T$?1?ajtbi7Kd!JF-2B*2 z6awvWBnsKMn8?vT0e!Q~;#E|7J>Nmk(QhvzJy|~IJ?@iNSrGP~xARgq*bifNY;uKs zx){&oZ%1!|P3wS!?`==bF-;Ql(8x)jQhs0n7o$<1C|8VTa(mNpjEEe;fr*$>rP{WY3{Lfr zexmk7HY&kEFzd$xX1Id4J3hn=fE7HFy`4Ns7+G4V+f$u1M6++TZ?-D9iJwy@K7O|+ z$T=v>bgTT;5a>>1YxKJf$xJLR)U(7wST;CGdrqp#uEw4kl#{VBy%y-lDIajf_Q3S8 z{i2rv=W$Ol_x-Q-!5)xHf{oU4-#4|cgB;OS%HJDa!L3^1iXz5p`IFd89$_~c&qicF zh&K)?`U@eAxJM(B=p0#boerer@v%>6?PONQK+LFLU-dMdv(sMpN{3^xen2)L%OqcR z?~zy6oK&1G{V@odo(ac)$bW&xBvf)`Uqp6HTMmC)P&tvg>qEv;Q+!Nv5&xc# z%NhkzAVHbka7>t&zINx^JJD7TDjbvp4);E6nodKE&;Pgud70~xX{Qu zq0IHr30pDzsCrD&nXEkcp$k_iIN=cop2t4#ZiS`wVCsun8G%o1al?8;5^MopIqeOB zmoR4zR2PiFrAO&tScLfJX&>8ykk}#9mhyb1{A3mP{(~~fE>siS4Stf%W5aizqml{h zFXrg4M?Smfvf4?rf5h-s&hSc~G(?q8Zfad+Nxm1P5qr4AD4 znNU324KNSXF3F48_EHrF8+?G+pso1EBhZdPF>G}gaiCN$zkbx3AMY~yy9?&!#r>Sj z(yko7G1W#A&im^!PdS)}!dvsrc{Tn(kZB6dGN3N#sdX`&k3hQBF7&TT$&XlXB~n}Z zR&FUsIEBy)jK$l~^3}mg>h#gd9`NvZ@=oCd6Z?(niTqvNA^r>NNabKZ(=zlh4l=w; z;+$}Oa2|)f`*CJ#c=O7thvm-cK1S)f5jZw^m3}M$qD)y7AU!`=T-L13t#hjUMbD~t z@_ndSSBIfGFMd)ia0o+n0&_ijYJ4gsEhB4~)FT+(OyO_f_`Z=2P+1Nk@x{Y{`54sO z@?#PGs92OH$aF+4`KLFeJ{I-#q z3{7ksu0r<4xUSoYh)f2uHvBw#MkF<}v4OUkGdWu2sPQQxv}#Y|@yl8a-=L3r^=Df@ zI~oJ}0Y3yqh2f{uc|UIh2lXm&B6}35a)~j0xL@xyzFSR0mk;)LaaKP>ba7z?pYP4* z^t!(q8tcU|=eY4|tdgyb8hdc)XvdhWD-W>gsk4gi=NKRPeli%d-S7PM4n-|;(g9Df z8eT9ETjI>$&SGGGm8VuwNifMQ_%$)W)N!nCcJ$kUV@eu+musanItm@x41Kud+y7?W z|1bUaOUaQ`3;MclLqk|(qh>!)%(-w|QA>qelWL3~xoVqkq)zjkgXEISU?MqJ(5k&| z;F|>~1tNSeMpcOaT~p1uEji|ICtS;=qvVR*ArSMo5S_@UcxsEN z5jsVdel!C9UaFm)58cx8dy<8G$(?}dr zKikJThV4>V!b66Oas>)1d6BB5fX&Cu1WpB7N(KjfM0x zzOqW4B4lrSsa6KNx42};S7XDis^MGox$i1-m@cqK9FTZ;uy5Q5BR(fdd@ZcCu`(hW z{tdms4NBFeo&9hvy440ZuC?)CS|Sku>=6w4Ie2-M;xQ2MtVvPP@KDlFlOREVI0LQa z44eR@-al<78Zc0)?@CKeq^J@=aQu;CVs;0c>6=u&OlwxIR}H_T6NS95V4;vQiK6HE zce;C-eT89?IszxDZWPa1>6~c~zd)=*i{TSuWv06I_C|Fl>%fmnPEs*0_0Eh)qV!_S zFGDQBK#5p>7kBzKiccv!YUaWo0oMr8h8v1&8(6ql;3Nz^Z$sSB!k5@5GAb0NYH72- z+%iwB^^YK7+65JL$N=;8_?^_K6Y@u79qDR>|UM3{gidr73ss zx>XgN?70fjEy~1Dgh_@#g6)Zn`!JG=DJ`5?`5{r%u7{8cmBtGtXNgQe{>zAl3MsTg z8^d8^D!r=mZEeQCqX#!CD-X6 zhj(uq0(i~HcPnfUerwRAD{z8HMoLzqJ6Qx1vq4JvR9Q*9;47I0F4HiMpdaT#$%*D@f}D&%klL`4 zD!W)^PY$1U2q;538G#@dnf_m+9aT#az&|;@g4N9b@ynm0L|L@N&jVOjQ zo^qdOo``_WR`#waC1+*crl@KsQ33j@#3D?DvYCa+r@TiW7UPswad?VP6<^1y@%Q`w zC1x;5NJ0Zn8Euggl&4(P;BPq={s=1{Yd;1auXdyb^01U~b?sNRNMvwjE=WwTf1biO zhVXX>YZ>V^WbiL7g0O^PjCZxIM?XA?2NV;b*~h;4l{39C6X{oep_LV)gzYS4B1-!A zBE00q-B^e(eJ}37Y(#`7np-E~+@W>PozgJceo(T`BJYqjMvhxTVv%PvH-!u^$}_S! zT?|BISRW-FnM!KMoo8fW{3)qr`9QF?!+h$kHg|gKTy3~=G$8bGyi63n-z-{T1*uKq z;0^0(1|3bdroN@S5zWa>XMyD|{uBF1omG@@p8r3a9xPH>|F4r#JO4M)et+(qaM(Z zfg$LD3?@<*BC`;JZftQkH=CX{a;VFB3GOI0Llp%S$SfNF$#wk%!$yIW2U}TIMfRNT zLxm`J^(VVr8$SgS^apaUlqiO`dF*|r%bXW=)dI;>2YG(#2KwRyct&d3YQIGM6Y^B* zPKuf!Fn&hFf7gP>O*rWGiqHdS7oO-rdH)7oldY> zW}|=SHKz>m4Sgq-yG4)vIK;c5eu2L z^n7yPR5oat;soI*0B)|B%((%|B!7R`uDbroORVcnaW@T7Y3&dem%cRgmi;jRSPUZ zF}^IC7@oL~34>o@I9)e9b*@PTkRYL!Kr;`tp+8pw{UIZmuqDVloF`BRGdC2-wkPY5 zVDYqOWs(;-1*cnIipg$jas<*+Pw{iYYX||^M+o8F*TO|?Uz!%}NCEMSaC4e`^nt>t zb1^(AC8QgNvfrn4gg&DR10mCWV8oR*Lg@5uYUl>v!DbOhmEWZ<7OKKhSD+X_E9CyB zo+1PuBd7UVTw^I(kjg%67`k>Q_9nfcOjUz0sBy=i^|jrligvPMbAO{0dh|$UeKu@k z##XCgQu(Ws%dI)b2yzKDW{zJsnl>`hc+#Yk+7&mjajR{*Yjd~hJ zm}~9y6{DB5g%3Si6G!fnxVccHf=ozEXiIaU0q$9Rg*ln&Kutm{(YRST6J@t_Rn;u# zV{ zpZ$xz!&yNA^B+c+ulv7`YA)NtK@1@e=$hhOyS~Mk^;xDGPDoWZ5zh3-oP&~rdZtn9 z27Qbs3#1MG?T_-q1QVG_`h#?H{5ubr(!HtIzKh7Ua`oe`QH;eDwwA9ak`xl26)tNNU}n`UTVoegumMm7$(Ttjq$&6oGI8 zv3OVZ-_xpo2=7UP5A@oB>~Ml+WV=QxGEo87>H=U)c^qJWIRHL`IW>;&hEF)Te@r)? zR#yg|mz4mf2paZ+Q^C9yMUe7+x~pqE6)8j20;phWYdW${j+z%c*3)b_s+8!?0Qk)0 zP+oqk@mlKQ`ViWRm!fBj_t9E|{WhaE5mUL=perMGP-w^(>cg=8!(*hurbOrH{MScW zJva#C2j0pumNVVA(U{xFky`IB5`FxqmfEmLflT-M?ZqdL%g<8!<0hFlHN_|d72Z2uesqy`oxZvA|3@Nu|8s-< zY*?;Zl1w@yK2c({Fb`9AYn!$DI}|3o)N)JAVp)h=vxWWAi&){WTGb}RBUoQwGAYY|D-dGUC}IY1 z)MlpcE=~p2*j}}Qg<`7}uES}GJbnh1KEpaTDzZxj852s4mLES|?LOv{4)JN7T26MQOf-5|0j zvg{YNsH||BP=-YM10p)Al=0=yBv#pSN*EVYb7z(!Q*(~)c232w zOeR{Q6_3vFDuucKr26!KthT~QP_TCrz<(@dDTXv;iqUO&)dU6>j;i?3RG~69r8EFc ze-s+JVWIK{b-kmJF~{aLbTuW-hXxq@WhGAmb;ON-;0%m5VwtFr7H|hMUtYChBbYSF zd?jusy$wKaix&_`6`U2=9tJ(IfQb!L2vn4f=_Wp2MK zesejnox4StPl(TW>KAm)4>_|1m{?!N2z;(|-pq`NQe~7$1V{gxddn9>ZC1E}-^tXv z2U3VruhlfaGC_su$7v;=BopE8p6SMqC9!@Wv%+~K?ejZJ1s6OH;(y0|eEp-DgsV6f z&kj66reG$@M>kHaNpLQ?3aL6V*|8As*F^~4S5S^qcC-r zI`L-nQe+f!(zCWSeiEJ`>y8 zK2tO*T=dDweXeHUL1RN4A?JH#Ti}f8G>owdKInCK-r=b1Q}`aqR1fv(UuSlLhLZ~v zI%i_6mfKM_B!jVbQ@m$F3zGSfLz`(L*F~0HUvNVhOjXqxSr4ZJ&#hG5eED@|?SRx0 z8-WM$d|MWCEonnX8$s+%trxe&)ZLUkq8arPaWC^Rf z#Z;^8OE&jvvoK{p)`mBW@|Ke6%_{pxJkm5g+F+ZAuNOkhJ5EjeBx%r&Ib6t#x4$hf z)x!5a5NegIUX(NbYxAvo`ga22wgNWmQLgc_!Mw4rH$`OT4sp9sz~jWZ=uK0yeIDBp z6xPM|ky>xLGra3(JAd#~w;7tCc*dP4f*F4JaZ)!?PpQmjwljTgcx|*yg5k0^o%FMU zDqM=s0`X|dEWl^Mk-FI!ZzuTS(`79&S+cH(Fsxg==CGVc*30iqcR z*&)LL^B$RCm*;;f?~og`l4wH61rVJ}U$3%gvGh|M5!?s)qp> zS54_firPk{Ai;fbzbwJ7w8;K~5nC0uwYuNTG^82qX&Qp-Zh0L8+%q>vDvhWIup<3w zI;_#|MTneH#X22bN0yOhqsi9F&gl5OM=k8w`H?{QZKs`am`2PC1o2nK;RdH(128fAwdZEkh&3PbNDI8`8)Cmh-OO7 z9}7OE)GGg+gcClbEu>!lJ9_l-Sp!qjIQ`jY?Gnk#Uy0l0oPjtuncRt?+`WYW zEl}JY+TvQII23nxFBA#x1gE$=0fKD)&-Xp!-S62RBM0}$!IhJHtSf8Hx#lnB`*&L& zj=K&GP&xDzvt9%9JWM%xdCr?v1Z<`CZH9bgl`mYR&Gg@VXutC`vz=!F#U=yLQyHmF_in}&t@F~D>&KWHRWd}J=?!eSW+(e zGz-5>PBY%Wvq|-uZWQp98(*(T67#ZEsh5#%&!e71t-%Mxuv8sieZ{!^py|{aEiP?K3Q3?9$Ud7SyX>8dAm)U=fEO(MH zLfK<%=|yH316eKoj<@Dav(b1iS?n`rHzF54oqVaLhg^Ue&ap~AO0q;BNRO?Amn_fV zr-HG4*<_!@8)8G<9)+5>Z^-DjIL!gwPTE!>{qiQY@e0vIo4KK(iGJ2+R&Tz2g&{ExHB#xt9?8PgI*7uf%9RKv z&Alqe-M&TbCrirtehI74ZB8iYD!OX?eZIR zwLfiq2rsSx6eS_Lmco=MTG^z_8zmrzES|P&`Ay=IYjuiszICs(MMbZoc#_JH& zI(zLv#l=rL227SojfFnRfRxM};5lvVgIlM^Qt5Vt;u*bBwnNrQsx(Ww*>0Rf8@~#r zu5~_}Nrs}jmS{4TyMXrE7gTh)eriWpBS&3J!;QeA3_^mhS|Qy|A97;wGaj!?WewVR zs3Upr<4Uu&ou0Ah!3iJW_>5iO9V!2h?q;Mjw7vK*%7@=#Z}|u;aE`v}+~uw@*!!(e zE+DSM{d$wWsek2s`V9yXdt=#aGgcm;kh!w0Fn3rj@`j)6y~q#pm4FX#H6XX_E?TxF{4%>h0)uHO z)Jy<``#l^-NV`fCuy2+w5jsJq5lv?#a#lf>jw~a}rQdu%({}X&Q$s>IoKZT^X+LP}l zN3nTRcBFj=3`OzG7H}8Ro~S}P4y1{GNh598{#`VN%>hV*l6JZuzZ_SSrCQPi$r#4Q zUlKo?nd*@8?O}FrT0mx#FjS4pFSHSA%_@IQGM3aWyEEic9dvxv55Hyl2i2}^Vr58~ z_GQY7Laq6Zf9B4aFfs5oICps+E3rCVW1I?+=3{F(bAsm#s7@`aY2n{p*X_33j(g8W!{OZMN)9TXi8g3Vit#(gBq;ghBhIOXXb_`N6rf=j{hui=wcY3ukHmUqxhZa0@keo|Aaq73 z6=w5`SBw(m_0JIVpFvWqCfaOLU?HiL{WQ2)f= zT^pN-&eA4@XbTDGZVbwg33HPSnzXsdNyxqTI3Zgds0r4uQ>B} zLinI`C|(RJN9y>~%~UuiG4t>hlm4#UC(ph3=*V)3D4WAt`&kWeT?FGeKcH!$48^F$ z<&}QUrOjC<8^5v7NS&R@!QBlwb5~qcJ@qk(P=EW5?eGVRV9&I8HbbSG_=7BfV0e_j z*CZ8GaYVPxt=J*rqk!!8_5j{O>KoNOkM_{g#G&IC|3mK@@Mt3Pd0hF8Z<(kNWl>I@ zuOG&@Xdg6tx+J*<6s%2Cyktvs2LP zP8qJ2Y`!(w{kz@Fki(gw*b{Rf%Pinv##C97M+m!BNc7gJ^n5#+ayW+#bwkB4#Dh7Q zXg^zsDpioA%GYAQ>(Zr*J*V;h@k{FzuWnCtO%a}TeKK6*V6=F1E``iiQ<($wApCUv zUX8B9ZW&{46Wn*IK5p(;!dLAPrKLk1kATnX$dG2&*y}@UgIlbY@(wO5pNjmdtaHMLo4W6^s620eF*)e2 zWg@x%xH0s7mghVESj}3$Q`~KQwhD?QTt=o3`TS;znW)A2Heb9D@H+|VtJFg7qRYf; zBj{^1;>7zEYY9D&pMPvRYX(ex53#78+SFxYQ?ylSvmJveBmQV>WpY!j@r)8 z^`ktj6cSAyXP+WuMXAjVq$_+&*(UW(Lfy<-2J-_c}qq#h@&z1UaqabcMB zCTcNS@%6IW4%i5FfupEvtZewiul)Uv2Ew!cM`PM0_WaHnNE^385bc<5G?H!h3IG&< zO_I00;5h3>=O&+N%Y9Y|u5sr%*)sQVw#;rNP)m??3UW@jvC5*o$bFeNJS*ly2&Lk{`!*u6%q_1|hZ4U8Rn|8IHz z|JCVpxR?+{_b@dBfH-;acL+z0AXT3#pZ3<5z{$W2Y(iwdQj?g5C?Ann-~>uw#GXd- zge7yLR8miv_E|^k81I|HDh?*bUW&Vw5h{~0BG1WGh4>WdK%>>{VP0)=Wf4sD)C-n1 z3WBB#b~zs`DzamAt65~i(U#9us6FBB+}F06bKj&SkiLRAHov}D7=YfSF0X_^T^_(* z`QQ_09tD@XPoFpM$7!(jZjQ9ZE9}X*j1o;&4O7Pki^Hyo-S=C5BVo}-OSNRPciU7X zh4QRM6B-O15gw{n6*?B6ilNbwNQw?2g*GKDp!7&NqU#8q6414h&KV*NR)yV4C^DKg zV(2fRc#2R<>*55Mkk1j)pQLL1SUzP_qq*EPcBljO-ztj<@Y7ZeKm~_)jT@@20%Q_X zFCRLT&H8D$*7w!%zn%#yJ~sS;77{@rw%>964XE2 zcEg(o@GbRmsd!{N`eM1qKGVXs0_9G-az-y6*bir?QzTbF@YqoX{D9DnRmaQP;5RzO zmYXB_ruYdE;LKVfH8i=!iiAd6&*gJik9TSSPI)ZD#|~u7EDLrVcfI_Y{`%R(enr`p z6|uFCkdRN#pKZ5PQ+$)#81YI6_Hty}cbB=0lg}*{Yqk=^h#5bhE42~YPG(2l!!~u4 z*ucLm)0}OEu0O|Ia=aH(gS@$+%no^5bb-^H2*IM`KF}bt|l~Vmaz!|04IQ1G&DBv8!(LsxAKkTSg%J0j^#>+~Y z4Hbu`QGm`gyj92Bcfn-*0^)X3cSIt)&X1mjirh+#-f`b=B90>JXWe)N$cL_j71pV@ z6lPowmT}usKUvBtw<0S`buPUK?(VwjaWUbBr0u3CW(%$&>8@F<x(M!aXvg{8#n}Sf=Io`;6)-JDXLFKOp2duXoGyzg_@XFR4Ko{6%0T z&W7Heg-S-9-o~7E|5TF*f0OM?w08ZnoEz)A#ZUx)xZr-~Grca=+X#P?)jjV!I=^00 zlm+b)zZ~JeT|Ip?6?*}=cuq!|e#?Ho%a-)hb-Cu5Zhd~FKJ`TJ+*0X8@$m5Qye>0~ zUVDCA8}E|ze<1tsDfYjg;r2g|JWpADR_-oczX7>0+%=-$1JK%2k{HCev z@$}(=_OR{VHv8xaQ5R6#^8cFuEZx4R!U|l$B};PqE}u;Bo}SE1RV646^9$!d5=u&S zLi9QcAlVY7i%6ek;yq+V3Vr(>XkGRyL4W|@O}|&;fc)ADo0|oJ7wBX4)2c8@j=NRb zQH~sQUXb5bi-|SefDA8G=c+oxB}XByKanf=vkU4u-(LIhM?qqO4`(RRbdK@Is5v5A zI0pWz<{`~83UU0c^PUx1blwj+?N$mzy-<{yG>Eo@p0aH{f$Wi6rE`vFz`TKKS;Ofo zudUTV$5#t?6S*Cgv)#f2Xhr->Ds1#hUiyCMBj!Tursf}^deDXLmFk-ZXzL~8hZH?s zSLnSIG(BtsFh!cF9jwJw{Tl!;DdbiLxUurx-4&m__jvaj@5H8C`7q*raRL)O7ob&rchXhUJ#SSPx{?8pc z5@BbXmBQffs?O*%`k~QY=LCkC*eieV+aBf46NbixlH?X6`R{Q3(T=f?_-r@T?LBIk z4N*fZ3Z5RI=Q^xT%MVv>?z<^nx43-pf^I5HjoBmYFSZH}J?(pMZeK6AU|AkLa6 zbegY-1X34*WK8t1oVB7a=xYv3q#zs#jPchRH>Ju0j zG@Iq=_2J2SDq;F6`D4*ughMK{JvyT~M`^_8%#_3be1|S^%bV-SzD*2%Top;ot=wH{ zy7)X*?xb$oHoDh>k7!Br$FZke@p(o9yiJHL1BT(qQ5_yt=2+#AA{GCMALGbG;vJ8z z(wLM!UHP%yQYNK^9KtxKY&P#~dPk=#w6`LWP@cF_^7y9B(4}tfU(0KFq4^uXPzJ-X znZos`R$yxsc|QqC0utd5MvP5WwB5CYqj4+^^}+%^_~xN2^9^9aUl%CX{G+4EoYIf* zp!}?deO)<-ZXkpFS8}!)W2)Yr%sjb!i_dLDtmlryOxuMS(d!&xWxQCD&h_=X62bP$ zQg!FE4Bec-o^d{m42+HKir7XJTF^NAFX<{y4>6Yj*~S3Vnk^}5Wh)$^nqozv@}H^S zQH@KMcFS{cbdsDE&{oI<^maMiVXd0t!{W!X@ee244*NcD@AnV#sD+qozkk!BN$8%x znE)BV{+5;|-=}u&uXJwwp;;R!r`w^S!~G^+X}%dPw3F3Y0KpD5H4Uh=@nJA?oP6@y z@irfgQ_5sIIX6WGl@2&r-pLP>=`hCQSB`&v?}3)#A5{mRCX;;Hl#CgOrQLkFQ2t~; z?Pvc>wa)5EU%e`v_VGWS_s8wJFYAiH_dg4{U95UE^c{!$sy!XQ3AlK3-V}gn@;oRh zItzV?1-d<6dpe%BmNbp~Nc&&t!Z~HvIpys{sKhsiyJUwR{HJyNoi+c1B7dy^5@pZ+ zJK%Ox^2y?1&f#&c=*ri@YuM;)uBns6Apo&-zJVV=_TNU7e{28R_MIf`Ru;aN{Y;E% zviiR(Q7`69-@=&Uev;uHO2a-k|_q+*3jTJsZB&P-?B>{TJ+9eQo@*Y}Z}w zEjjPYYLp8o-DZo`Blla;ctwyes7cN#x4^b!&MA4lH-*so@qS(dHj3A-q>Dz)m87bZ zoC>-?)wOY+;U8m}hW>tKPy&8MS14-qcgZFglX1ocEl`8$brP>Ib&FLpd<)YVt6nRd zQ(cuSF@6#fU)vrH5Py}*<>|PwJg;_HiNgxf$r++U&CSYuhCT*?GN%**)~~Q#Uyf04 zz}gZRMU^Hn(c(XHvd*lY=SN!hz}(XN45dSk7I&8h8}L|QHt0@)Lzvd@aDWw2mn4*B z&>Xe}%X;t_PM>c7?0a!1LAaA>LhoYJu3zq|59TkWxpLQV;`W5)Kg!vG^OA){N1thv zv%budYG!Mh&V?X=>ioYC8GQb-dUkj0gA%j88wBT+SU4s}6VqBWjIl=CQwQN0_^1)N z$dI>9O)`l}C(rwxu~DKWRdk|@=c3$4hKlm{PKIwXQHS}}SwgHB z^^PC?_S#fJ8@j}Odp=c}-c%^NHo=twT)id?-GQ~kB+ZqOl*Fv*4BJzsdAH1}>z^MO zV9@e<=76+NoYJ41ACp_(--Bb(ORU7_k=t~3-LzByf4Hy^h24+-x_H*&6!CUj=cuu z3HTu$Xf_N^z-{rf$LT?L|X83t5pEtz5-1dyh|KJ{;$9Oldxu#4j zH(>(XGM!3vi%l`<8Iaa{-CpQa_l|( zj76p0M|#P3jrBiZ24N?S2eFwu4WTQY1=2x@17JNAe?deYg8szBq0e@aVa_z$SAW-k z71B0(uq3khV7d#v6aR=?I49Nd&HZ>_;qcrKOI<$wIdSpDYoLR&^ zRy4%7=J$jUMn~^+VZUuX^s11#U&SA%&BR~kcarz^pHuH_WJ?+xL%JTl^NEMu+<%4n zs$9+#q`DNk9jkUf@=lYgub21|i${u<79_G0Ky%q7H?X;kZ!$^NzpS3z#JB1`C0>04 zx@$R{8Dneyx{sDUd#uTkGS9?pEi?>aC3|n30StKRoeseD7%+P*DsoXZJ^M2*S}`<0 z`Cq#byY{%U_IKFq$r;f75_+Az!QOSje!dFtgj;kzzl3l8-St1&{g+4k$O2f$?p(({ z6YaVby}NtKWy5;Od1KGM%%nY)7{O7Kd=z*|bV~sMB+n2yk4YIHCZ_;=0Qa>txs%MA_6{B2w`8sFlqtPB z{Erz6DAidst-$L?yvg6BT#6Ndm$>?_p|I{GJbQTyVhmbyRvi!%4GXI92h4XOV*KK> zP25zmh6{|9!a$x<_}}N(>lKo(ux?kIfQ&@l?kd45un!=jb@M{=D{YGXFr6J4q~LQa zq56w9WC+K;)%Q8% zo@4i^vl5!j{hbXXBnOkcY=I0tpfUh)P+Ocadl}FTOHR@_|IfrFx2(I=xcN+&-)rnV z&9o_{ynS@K#-1eWn42FbBxfkOlRKOkG*ATwHg_v3vOK<+ZJwu24D~YZgZ?R(^*f#s zeg+Fl1|;a;7V??xgZ;F_?eq48c~y=UlAgS9A;6OAqv3+79_ z2tJMUTTu7_^OO-pWm6o1@s8Vwuer8zTu3@mIGQg`VfAONmmA(+iLr#qWvwsYConIR zz`Q3aLlr*PNTxKfQ)GHktZpJ6@f`lvK%Hi`H#6;V=|RC?))}2C7Jl)u8IAnHm8VpK zZHcIy$S?4JfLNam@fzj4o|l!mmu~&I6ugHU=)diQHx|pM-$v75oB}j$dtbjP=-O93 zvjW{hrNE4>76e`Te_BgL`oN=)WYb!tDrOgAP;b8D=jR7(&5ToMQ`Ny_75~iQM=CzG z=>n~uav8WTQ)tk@ko^~CQ{yg~;x{aWB2F-(vF@E=0XfYEQp+d76REBNq-1ID|DMhp zw3^+-0D1U?rEL#BWP!N@mG^ZG&N|fPl@zt; zqLA0DA)8w4vYoLf$mI-0q25`la~0EFF}tUh@nQq3Ip-KcGV6AE+)5TYTqiEthss=W#)+u;;QLrEug@DPv|(24`1p zRGza~#nH=R`aC^cHBkq?=wxPFD211Mco@f~?xM$*?YyLP=}0=@b3e}q9$0khblL1D zZOFfaO`*5xU)r1GTP$zp*{|~+w9mmTteWl2`ytCqs%V; z{x#bfsRjcI5JX#dtzl>P>HC51&%sb zRlhF)fJW_YTrUp9I70u71HV!C`bG;=>H2-tlUzr64k%S2AvX&zy7>E^QsI<_vm%JH z?`ONTi0a72huxZcqtz<%7@V|_mWFm=pc~tp#4In7_b9*BVZlKDye{(Erjl;`(a1n_ zxns)oJG|tzWEWfpf&q&1eS%;}gjZK}#Fs`w^TZ74m9^g%lzt5CDOOEv0ZWKS;cm^< z*}4zr1~+Q&&ozbY21C3{ndlfC(`sGGbqYuH>x|%)cZBA3xYrL1lXGv5WjIVS25`rRUgei zyCl_=aWt`n3=euGb0lxl-v4{}v+nUH>auTY*U_{rh0g7YW*dgT@Ff~o5%Af9)f$zY z#YNWdy$PMEvMef*@Vt-odV9^xmyw@08G&IaiW9XM>fM#ygTB-p{N&im&foen0Mgu# zt;EaV+E5T?79qU!Vy!g*NqFk#0h~pHCf5*1K!tO!zk1TJ<(i|sHowaHi8DLXRx1@d zi(DT>gPIf0LCKh0$v$V$(Sw@=sqo*C3JgA3w&<*;3(lKk%!;S8w$g_4dC>T+e@J6T zQ7{MuDR0QNqwh8F^w3s57NiAPtAFoZ;GWUiCAoqacL6PR(j0z4Cub2tR@mRTsCeco zXnJe=3SCDblrYH;e}3*pT#pbA@zmKf#fcdkBfO*J3(;9C0rA8O&9X^n!_EC{J{~Xy zsN9>O**0B-BI7`R2RnhOIBuI=Y1f(aO@ERJh)IQxm|#DG9?lL5hvMoYAgmGi6osVAK_U_FoZ+vuXsVDB6OW@kYLCH)4n;YJcPqC&eKVVBh~afxON4L_rj10GG#}p$XIAkl^BgQR z;@np#V;w+d7ST!Cc0OJFSRoMlF;=ESmWbUpym-s@hG-79k)-5yW*9oAi49We+cytf z<+YBZSMuzWz(eHioSa)ukm4JNmjS1ytZHg|PPmK?-Z+~64z)l2AiQ8Gv)xc8R+_4) zLF60 zZqZNF2)fky{b+n3ejfsz$Kbna)fM$Q$cRr)KhkTdlWoj<TGw35jw%;!%Fn3qqX9gSqd>)Gm1qc4qQUGG$Vo!Q=t5C&1#;fixp8-qp z%Rk!os-fzQPx|RA7i+1bgkivD0vaA&^iQA~makad={NnudDb*4bAr2q4ITe^W``!W z=(W0Qs)^=!rRxzZW%1}#1DSm^j+e_=TSHLmU87ah87BzKWLkT*lWkY-4^N(`;e=c! zNPnAf`9A5ok;>vMAmb8A2Q z&fWK4o3nfRqQv?9Pq1{r^UKglxBcn5YQSd=VcIPEwBzu!b9Fb4Xdm|(+kKW8c*&+F zYDcV`KGjz}zuZu-0*`*=7#^ z#sNJAdAxY9&SRDK$+U)LV4!V0O^!u9EQ}}~^90F7h{wZQgyF#Ciy{R*bvq{H6zhsl z;>{2ah#BY(1VDZi0I>4nQ*G(v7{g4#U8v>*8LM@#O-IO|J7j-E9r+=TF{1f!#Q=5r zrUx1cc7YRHGy^VgYZbPND8Fp#+;V z(o~bMsJsj?zXRcn;v3Ogds!|_uXoTGL7?fy=jyqt5`X|9HgNe`DTyZ1i>#SJ1K%ov zB&Qq@3VN$W$HFjR=?|hdfjs~5>cXKKw6;U3`jK%PsmSXeE1GbNR0W~g(qyFeL9&(- zIT7c_`7!cCYRRQ9c|Xv$N;g%$QToFI*G@%S(Ob|G@l7VMw?RUTL8*_@;{m`IqP3eqZ@DSEmF6n$qI)NS z^l2FR0cyIL5a1E)D|VSCp^+`vAvqR8XXg?Pe%l(#alW{tmp?JpG6K`x#?cRo1pXLh#V!a)uz50+qYr;9f{$iR?t0dGyaFn&l zh$|>JnT|jFw?$U)fct@8e-aa^7gX7p9b*w3PyTKITE}Tshta4tOE@Ms^4cwda;H3M zdb(x5`(kUe$KnRH@8cn=>P(UKYy6$HEUI z5SF)oR4(kjT6;&aE34PbClP6*9uSIAtB6CtShJi{{ zcM#6bQnWL*LCDf!a32loTn?eq3e1`_5xRp=I+C5#DO4Rr>}+_YX_Azycr{l}#DXMS zWQ+XE9^bnb<48^^7$iPgfKNJrHN9NAJTVW$wE;Bai=i9o!dWe5EfPO%iz*0iK7Pb+ z&9;!Uy5Hyy;)={UsY1Nf{?U4~t=)a=e1sTu3lrZg@851Qoz^J$t;H>j9BGrM&dez3 zx-$Jk`R?Gpq9fp4hr`|SOqJ*~rfUo|YbHO6P{$A9^Ky?;o1{mYTMACC`HJ*I!zh&49T_F{&4NWG#jk zQA68{SbO&Wj~?_Ve29eff4u-|4}EIB%GuA8w2vCTFI4ll|I_~nPkZnmC-Aq| zBw?3bJAzd`z;2pP=Z=|!A^?EB8gSB z7DZqpj44si4Jef<8`o|&7#|KlMgho)?RhZ|;V0#qFw$_32t>f6U4I}Y{VWg9WY2Jn z4lAZninCM9V5)n?wIr;7DPz!P&xI7MJ2FP8^NDj<^kNN~F=bhzoet=2key=4b^+C% z&#?us5CCqz2ihW~p(GMQ+U)x3SQ%8h+c7#h%+SFNECg1>3sxv*oXQ^!<)HXwBeqCe zF5dF2`0VPgE&RQ;fo_4_zXvmU`SQ96x2xX*(^Ezh9Mvo3L}pNYmE*QTvH3H+;FLf2=<-roOo&P%2!t2dA}%QB~bt zj1W!jqRA)Y{$l4tCJlcFhl+J%FCVUk8STdq=HFWmX+du6d`-xOd(U%53IQs;k2Mq< zUU>D6+LE2yj9Z~nP7LPisbmTWJS5vf@kvFYknZJMrSinX#X3heQ63C|phG0nN~p1t zx?ZYk#a1yXF{5gEV9_>`BH6ExU*oAcy7k8?)roX6Tc_k zCsRuI9c_$+{Vv~GwPHT(d|^3ZW0K7;M_%co)obVmV$JdPtt!VYGB`3KsX(*2;|1p` z{m>doWv?!{D=!MiO0l8NqQe8`R#}a)m$dh$CaQFKbE^d1ut}*WI%Coh2H`c#;^>TB zJPx!}-Z66ZuU_H=Geqj75CT1-`}p&gh}%zAK313BaZ;2)Wmq}69D?0E*TYsydu$dm zmg8=$%?jp5fxYtvU^b}wTYXfCeNh~PM%rp^7bK}Ftgru8-M{$@d-@@*vsJL3nLxgI z9E*OnLd9koo?7SdFue%i2wlRUK85y&d+5zIIl(X6LojRwK9%hlo2|24$oF8Z)1bvM zwqB_&V#AiETLH`*x3Z^8(Pg0 z^eLr88?$Dr@&BYh{1EO;uh@ zkIozl!S$UVh>+7R??3m#4(y{qt9{Dsuy(BMJB(o!7BHItGatu?N@Zvt}@ zsq1zB*Xht00X%m<{^0Rq1G4Y?3kdOBa`Yq=UUZ=-+#T*}n99g=MV=_rQ$*v;roS%u z>{qt+8F;dsBC>=gc3pa6QRLr#gzVviVkfcKG{_;Kk}5Pdn}NkvZcZMb+B!Fv#ekex zpS4U00wo`16gW4UoCaIBZg*|B4J!Ns^$Is>L>LIk-x<|z&~{cH89|;JH+g^|R+->M zN`b>P(+au@X~bAM4YsH!Bl+*gs*%l)X&>Iev}8^9mqOh&j-aU>o$SQwK5sC}L6X}> zc6oeip|ej~pKTwPx~F>D(fyg+w61OwzhW*qY```F>LP}4hRiOFtdx1N6Nb{KZ`nCg zSg=%Hv)8(66r`<6mKDJxmc-qWSBdRpk_;fV*-9=WOF?D567=JXGw~C0*+LvsnB&*c zE*j|(HVk#=+E}c2qC=S7jr2?o_e+qasVd^2^71Xu`YA#YJ*GE<;yW#;-u?AQ>N*ec zCt=oe2I@%f_t$=JDZ_GyJAh9t3L8x&wcn@LB69wU-lwJopc3^c59~kjhsk(TK*q5p z_jR)BpG2=`87Dc{ejifh%<68u-oqI=I?#|7X)UU!bv-%DVu)LBS1W6c-EEkTy2emG zo)-+X);^9bAFLtcnHa0UY0az3#ri^-59c@zrsvb6E#zPuL}sFytyFIl&chM+;}rKx@%Kdj9{}EA=gHw2 z?%Ek{k?r%y_yf-We7VgX0Peg}>3UV=cWf)U<01I~Uvqo7QhOFKJqv!l{({$G`X5(W zLzSQXy=FklIfLW{!)@m&Lc({~!~abdynT1Wt;&bG^B;RB=)dmgxx&GZef2!XWBosU zr}Ln!6YD=|=Ye<AG6IX#5|#|2lg0DWXUW{r|dx;$-wod(5kRH>`aU(oROZiOEax z4HDi(l+Ka0m-4Aq7#sn~kQgyj=qTBK>i2i?MY{gHKjqyWvU!!mZcS=sP(R|+;yM@qu|=i?YcgSBZ%j$^WMafs3YggQ2ASr zUVgeWLu&V;Mgi|s`iD4iLgXU$w30`JKKbA52;15j5!!Tay;o@Y5VQ+*Ug*!UcvHmU zzus}G^C3AiYm^9}RNbS8T(Dm}1(r>xCDZ>=nPFBxUp8+D!2zOxCzPuRmk+zs3!2ZL z_5|>uKa>e1jwZ{F%r?a_WVOwDF5CZl)7E9pUrL}NbeMB`O6M7`{pMc)# zV@5d84{z?qYgEgPzappUim^7*2F|4 zC%zi&ge2pnp2G1HF?CHN2Onjkz>x1w!>1u$5ZlFH`5Dw zni9csS=DnCQZA=jm||hfA?`gj-gB-dX4V_Z9l7%_DLoU3tJ#gQdYG$;^s8Exk)OpQ zN0J^?tb(xGBdj?L1Q$_VbkTTdd}DzZ^#k`{5TYV0@*)uHD2}V*u5zlrHKxdT242`X zf4D4gAkO+p^Uz1c#iUhuj!$JT)j zVQhYt!&pU3TWJ~uUX5o*vtSy7;3R`215>nwr!vc{AP$cXwp2|=-32aQY7fM^FZ{Cg z-bAemz@BHkFZT1jExyDR(z|}Pff@vn_ZXwHrfMq}e3}ATkc9# z{L24M(>TVMSiEa29w&-N8)g=e<4|$3U8_U)(*Tun?+$I;Sh2G}#&toQ%#eFuSK){p zHf&8DxO;>RKl7T{;k(goU}f`3vV5%#UHDn7EtkOo8{u9Fy>Wm!PKN}d9F&(?mz1y5 zmHHrw zZM{^wffV$@pNrUq}=mq$^_kye6ElrtRSl|BrDYJ zp?>nYVM8P6qR`mAnU7*p!AlE1R}F2SbAgYn`-`#V(4RB)O4oUNH?pYdS z2B?6zz3X^@{T95a45c7xXu~2WRny4*R)Afi3-_kqnmjwD9-JF}=*LG-a1S=4$(>m1 z6JR~cdCb&~PF)n#JB2$U#%WGW<5yb$)%m?zOm+!e-IAb$LnBy@F(^nr48*4|(w*kA z5ubaEGG9+R=5;uhmL~-S2QwS|zVx_NR={$N!D)SS?G#&jB~9;<`;`Y_$IU# z-Dary+Bj3B`Ka~gI1$pX0)D9x32uN0w(983Z3*(|k;qJ7YWFu}DG-#1SU8F{iQTViqGFP2xUHMZR=La!|1KDcr=i5FbcQqxSll!tMdi8QxGJiP6Q}`=zPzi!Pei3~37y%u zNy25WHJf}O$B-q`Kna|qLwArCdmpw=9@KgsWqs z&YA0!rgx?gifjT=7e}^@5Gb3vz(uW&3AEp1$4RADOu(Yy6A%oZIl=7bpG1LnGT@*C z$fff97CZV&#E;rT`RIT3De)}wG1!gB)=T?~U_MnuDZ&|ZO{CIyNyFd{BxiZb#IsuB zVXqlQQsCF6Ez@YvLD0E~Rs;S@UgE>p48b;jV7-nZVVFfSnBeet zXE0Z4%@m@V9-|LObdDuNZYn}QSQN+N&TRO|5T-g>`VKvi!($1i3;e;cMmt^wTllDC zzFVkxkyyp(cT5BOkXnEn)R`>%=hv*wx?yXNy)oj~o(3)Ey8Q^6c0eD69t@|t=DLT# zMh=$pGuY1Fnri+p;)+=m`# zh=pUu$K|#F!~_*sdF^zBbA0$D26F+c|FGB{$;EadJ$1#QTxt``lRV_CwEeKp z#kf(8c1P**H&U6NjgAwmACJ+n-5{N-5gJ}JQhbMK>ovWNa)B%7&`^d)F}FRXT}pyp zM;%7GdTR7x%@2D^v231&i5Yg#Kt7KiS_=4+y&!r5V&+)tpkvBo#>-YMo~nv2k0k2* zgIW(y!{))t6pf2)ivv+A7R?ZMcP&tT5p$87rm@}#weJ6+>aBv}Y@YY;WpN1(!9BRU zOK=Fz;u=^8!GgOiBtQrrY=Z}P+29@sZowBP!DVq43GniKtA6#b_h?S$u9}0XyL+zg z{#+#?KjW)C)E*mFx|`CE^zcGdI)jzyMWT#1B93rm{AQ%w*0{|BH5^+al4qlsBJg>@ zS|<%{cCQ-?DJG+Cpj%#bhb^Tk8{f6fruN&@-Bxl8n?hK66%$Iyp@Wtx5 zh3HxTEvN@2*5By#7eyTzc)c<(qZd~70Z~bqi#Jl<&^Zvofl}DHDN;Jk%zWm2`;+Jr zD(PF-{zHyU$iz9bJdf%|B7BVYf<&l3E-;4^*pyjXaIjWh&KPUNP9b|fw2$Uok z8Pyi*`4hatEwd~Qz?(fK)mt=dT3EQanvr{$xv5^i&MN(jP%xn3uivT zwEwqQ_kMX)x(UKoN;S{vp-k%k++z?eugbE4jc3|$8Dj>l;K_MAI_X48rjW%z_~KxQ z^leE#>Wnba2l~&G{MVI(7MDI(sAykQpr*Cw^Edchc|-scX&4_$IOkHRgG$m!ZVeFU zMZnV>t$|U?W$?h#C`t-R@mQqR(xdmk=h^4a6c`m2S%BXHhpH1TJz@|E&mWgAD1PI( zLnmwd_A0`+QTS;M(MBIHejRk7!l{eSqo8oAcoF++)?&xQ?s-E5RLcfe~E!oFxV zTL(xyr43NVaKPC7)jX>P|8*BD<5yELhTpTEnP}gIRU*EixdFYdScraN^S-6T8ng&$ zAg`sH=a8C`6$cQLupH!WlJ<3R(kRGJ^9J2xUy_FN>li^lt>|@bX!VB_cG$wo0Q%<5cXYg$EfO!rH| z_LR7?8?ze=ee5sMYLfuiEg3r{lY!T~xcpIV#ZqlAI#+=LkwZrSfgp@Uie%B`b(IIe zNL$yM;m>T-kCI#sW0(12g193PSwaY7JFV2r$5kVn>>!UsuPpt^EQo2Zn(q6m*(CU$ zE0$4C1aXTiA2E`%hdAH6qn&2%I|TV^MXN) z6NV7qTqVQzGS1Vf?2n^I$9>^g0I?}r=t>VwcX^{|19CXKL@7$6VZE`ivn=kxPQqNGIH~4j zsYKP1glmKvHnlSl z^ELct*7j<0o6`#7H`_g$k||VH{TiYkx_0g~cn8KdXw%#foVIRocl|?Cr7yWeg~GF$ zA}0gawWN^CPfN2@#VU~ybO;g86ngL4vZEb;nL4LWOyyJV(MV^D?*x#?>?hVza z9>&fq7z#`xnG_2zg@=!8G~{yc%uH=$Wi^#L)%ZBIQL(KLeldLPy#i5sZP8s3UWlJC z=(onmyVEAq(>i#Qtb zLNO30nF)tmfUv;Zmjq2JelCaHUpCg@c$L@ENuo*DF+lQJITI@BE!KIv*Kkv6B#oTz zi7mM(1ch?XX4X&THRAGd-6)>4F#htM|jk}uy` zHJ+WSQQzK5WYpAfyVq!F{YG0g9ZRdd$~t`gUABdsF6N`R9Pg%3TFsHb!W*Nf)>(&M-FMZ&Qb1>h+-<{Vs=ah%#3w0~YVyUf{bA%7;N4em z`O9J*OJ-VESLxU;w_5tgP5J>lx(kZn$BVqd#D~Si&1ZY)E8`%w|Nk$3oqvIQojcer zLhUmywn@CcyeOcQNpyM>g@G%GQbQ0&*WgEO00gJ7kJ82{gzrv>ynriO6AFcir10Br z;IbH{mc@Dc*5~u z1azVK^1@UjlwVThqduLWLTH#tV9Kug044f*Z|Ghj&<8(<8Bi(|!D@#7!Sh#E6s{gNxVmkRr`GbGb#{24m)*o0lJBwMY zvV}vloW^n0M>S*er+T}d)$=0A#iup)hrRd<-6$LfeOrNmL0F=PMRrYEMg!Z3P}`3+$$zjITCm%k~QFGXI<9Y~?C!&TO= z3w>m}mO{EW9%k}{gOb~p29v8<>%6hb6!*2!6``O3uM|0Ki@`-dtQOVl_@N22FC|r0 ze(AOeXFQ#KQAZ7Ui+`371o>@&UA3$AW`s}A);NdDJcKf^c7~vysgQV?LsS&WIa4lL zC>d)9f}?dbmah*Y-0ZJ<7?N4oK-qW>ETQ#y)Gh(wZ%H+&NDT}ESm`H}H6t52k{Y;3 z#xVn4r?;W|d~8gY^!&k7;Nw@6JJYcrEFfkdNV2YTZWM$&8*rux*Dkb7x}&j~T*b(Y zkm6D!oia;z#S1lls8^<_qB{rV$S_Os4}nI{s7Hs=#|77Il5ZTEq5UgS7g8FfThj$jKA9BGtuMWAS!}(ka?o&( z$tPYL{dtF@mL}bw8CSGZe;AelcouM6<-nD*Eb~okv zB7{n#g+dLowEHphdLa5@Q0CdGHr9i~rmvi&%5-=>U(7qtED}R?H#hdo#h~#V> zI-GOF2rY2>ahhg&cVzyBVh?1ZDyLji+pJdv)`d}E!&qFFBKp9eg%%M}1WvPnGPgLfit8t<7`SJpR z@X02ZZG0O{5M=-Gq3!f1uE*x5m!XZ(9{(?UfBw;5y$Hajb^+{wI@K^YSY5nTFB-Jb zA62Y#MZ`_(&##XDs1rIJqGaTQOk)W8ov!I^?{iMiT9@+i3O}!$uAeG}e*Z;-uwAbieN? zb`ykVsrYR*HiV;Gpl~58-YL?}8`P1uek1pakvF9@<=F1uBP{GrLoU8Xy%3AovGnY2 zYe3(YHkw=$h%h&mJp>#{VMx#>4F`O{-<{`F)Fg2w$FDR+a7av3{@@Rno-&`QZ?b>^ z)OT#FEQ`+T($T*!8d>v56k+ta^%*I3Iwg9baV4R>)ntfe0H*Q~pX8t*=_cdo0>*OB zfPWWiJcH7Ml%QyV?h;7gqohKi(Q>#c$w-1i1oGfjbE#DbaDd(2POfM1YcU@hK2<@> z(7!8|39gvl%<@ET%k-e0is&Enb5noY{;wCHhyY0ek-%%{W|9>W=?g`2zu@SZ+Mwhp zhzrnaj$lkt3%~XOV;6P3;+IUx8aaPI`?ZpY-{-(fl{iLHP;e%Tz{SBvxg}M?t~G`! zS~DRf?3B}bt-Y`rsPb2W2U!-b4CY|@Fxtuw+|IY40z1-a{Bojy_oAV>_!_eeiFJe> z%p+JHgOE-%yBhQ&UJ*j2_1#S`R_paz3}IPSDk8_OmWYeRnEk{H<#-@JG==M)9#_Q^ zDWu{LlavM>TqaD-XcN1zN*sMKqAv5o9brL!V;cvvWmdgOV8O5`egxz4E8wH=t)#t0FuOEGKtPKwmTqgfe zc*|Lyk~43Lg09{s{!W@RvzK$j{R()x$|WVX!@d^AGDHhDpx{KUX}7Zs&k4w~Pp%dr zptMONtGtN(2Hjm=a@u3Ht;j>JSW6ml8dR&L2^9L_A(H&H=9w~au2vBVBw1wb7o-5O z46l9s%QR1Yc#Q3?@FlrdnGt4s&`Ut%&Ltwt2P@EHQa)L@z#jE?0*FC1y%s~rxpX>6 z`_@=90bl2j%vM+60cQ)>bw$HT;DO{W#qK;4v;Qg2rJG1IvEpb21rFl!pY*+04R?R} zLLu*OCQ*1$r-Ai=w3yJ5maW%*$cvF+-0vP#YVk>0h+%}OhIgvsas!!o^f$l$;Qf=7 z#sTHyH@(jWofq~ZE_u;Rzlzuv8Y2!?M%Q#tza16)>*JF0xTGXaEeXiO57txQtDz5q zQ%-9ZI}(h20YNWa5(TP47HwqmGEmrN7-*(Ut->d+-dE&z(X@Mg2teD}|%6pYC}5 zi#a7sFy<_neiq-Bqb#Xl_u=hc|>f&()a*$~vn) zsskv0V4EErJT%^kbIEHxzA=1!N6EmwS}p%8r{wnYx{EI4YeT)O3CvY<_eQcSq4w|L z|634$zW6#WHk&IMgEu)mrFz3cjct-XXJ0Y}3tr%%fAkHMpLj|n?pJKW%E7+i9}$Y6 z8=4LftU`ZtN~?A$D3v_X($M9Q{=j4MiQ)a1F@Aq#0aa1G#7BSZALLkd%Jx*SAv0;s z*~0w?6qV3K=jvdK{pg^P&(YSh%gy2`u1oH|EnY%L?9kA|AFHg0~ z$8?wTlfs4+BHIOeBL%JrO5X-K6gRj5Bsv?L9O7@vH7q?`%`O{>WB5mWOYO?eJIykg z{&44bExi4g&S_U(RQ5|!;}nJiWzaSv_K(46Q?jt3UB8Siu--FYOupu$t~z2 zD2{?Y{h^diyg+|4Em_0$r>AY&i)a=M7-s3qmg&yI)}czPd?1)>+u0mRM_nz*#xR9U)3it9!&WsimJ9yc1-M&^1 z$TeNvCMZeA1iBI$mB2_UQg==Vucda*wf`U=jFN;U5i=*#-}w;*JISJvc|$(vbux8{ zCcPs^`?&(NM;Cf4DJ{s5lCNvi59s+O$Q{XjX!;r^OYlJ}eQ27Pei@xbG_tGrHlhEIvhbv|INjF<#44feK%-y!`d6-lkFOFz(==V@(;*2r!aHw};98dxWS}UQ^FxuZi0-48cXWmF5fK;^VYk>DSR5{tAvwmn*aH3Gwl^>yvl0 z5igI4sJLF>L3`*NHM&9Tn6mU8#vFy>m`;8@;W_ggc;U`0wnajCblZ@HJ%uu#c`8nl zFWHvV-;^}WsY2f|H4g?t%x+d|5W92w|9rLRM3YQtvYaUlJKcZujYek7&f2QS3 z(bNgW%IPEdWTU%a`pZ(9aOve~L>aevb>)_oXPdXqPebq-wcO%D3Q1wd7nfxmmu;nC zI=(#JP`r>>(4*O~dp0i5mDMiIR_oZ=&TrHd=e|&jcbG$u02&y|Jx$n>isK8d<~P0}N_)G0kgn9d^%}*>m7MY*z?!JHUaYr5G%CLGt%5B^B{M3%_gV$j(9!}HnwY)s z`82bdKdfdhjE?)kbxt3nEWAQM&5ebJ`X}O`wIw|i?qKO9y~#Gf*03d5G$9>C;CLmD z81#u3a>-rFEDe8nu`JN2Cntdy->WGgwMJX{`Coj%Ns6`7Cpt_0wD+~&do;h13q%jt zFsY8Dcz?aNRYd=#Rc))1qZ+8I)y5Ts42gA(0qN)pl7zY7W!9^n+Z;80VZ+a- z#mF16MT4;lX*X5-e{tYRJe1i<%Cm_8F`MQ_?&agLG71IC-ILcU_*Dc?U?aV0=KS(E zk%p2!?y&8QEDpRFEDe|H1p+`|9-)o4&4gmQ|>gsKecpB6NPsrhYL5}qh+AxwT%SXwlePZb<AN@;M6&j zTF^^{m`x_Bm`Cpfz4PUQg_Op&0*S^Mj&~;Z3fF>KF{#4pmQi?#9>#!>YG9|IA}kk7 zx{!bsgHrZ4*6_;~`Zzf9hTl0p1md;C_-Dj_f>d`bq@&_x5a{_12x^5hMO2Yt^A*2i z_p}UeeM~V`!U}%_Z(60jukqaSctX=bmu}aXY65mJ5NeX_s!P*y>zM+4(J`x*NUTs; zH|R+Fs>ACSk!n!%!SeCWD&-jU^i>(nf`b6NsQ88^K@)(aU$n%h(gfhTaemdjKuKw7 z7iiy7*!~J*cush*+i@m{pt$JXw3e|cY45%{i#`uGLdjAKLX z;nvfYzz`?-4eil7g``9kI+!y4WBra?gPYn=f!a4j&v=%|gw{G@o9en?tq~abUc1Q^ zOL(K7iuMS-gG!Cup1=!ng>pj=`_W+Ut8Je{>5RD)_v4EZ!nkw6VXwL>kBhyEb48ag zU2U6Ew3h-+Z~If>mYa@L^_GxeT(1aOGE0P(>3770=iX2V%QGKQV<}JT!qmPFp0uq) zTX7*CA){D|G7(Q!w{uTYcj(oo& zU(n~1#V(E19SNGY!H>=RReFxPA5?F?MX&FYKR+4=qouE^RcRlu*4AA zah_xIoZ>9-FNCn3!yv38g2zyR~Dm`eae1`1c;4MXHh`3LEZZ>0w`m z_{sA2#?d`;W+1`a?VlJNKQ(tL@l4XEP<-4xH9BRjFNW)V`VdOcx^uq_t2FkwPA#&I zoRFmIp&8j59^uG8V|!`wS=S6cN(lN#wkou>Ul|KD|moH32ac>J`CxZT2kUtt6CzRRGk{1<_TPJ8|v77I- zevSuKOXb}AL5$Ct1jt^Xb$9xz8jd@)lnM&LV^+|bX$k`QX0deJVZWQa&^tdcI(#Kv z0?cZHA-y_DTYk?PsgVIC$@_zO=@fiS(VeORoh=y=QIc^ATGo>pF4a%v3s0A4VTIP~ zdxyyQ$4AvpH}_n@cbF}sJ7@k{3AIlg3&yV>6KiV`b4lWpSi#Ydu0V+1fs>O>$q2-y zoWCZ>;pX$6o=SG>P$VY_8J&gr8IZx)(7U4ndGMH!!}wO183d``vp{WF@w~chplKID z>EKos4sY`=zI9V%6*^%nCG&o(4>2bMa&5hY&)@u^&DoCP>D?GQvKe+JJ#{!sEV!gm z07cLON4J%PouLZgvd~WTH|CHt=G{GZeeJ(vbk^r4j7jZ*WEFiK)@?AXQ4ou^Sr;G zsl&utcN?!%qepQW(2^jk8fsNM!iC6*#*us|OLRk!)wGZBkef)Qi1{S)62j)zj0oD( z4tZ9Mkcq7ygA$sV1J5ZJ-tJJ9k(Oz^W9=yq3QvAQ3lx~hyN=1g`}v(^H#6Cp-Nx*r z_$6$X5p@dHp*O$bgEx;e*#ClzOA}@al*|70{F>d5WN?=0wTpIi-|Z|{E*G=w!PyRp zE>`XJ`&6Flw+w{X-DWCx8#&osg;;kCH3r+_>jmlna?})a5>K&o^{FvUEoo>xdQ@iyg_gczN`E@1)(UmcO zt)~0>v03wvafyk83wXnraFgmw?LVKH;h~F=jhDs9F(y>QU0Mkl!0%CfhO!A995eG| zwvncUxOpq3bV|)>obYNSA-^m}rjrd*A{o{!Eu3vqoOd|)haL#8SgQuSfdR{?A-OX5%R;Nj==|0rYlr(3G@yU_Tcu*QnmDRJX8A5#eR;S%%Vg2CP4 z%IT6+6cd$k#zbt|;z%Mb zd6PmJKSy}|I^{!>#c)(PiaNbZ+MkogE=m*TtdzMA=N$`oKEqB_@=m292?~=IoyHgx zK7nu?&>ivf9EyBw3@zm06N;FgE1dfOaU=FKI9vSvu%h-l?TYCLf46~t4P<^=!n=1$+~+>yE~M@q<29CW z3CU^hyW<)HX_tEE%q2B*Qh##GJm+>I7ZecrB8bqs{^W9x^M~fmdY#X$MF_8p*A~2K z22WI(a3z7`u!aBA1Wc=K+J9}t-j|`$oFhhG;V_9t-_OP9!0hE_**qbm9GmDNApdb<=G9i%6@36sr|7-p!O^f3_ps>GvL89szaHy|lrO)>kkGpcjxZ#+o^0{4` z6yjfNg%WD>iju;!i}VK{wZbEev$YJQb!$MgZU$?sEAD+PQ%(Fo3Fc|NcA2@EQ(?mG z0{NfBeickR`n0f6+>g2AOU{1ejYGCyAsA8w+=vOa_JYM(ML(AslkvC1V+qgD3MF$K zLj2+`=XrdF(e=n}02rNdA&+n~>aLgT--s0w^Qu>wsln{l=s+K?pePx74zr;AOyd%) z622TEXjD{?W3){|8*L1smicEl->L|CE)+$?oR_;`x;rAJ*S|#G#rZe251MWeGPo46 z`LS~Fl!bVt!rpAm5e%hf`qPbqoy+SfEP=^1CdrBGeD+*zjdSL9e5pXNWUc9U9dm%q z${8dN^`*T2%^3+}VR>Af-K0m_o|1tO-5Qa)h`u9xeY%MJTB;OY9+)WP9bn^{7LG}hd%l)5dm z?LdGC@W(`e2P}IAE2#``Wv&(3;%Iyj*@(=R+TWk()-eJYuwR)B?tM1i-reQs=~d|& zqaw~E%!JvWD6zoD(Y_a0XUZ#U3o8(z2;?3}$n)%@jO!db?iU=#jiJevlkChBAH972 zO@WCH1T6A0Fd{ag4@D%)@bdekRgk6@F=PY6dym4v(F_V=uzI#yQO=WvB~A%3zC@dIW{S3XEz`5%wro3?Ww0fu=xA{md*+= z^0a=oj%Nd#QuZ)?rK(0jS;^1EmQHFb_&i24>3SdlP6+QW-f^3HCz&Xz`EbYZ*W7Cy z#@ch)^0Zd8vmfr|g-$^OWuE?}xnOE!)2>0Sp?&@)LM@IHJ%_U1h^hfORDr=X>h~>H zm`bxt5=>ZP6{vi9*kxMN!tqr$h8r9=(v{r#TdzSRrIkcTMfv;qc%771xlVY)ILmU# zO-|5{2*S)YO!$OsQ*e`C8e4O!gg=`3(bUc?bV1LTBD*s$>qXCv4eD!qF`>4=!N&#_ z_`3t_QY%1rWh|Lc7^@6Vz|7rX7wWD)#NkJ0flaeX^Uz}j1J_@(^C67~K>m?5B5??h zE)HTFdT61i5?X!H?+3$XSxFU{^qS#z{eG6x1#Lm#$UCu`vm)B7WWdy&SSYYEn!3?9 zvitE)v9~pNa*ieZlf9yZPwanG!nDU*2q-Q3TgN(uvNgXpuDn#hFV7B4v?`%(eR(NI z#O^kF4t92#g0A*^CDTw9Zk<6myZ0$z z2CM}v8_MNDJTd|CpdBLN(hEIDm+SqKIGF89j^ zzY_LsX)W8<%f`XA{enrqQjUrDn}mJeIV1h{xd~)H5jX_1!6AS})C?4@9EvaHb3mUW zDUXj+eD@*o4J(nfq^7N|T&Fg$nsU{+3zqLcIQzVpb{gq-$wk$E^s}$868@#GEGavO zylAMocvqaV1TDdf`fV}n00@^+8Hj`b(WaI^WHHC3L%F}0onnQjnBC*teQV|IGzNX! zypf*vIc{9|-^deUqZ!e5So!eJ;5ozpXUzvd_9ELmk#}Yx>r!0S*5$~6L-X}mHrcb! zEzc;U_|;X*>>xzzO{4X_$V%|VxN6s6rPUQ@@StBX=JoaU2Sn@cACcOC@#D~I=i>*R ztC8?k)ThG958d~x1VKST z{{75!kcIBYE7fUQ%)Ed(knv{6#YEo=v6T-+j_aPIJS|%(ny1fvR?_FqExR%&pV_20 zvHhQq8942Cr!m|&CRqKI@>|>`-~~qAi#ci!Hy!|=(2@H*S}E#Lqu`&JR)ZoDg@3~v zoWDkgLFq&OJXp~-xn{syg=}T|tW(JBXw}HVur07R>av7HeqWuCR})`W6Y%+xT#x;I zRnH|b8O?3fAuh9r0g!JE=(Q}1|aT}`Yd%ZCHcGCgf3`O;CK$q-z zaNV{F|0a*9+@U=4ir97aeM7ea(|#AFj)C$iQg}mp?>GP!Sy_1(K?di%k*b- z{z~c8yW8^1MvoJ2;7xlMYEN~{YeVu1K{~;&6`#Cvw`jMeUo8(z_oby};q#D!-9=zP zDqX;jrY}FKJhgSVlIL}XUAcNB_OX8ykxbl@Zyuwe`<14narvK&YfL8zR>YBj*D6Hv z04&G%Xs+B$XN8?UL>+<1p|SXvq|oBZufZf|jX-mm^aVO-=kN74c>@Dfh5kvumO&%y13pp)csTb4=2{P-Ti%wbzdb)Kk}x;^#l(1zJu(`Ro}4Us3ifUa@Q21?Wx zE}N$7tvC59(8Z0Q@z-VN5+3f!zej>m6z%}8ct*F%M-*Wx^=KB=Kn5kcZHi0X3M4Hs ze3dDN5mxC9&(GrMsA!w|7Q=u}YzVbf1Ph6TV$yYf0I7WFkn1^e=i%NqWJn!~4Zw*| zkbJ!xN9j44`ErW;AvXwxN=TiNSX!IGw8uJSDP`Cy@E7-puEVlNjyuA%?MFjU^451J zdUFXA_}}S}%Kpx96Rod)eSe%2dWoD_k6h61$;MEfIh=)pm~i{?0HTOm+58LAzh9-r z6eoNRD3%zRd*|Lzrg|J?GZ0F65Q(8lgNP!R#UV57X@})7JiTeJeH33s_(qadYKO4V zK7*dfP&HO>j#I3Qx6l|5qOQAYk)L7U9jvMWclNqhCA@0{MJL$daz=Dw-LQBgWU5dW zBU<8mflNJ2Txd1w&6`mi8cApBpo8}{lIn6-W{E;}uxmybnfW9QD%=;}9@%OdF~MO_ z6Q{S;{^jF2h4@ant?@O>LNE3PXP+U`d1>7N-c9hsT}d}9ZM=Cv0bg;^doAacI%?*^ zEqfdHHJP?@f_Gc~%gSzcl=B70ZJz@NV7ny$dB@U1_i#7T+-PE_P>m;Y_TL%iwE`TepQ z4yJJuUs*#ddpj1+8}8eM+l(zy<*UBexFu)~4OIMaTo)W>4{|NyM*DS$ln>Jj5^_4Hc6!s zWco@XAJ!&5uC{*abWxKMlXF~V__AYL`e|G^SFhpen{vsCLmHW}%&e3v&27Q?Qw662 zntugnBu3$x__iTQ+C@g*XKO=IwC6sjOMwLu&UEpEb__TlV2L`;ev~xvfLMVr^5{dQQeBQ+%Kb$VPj7e&HvO>7Ia6Z_c z;O8uBS5_%4p_1#K?lB7JEk6V5!S>gW-}vr59o^uE0j7a92C228Z$xcNXoW_}x2)dt zRLpA47|O~dorr72Lk9JpS<_n11{myP)%Akv$I0cOKaqk{+lOQ0{Np6Zd;;eGL)rH-^3@i%@JK69Y|0RSs&+HiKWy(W@#!+OzQZhX!A$5PXA zuJOOqT`gEAI?CO{Z&shlw(Uo>CySsJCp7MM4NZ)j_N02loOfUi70RiBycd9sm$s-} zj>Z$qd*IJut2x&s2y5p3`Q0HxZnJ?_nKY@Ljsz^`Cd3KT9qTd9|&KrnvOUoi-Sg0bqnSFNb zcA)U+D$J%6az;yPTj<<-7qPzV-wnDI*4k7`Vn=bq{qstGGA8{*u_T|y50dqpnoHy2 z^QMljt~_oNEjYhN7`)G`E=}MmC7#OUFC2x|jUJ`g^O0?c=umBf&NoQ=mo-a_wS z7xm5{Nj}6V0X8xS4z=?;!l#Vq$_&8OVK4>AM;lu!Koq@O$RM5g7qidaLQOF7)Q4p~ zC>)&y6rkH_j;Y`f_bMm3|9T}NN%%`K>F1)!vatdh^WHJ&Rk=^p5D_sS4eT014T&qS zcX3K;UX6;$HiAZ^yyz9=)Wjoo!oXrzBBr6ug@cylf%irZerz6P#O*crf`_8p0*JW8)ToK`pHovR?y~zUQx%ycdK;JG-OxZbn5#m5kLu@}~!#t>4Eh zk^^nN=c*E=F%^S)e~M?&VQL|MQD6$Tmm+~9uh|GpBjUb!U1eP9P|=H= zVv0G<&USz^_(tIG)PPM5TDI6?zESplfqrA2xZng9!Aa_PL#YFW3Jr^X? z*1e_zg=xS6mi?!i+cU1S@d`Vg%@^K{BYWXez}T9U(=aJxNO=U#i*=!g!N}n`E2`sv zpasr>7@zDvuT(z}I(Lids57y(N)06)xjg9Fu}?<@ncqXa@G4U-vy?;NqgMdrzsH6K zF)%p4BDmRwWxO65F&hZ}7n`KjNqCO;#j}It_`~PgyJKJEyLiT+$OnPVCA-e8D6qL| zdxIbpo)CVqfiOuIL4q+lGQGbP(;55Z*UzckyiWVXN!+f6v$ZJ5HBb3L&6C;Hl}`2? zn|uUB=nh(y?-k@a4qn_KU=1M7h~QJc8L`58Yp|tH6uh)_j++|t`JY9H5Aqb+HUS!0 zpAPx*X7c_D>-{Q}+oy0|g)H2jt=c&odGL(<@~>hj7*Y6;lJhk})821TF{7X@Y0V3b zeaqnX6dqN9Uw~(O3|U-wC01GC>VNy;{O@(E>X?ra^2aCNWnaRXJzSR}HhV>r(H=$_ zv5Cw&G4FK-&wWfE$5Y})ppR0to!|S#EJZdQ9?q0wQShJiH)6OEzO?IpbsUC17-gJz z)r^s3Ak)$bZ77>5SrCmn*Mt&Eu6GkC}^)*)D`V?uPw& zI0=)>J^jeGHR;A>VE+#;_jDomS2c7?_4L1)wZ-M-zGpg;nnmdCcJtjoaE4_RY(f%u z{ZecFV@Ai;E7j0PJw({;cE;cT9z+NPFWuv5^xxHIgzWsu)4$0ln%&$WUTvvk;r{|r zJIHr@c%Zq4%j)Lm%Rgg6ll{*d{iKhbbo#W!R=uNl+{gIas*ifV#y{2VW>Mze^t1hO z^J}O6AASQf>=e@j*}hKu?2i%VUvxqb4%N91jkb&)p0xdosofRo;JbI1=kkwDJGFJ#C%a&uaf@7I3-_F5=X&gJQU z9I0ox?uVn}e@E%Lf7&CNpkw18&*Qsh^6-@p#pm}sxw=7?cujqCo#@R`Q^FMoEMbM^=L37 zzH?Oo8ljq^vZ?WoE};~l@{OaCLkhb0z}6E0CA-R-WvhsyGagNu0YHe-!W52vMT6T7 zg$tC)%EvyEQV)+LUafrH4ZRc@?^N`tQqK`a{}fMzLJ5`00T$=q z_ok0Ezu_d$Mw|+&bs(p~p}2g-bu^m>olGokiQYixRW&&eJ12Yai#i(5N_{XVWx9Q( zarsX~xOw;?lL?7oQDLR{$7jP_5z%MW{|hAxNzx@6?cs2$2=$}|Ma(8f$^g?pZq3XZ zv~oe};<-Q;^<$<09AQg&-%_({P(qWchBd15q^?>D4 zof}Jd?y(<0xs8j)l7cJ(MUYnW%$jv9WO!Z6tQrVn3|Wk02m- zYOi#h-IQ;Z$vFh;a|^Fg<2s+KP=3aIw#OHoPA}yxcbCj_iEoAxHO;oVd7L{mP1*XxbcHw$9`ldqVhbyx4-{|&uRV)8kA6s+Jf6NqK z2bO*#lNf3xQ%_N#?rbnD6V+coLgHU?R@R83ITN%F6K~PLhAct*Q*hY3aq+~gV%VGa zM@iokT3of1phI8`C3(t>bhtQwonH{qOMVC(IH76WuBxjH+*zp{i8VBRC`QgIkDKI9 z^NgOT&ikaEiIHq1WZUKJw`By@YtUDo-w9{;QjWdKQSmI-VAUX)lftQb6Y=7eV#DuL zboP7`(?LzYALSJp?3pY*4rw=T0T^WwpDx|Atr;U{W(B$C2)#Nc-*bkKGz_A#u)F^# zH%mh$_jr|6@4~g8Ljl>5yafFVey>MmVk)}~RqR_4y5Spio>qvI>FcDp;BMF2@D1Uc za6M2=iu;u`=WLsSsOu0Jv*D4y_{EH?y<2+`bhspxsReoa&F3m1JL;iP%$V}<&b|t+ z_EYnv&VWk@QaTTGZkYDAh{?{nxucvCbz(l(%Ul8SD%W6XFZYD(4yNG~i$(~ql20*} zbe_T;AK9VV4f{bP4Qo{@R{;2X;+}Bu|Nqo>9=^uz5=w(yN|- zWRxE0XL!11D42p)3z-YA0DV+D7yrt2s(_|%#PL(~tm<*a?n`!jj3W)hnsf$BhOslk z3fu&iQVOtIFjR!l<2+9Nx@oN2{#N{u)8?+32%7SQ)d@&Z%qn&^31%t>+2lRB$v5FA z(K4GZCGEwRCp5>!jo~YTypmRhen&~vr*O|Ng`+r5pT&%bw;S}W*sFdlnQJ@JCd(&Q zuqGP%E&@WwNZU3h%y&sf2w;F37p;w5=Gp(|g&aV*v(_l9(1x1Oedbe5msKde#78ff zuPjE9IHn02E@W5?QVy027LNPZh=iP+OvmJnaXhwkks~gu4^EiBYnQUv${Jz>-y)Yj zb_RUc0^FFjK-Qc+CW)t?H@PTliEb~ndhny}_6)tVf`zd^! z5+qR*6dmxzdDxyc+)I7wXCiRBqG_K_==s;Pm0j7F&z^`+@mX$d*nC0o(No8;Yscoh zmF2Z-(T;~>_rXEgYk`j2ad+ACi$u>Sv1jt)&0yF+)nJ5IUZ2k6md+oE$$*LZlV>=W z*xwPZ+WvU4wHW$`-}Jv=c@Ia-i6?%cyM7;5eHJ#`4r}^KWv@6^E^?9mzg}7gZ=KP< zLfy0fD>rhH_aAeM$2|b|IkXD?8*u-Jv357#{O6hc1yAk@o4tBgmD{;$zQ)sw2S4DO zKRxFi{~udl8P#SREgM{lJ4K5W*A(~SQd}CG;>9(%wgrk)q_{(I2vS^1i$j27!Hc^) z1Wx$wI(OY4_ZJD0^}KHu*?Z5-o{{JABb2;{LD%l~Yx*%HPmtQz5hL&2m=>_Px@GI7 zvCqHHKJb0Bcn_$=wK^1yAPp$gW#uNG#CrB| z0L${zK_49Xkcl zCwm56qECUFDF$m=@qQ#n2tQ|9d*__HsnRtBC@~OhhG+tP_H=SvFVhPvkFz_DzFtbC z>?8V$J_Ka2q0`#0XJGQ#R(zeZd9S>}^$KRYl7B3@rxpK8p4{XUxMSaBZe>NP*lm$C z4Ox5?=PK|1f#)aJ_PA05=FKaRETfTmJ_9S7Uk`Hg;@6x{{G?wmG}#JLKtJ?4CmCf2 zDH?OswF#T!*mbCjLko+NsBJ}7&BHm1u#Pl`3D2T ztCJ-U(~nuW@>v6HWbgT}9yvkIyQ>Z~0%K)J9K$4M{h$nC6e`RMk?nD<-^-D*88ibM zr;%0>^-K(MwYpcS_zrE9{Mtmzh*=a8g@&##q9{-PLg{_S&=F;V+|Pn)0lPu$<{-nTa+Fs!@m$nN8h<>z2PTXVGFTgnmQYq%w8K*SuF4P@uZ|L9R8)jQGYYV zi|&vsCGZV{VS1EEj8XR_r)&1NA7H1^8;=cRr$MUz@^-k%RTdSL<~yGy?i5zz&(Q=w zIY^Zo6kE^@TIW;KQC*J_S(%_tpoX9JsGAVMUqTOaNU^92Tqj~+oy+%pkN!nD4Wvil zmTmU%0P(gNqUT7n>rygTEx~NMo-~psJbS$~@o~wL4pXHmIT$TkISqMIs$2X;NcCzW zq=H(8_A95O(LI|J!5|iUw5CHn^k7x6veRnn3w-K(zKy1)&LQc#DLEhET{lo?q2Ve? z%$5qBDl8xUcJw^kY|Qjr|5JGPE$W{Z9#J#Xrr+q0f zJ7LCtvtH5UMMA=~sa*Nr@iwBEe}QYD2CoiGQpdx73#fxS`mGSrHuCSw>bvS01wk2I zqNJR1BzgKYehY_WnYXFSGt*0TK#dbq|H%=E;l$2t%yF$3XyEcld~Q3Sm2u zwmLviJpA_t$G{f~eE=~KW(0SZ3s~XFZ5P{-eNt^Z<07?F%m{VS@yof% zod?+FbzDtphe+*gGxEY!w_y@Zx(A zml+@OZA2W@NH_(V8%eD|ybqen$~|tbd~+qs*}9v;L>u}qg4UNOgQ~HS^l+v91-$NR zXIi0oeP`8^jb-8Us~!ax0pO(>gt-*8k*9V9~O9lV12 zOK;DYBP1vp->1%*tv>8I#sWisn|;ewU2t~3jY$wmxs0t->fEvsuG^(V)wcB?K2=h% zur{~|fV#2KAeJiNIzG~You|bDbc}43_v(nCb8wRd^x{H3gA(Q6uBs^fOzUZYOy)2) zMRH$UL%6Pz(zCU?F^A1;(Vx)RPjjYx15y}92-pBw_Cj%g)iAseCMF^{Ck6h_Brra z@#PB0Hv99>jzcG51i}me& z7Ga?|@5${#xOjH+JpAHWHGAANi&M*5T=x1yYOs0>4VHYa;Nq)D_`(Q`) z?=Rbm>a4|C;7KbNyx=}72D7tcg{~>M>u{kH_j!^Yle~8XXeC{R;s>lM=XxpT1V2;B z&sm=5kBAtah*Jb6@G=(xaKr_yP&qeS?BB=xj#!?Y#s@zLN(C!ko?G1Q|G2x??F)vS z(g+4eEIqLz8k$=_|NVQ!mC!!J6o{Slk-*aMpZ^yXu992bv|ih-|vj*3MGD!-Ip>R3qn}B6B~StL@0+tPMEr zRc*w-hQI2)9y#aK#-0=M;GNst`^D`O|E_EQ=CdJ=(`N?azZbnIm7+m(TYLyy$Dg{q zi~A|q^vikYe%tXl5NTEF5iW7lm2-0OaJ^9TNG1O7DF}}?VC5-=A~_q*wX#7f!!6wp z@iZnB$i|bUJdmbbLB0Wms+gDkQco(1akeZg<|^t}O!~^ivlkRXRwYe|gwDW|iDZJ; zU6r2$ILIilbK;%j6Yh{-#ahJpiuwf*5+0WVvblErW~S8Na4%>gi=`E?7Tx0xeuw$R@v zTm1{D1{hhQVndnG`qkjgsGQs#0A-3vi{(;FsYW+R%1G&P3)Clej}Db;GV0>to2ML5 z^}MBD6qA-O9Tk9R7kM<+%I#z8zM%P<@pnQ`l1S0zHt^*(mo)umEjiYQULUkb7o>pj zBfeGSTRt+;>j=;em_sL2Ie-+X!`@Np91sXgq@ z_#WXzQ}9g%)i{+m7Hf=8ZM}sjo3$X4IP1D$2dka-J)QEO_uB6%-6w0pmbNXVRBP<< z1;?5;j2MVEb2(h!4vz=U(IqL7@3c6vD6!acq3&e@6!+-4DwPa7a^0Nzz;xGneZZe& zt1NqxwRPJLl_N@TUqJy@1oJmIRUUMn<=il4%e>DUI<{vN&3VV{6ovT5I#)e{6P0zF zKoPK|YxGr`QvE@G^QA=XJo>CT^?I$)B?#;oE9>qMZrl@b{&r)R{#(ZRXQZS;lX*fp zBSIDS1-cY}CPhCXLKG2c_&={lYadMLT@@M>ng%hH@PkG)B)PNZXo3?qb zIiZmq)Nqvd0+ZyH%w`(A-kPEKw-L{HRRP0h#RY6=&LrR5^sRQEl2(1n7Pf8P|$CC{@j#TKZXS{RIlV!axLS+@k1M_ zbEtMHn@VsvgQrUJH|`hWeM5J7U)u24zC81eYtb8N<@TW?stq~O%{*rcr+lv98AGCo zpjAl+g9X~5c!L)qgwk{K*QV#39aZLue6H+&Oj~`vM~LrhHkqPRc%r|-gN`kCDE)nr zDR5`WfvGMkxlysvb}D9A|3@OQ`iKxv`c=Y9Qg=1E4~Qu0Ct3FTjuu77ghch%I3WKa?u(< zb_v#K8_y>FVJJbztV&6OF!fa|n7;(Uw9Xs!yq9r|L=|#hh!vF!j*Ewf1$%GX4;#29 zSM7ACaw^Z*>fyVsiB7o)yB>K8dv8-_JHV zUDacXE07%uIWtsEaUmz;A2Z6H9?;%Naw|RF13bdJ@L56-gfDsTi0dG8nj`#y7jX6b zssEf8y86r#pY-4d5tL?ozeFI^298Jr5s7px&lOwBG2qy5w(SHFwljP)8w@uHIE^+N zfl{Mop&_r*M7;^@oVnRpmpY(~c*fu9m~`+T;k5{y9j=bR**j(}j=^&)_(spT^4!g~ zZ(kHK3sJY(Ea|y8-EPj^Euueozv#0bdsA$7$87A{gZA?_J$zl#=kWM=eJz@&k80&c zq5U-0rQHO1a~0u(z4U_aZal&j@qi=v3I+`#dyd6+TaOjmf_Bay2Seaq=c7Wo?tMqk zlYfNdMZVAd!b;rvnAmahk$`E$Zgt^KTH)gMRZ#HUqeOGiFa!bLZ)*nnPi?QH24s29 z+s`=)Ds~=2IDg*5b*7;ayETP-$6{iSy?x-h2O96E!k8!4?fpT?^GaKZ7x?~jy{`X0 zldmCe9q)gUt4H9jd*x#xQ+(e6*%Ji8jCT}gE3psqL9`vYU1HO4xAN_EgFDgl5#WF6 zuKJ-o82y2e>-zyk$*||n=O&--?p6D~$?-2li`6YAkm_Y}ib&qW{|^iq)CeL%^bnbN z*|TjK0Lg91m1I(Tqm*b|Mml;U$}tAj{kqwxEJw;sg>CIX z^~*bCxy=Auxq5QVBJEM7h%bq?G!tNSG>RC)I^>TW`^}0aN#WKdMpvV5s7hu0&fS0y zgP>is4;2TONp!Dy?a)eoERt%jCKQGoyHcRe5VD@I2UmzV7_+2Qq}npG1n(+E)PX`8 z>q!Z|CBiw|m^2sP(*GJnf~Zl@cV`_Hg07foXNQn(R^Uzvmkz@DCH2 zKi~|Tj%S*7jG@{`g=Aq-R~|GLpY>!`6OAImC^~#naFeA)o;ompHz9v(Y(oA(3R*M_ ziPND9A>i5xnZP1}y-L{5QnlvTgP12I~M-%M#YS02+~7_dcw4!_jnp zm9uYI7>s$%{{lFg>4(=&yT-Q5A6k^CkV3V%MUW*gXe$)$mjHK4=y_W$ZG|2+WtEpU zhr$#7>{1|N?&cN~!6wxEeWUU7Fr*fhQ9h4bTRBX*;zFXoo)v9g@3jk@b`TCuFQs6Y;=UV!t|R)khZuhXD)OhiGxnuoUd z$axwa0>2=oHKaK*Dsy54}y$P0a#u=fYPN8?{r?^xqX(&vDD(JDIwqe$SO7-l8 z{QK}UpWJ^};}+byWXAf4cH$5-wAXdmWxIeF{#iuIOY#H}2exgikpyb{xz zf!j(IN@Rs|aT5-XU*@nHCmXU{Y2RyM13d+y;f|kuLFbdUr;l#l0^j9RAwydWsHv@7 zMi$n}L5Z!RPo%twNV?*T%=n^)@`BC&ITPO~uar7ne4dUtUvZD?ZYR&Su>NWmSWhP^ zibv)`eZZpCtWg`zW((6}Avq+p1u5oK5lhuy?dTb=M^4t1rI~{yO=i{L`RsHcY_9y`TNwisQ0Dp@QJP^xKQSLH}DrsrR*I7HR`62R1j2@rwc7hiQls;N~= zaUdFY{B&cTiI--_Lj~m$<+LHbN1H8Vtz3pWJ8Gp_C+U9Mc#4)VyUhz6*8bhBt0qrS2rcp6Q82q zru6&qd&c3)v2niec=_z6uIh$al1kFqU)qq2io{Q4rYVjUAD9$1e`j=>^$;z@z0&#c<$&-dzd=uW$1E)SlQBwa=atF&+_K$g!yy3fpUAKrX>+|4!oH9b%LP~s}EBv9ZT?)f6` zDA#55jBAAdpy91BbQ6L3?!#?*UsUhHnjeX_C{VFQvCEZy`gL7rFW%EJY_7K8*o7~zrZK>z+Y)0XGztI4}zwO{?W9K7LpjdVB%Ed48Kze3f#3CKKmQ~MdMxw z%k}YRt7WiBVPnF~pM=NlFUKqX{Wc~O*`S$*u93u!bzB*Wc!?o{d6F5cXsuwiRR7s| z&9}Mx;?>s>@2okwC}$WRn*{ozB^bTdDNUVA#au(jiZ62lTyR?ExM~0KKz5O@r)i9_ zL-vNG5?O{WPb;`W>cV1nRA?ne>h_yd4-`SEuk3-(#a*oTsYfbBo*vFmpKH^s37AIm z=@z;k|8x_78r^jh9U*!C10g-TmwG1GKa-nAY6PqiyIzYe(w#hBcS${?$~et`l}_j+ zA5U8gi$=6^gV|T4h8}1y;m-S_YC(8y>R#}WZ}CshEd4WM{&0;z?CTafpodi}h{z0^ z=b#GQAoy%>VDtk;m(T}BjGFzLF538@i$XW}%U-Z<8(ZhI>kI>&b;mP+k^J@1H+39x8EKE?iwetm1R+vl1gYH8U@w^ZfR#0 zV|xGTeH~uuUV=9`R4Iglu_o4a+!p6LkEoV+7d$1wNoit{rY3NaaH(zvdDnc z)g*ur5|7?nlHHK#H%nwyVe-TXJA>UZR{Q=SGa!S2bO!4RW{q~6I*VDaE^O94s(iyp zIAD%l!tsY!GKHNZ(i##_?sdbSi<%}1hG!-Uui}`ZLhj#C2ULW0O_=I_0j=ii+664K z1kF&=i5~(3P~`N@?=Dga*hodZ-(r~a!`c(VxW~nF>yy5(&U3JKM_dwPa`o%-@9M+5 zr+Byq@xu!J|0YY&upm>o;wMpBcb6Ox)#B18z;i4#%W4vChjs=lwQB0*<$Ob>kr%u% zZ-l?bAcqK+T?2~;xq5nGP5w&JA@-=`ADqH&X2cq~!bbV`=R#0j%_)Xh_a56TNPC1p zNP3JnnGyrHFaM%8Uow&C^syQwDW+J`$QWLFleU!P+GiW^NC!Vemvf=k>Pat)!}7?* zrRd;u2-Cvu2qx7~nWs+=g3T4==3e~V77e)`b)R8{;L^$w$Na``@>kni z+8)&A5%!uM>OucEqb(IL!^>d7dCmLvL`^_DofApg0JSSb)w-pOVUvc|R)c4foZ1!uX4mVdry24k`V)SjoV#(lR+pA)o|^}0Hy%r{W@m>} zq0Sc=P$g9+^X|_KWgs;TSA(U?*x!pL2@4eXU;~oWn0m&QR$m{ zZ4^)2CUrB%c%D5W8vfnXy*ndSZK6l$Wf2oxE!E;A|+S4KGRtJV% z^ZHvE!N|(Z85TJFCk(ZU8RoXjHal!}2(a#JWGQXN!@x!M*hs^DP~xP*`z3NPc-QaYmUZkxy}iq)GL?J#SaDLyG2G0FjYAQw!9 z2scj4qFiSaCkDaJWe!Oos*Lt(A-U6ma^lM>(8a@%%-sH;SlHMY&?kcF*E|i2pv>7D z)?VBYBYne=Xw6p>TeQE&^AuAbpX#oU_}WbLZg+rNhQ~ksPp8)6*It=ov&!?@qv+D3 zg-sb%qN6de5-PV0Fe@bx8CKYnwtpI+Nuf^)K_X_I`ihAai={*o#SrTA^)4cFjukTk z`SWB)7r07fjBeex@B8uc;c{EUd*PsH$JT2E$Y`;JT;){HKPqo6tRh!{#0Pk66?$EjZ=*CkCh3wm%A zMDaL9npY9+yt4bver71D#y>7`5PpPWV;2W1tO&@c3?kJ!bf_`Mvp!^SQamUWwX~=1 zp1qo7ienGaOaIN~#X`{JhcI>phyD?zF=5>Iif3ZV>y8`Jq=n9=PjsEL^pQY%D;?sy zKi;;NIx!IFi@py`$QKgYz-7^C2v!lO6gc4H{o#M%pJD<_5O>sFHl)&xX{8z{);LU;;#1LY*h`;#X zYWhd3*(D0&oT@B>K@g1Vx=>xnUyhx&nqqR#EzOY3vDi9Pbt4ia^HH4o!!>qF*Z7lu zE4qR;Bh+z~GTQ8*af^BHQI}gzEPeN0i`m z$ocE9<+>C6Q2IsaRV2v0wQTddg=S8?c8rv4dr1%>UAE>GUKi!kg%W{x%UMm7$$O*% zLWR`Gn_><;-qokgr5c_cn_MnE%xT79&-i*j{3z@N_y3WHKSQ?&Wj4sz8)hxm^)#6K zpllorzii%2HFDh;APl&yFze_AoJHjX+a3q+SN&Xj2G;RtL_hUL;IAV<+&YF3%DYcax0O7*u~nn zI`e?+k5$vTuANG4vT5`nIPDMr`5=>b-N--8*TCnUme=L>!FRi*>xikB=RevVQFMpg zHs2vG>CnlgSC;Nh^FMX^^L1sbEuX&h8ugL5Zh`)J78%9|9$2)|WjY0=GU{gIp0n!5Sihc$uwB3J`$cq<^&`G9DL3JEdUP$0J?_11y05%JX^V zO2Fbnj^ooKLX0T>T=JiV@Cf-~XUH&5*TcTw<6+hDGlk#&^h}gcjS6p4J_Pk@FaYlzy-I zv7^+z4FBZ$MC+Zw<@^5rXTkjUZU&>!S$~tj%jxGdfOqYeRW5&?Zx`oq7y|WQH=FHv zRsxvU!&aZwbqF7*XLNlTegs}W&wUb~@%r-&gdh%09gpa#I;;5>VXB=^dvP;bpl_m@ zj?*=`OmJ}qky*>3$k^H#YB%dLw&A)qNJ26Ks|)MY11-y6JL^xBo8QvWj>t#)t{nbN z#rU}lT+`R8Eeu|YQous^24fQXKNKQ1cBMlGkUj|dY7)Tskqtr^A~7Pvewtx63$x2w zj>r*0CT`UYxe^N*&Tt~bS@HQJO4yXdv$xckebFw68ct0?G0Etb4VB$VbtFlV?x94; ztNJ#jRwaC}5cLErF}d`8={HxOb>283DGw#GrW4oZz)Dar``ioP1!v@wb4O(O^`<)P z^k%4`%Dz0N0obQtl7_e-1V2pSL%i6ZaCuYKuNmx&cXsH*4I?`2Ro-e_PE#u>=;!P; zDiU>H4Q*-fRuG1eUGWo5o(PW!RmheBdgoU5I&8HRvU3S7`q`AibSUhu2EF@Ba4DsG zsW}}&7#F6AF^@VRy|F$Ll|xaR(eu(Fp~VS&0kqwwRE0m7>xT>>57quiBsK#?o5<|C z^Z4dXTu66igmdQ%>T=7PMjSA$q1aBnj z`$feW_dKAKGNrUkTg^xHl&=G!VR7iJ;ial9ZdYi1T%9lGWBr4MCmnya+5pk@ zd4WH`tQL#XAF!CZj7Dn!V~Hd$q~$4Zk;KF3XMaR6I#g)6l#`!nu93aEXQ%p6qd+;q zE;cLf7+=n2gv4`1w1vJRaFp!~gA#=g^*&Y*-e)F3B9=mfi{TR)y zbgnCo_xEIbE`ZT+Vw29Myv}_o-7A2xXuvR0do(6uidH9S$cHm%D>qFwuk>^JLId?$ z)$~x4ek6osFuQF8UaY(|@a3V?`CaE3HY{|>@MS|IMpQM_VW@9K4ec%(mC)CC>$`-x z@|}VWSrQI`3|lV#9Gca}x#sB6jhDYpg?mJ}8Xa@3^FwTyGPF6L z(hiL4$)?54wQhT9sw>q#bqN^Ffm`Y)=_c*dM}LgS>DERqD|>T?51`*~((-4)N-kVt zw>uI^QX|@g1gJ9%_argARlK+1_Q1YXvTFwDxj1j53|*K*2~daN!~BcPFE4q@>D-C5 z{J?7AY&YUEY`m?%8e%st$eF99MJMUA1%YAs;uRa zcS)tsh#iurMSjSRFj4^dIgFCb7rg!?9;z^CkiH_LhOv*2dBjq|69oT=IZ;@B``sD} zYrC+uFQkH-qshvx{#@VjM%p-c%~kNO-A<4E$mHdc(?XN-Cw6G$(`UQ|?!?5E63no< z1vMChopYkw%S~9t(*b2BTgA#7dgWj6!&XaMxh$Ja>I#G(nMDQ0nwVj&l1rcaJDq6$ zEAap;&FPoT{XRLVrIimGbA)kDX6bcQMg9jXzdn}ecl=H}O5Y8z%i%Q|`5eaK)u(2{ zx$rH$dEj7Kv@|Vyc2UR%cJ$68E|(`E2*Cnaa*NFruj}i3Cg@{6H5Y4ON7hf)}Rn}ci_F@->Y{mHNk*+x(?{%yr zawWM;FAB()wvL~6;vX>)a( zXRTc}|4$aGu4;t*eWe%i+;QYQAR_X|H;JdQpeL(y|MFw7|Low#w$*I5Nf$yu_nfNv ze5ysn3PA6(fIw05EU`_Puto>e)sHx;4?^JQAHiRYp#MwPhRq)Nt2^)ZXyDd1H}+vwgq#1*4U;u7^##s(*_f&_6BPIfxaVQ-sLj0dML4*9)HCD6}Vl z=cV)i#Q9=f=VG^QVr^X-2myZOqd4qF!#f)xuG@J8|G5eMcD#ZB4AO6g3_8P}g$5nH z*PV#f@>-ZpuvU zMO3L2eAnl1=CWtRv9*oQu+ehZ^K!z?28)!h%F6Af*^}3QEyeRa|En&BOK##x*m>1h z^ADj0+@=Y7G;xbMce1JV=vr5UvRV_kSAMMMeH+nRE-OvjWGK8S%IbS}G&1CX+)Ogz zNI79L(T^7P<0%Et{WZqQ7wsWbyA+AM6*0g~0va%ZSJckw^(89N&F`Ncp|ow%wSIOM z6!?{x(OHc6uGaEM<%1szluDWWxs;0gu1S^C2=h_jc;y`cWUlv$Swr$zen{s^!7=LTw)y$X5IOZ+nPgh3%C!>ZsFCRKJJvp)XrPY7%?wj524`>G{Uz zNH<=(uj}&}7J(`&s=|(dY)IBULUzPK#IVuc4FuyzhugkEd^?sf-9ihmt^|oJl!#L4 z-{pCBcZ`gn(YvAQhj7Z{AA#%;)sW`<1ZI%~i%}WW-+;hM<5gsx^_B9VaZQO#4;ySA z)sxn%5UXzYU=~)IurExrsLB{ElN3e3WWIX8lmckbRNP+0SP$-G4!hvsp~T>vDPcGjghxGF0wAWCOEQvMT#yz126N}@5%!Tm7J@t_mF~YYP;z< zCe~*-JjAb!=uAJ(hStAM&;wPw9S>lZcNFF%vX#OD7V?){3okNA?F`&Q8veZoshZHd zpkK1rcc)r8Pqx_Y5}X@kO34B#c`RVfO&%MJotvx6cKPn&4O$(KRnBDq;ZqvzAH@5kA+d{Mxq=X31V`06^&mC_g@x2&gWhG=}Pe?J4cCd zt|&C=Tm?@pV5?18Fe3i*EFNlW8L#DH3w~lhhMe)m*P>C$dCsMAu>YeUdyoU z9ag7#M`Iiz(=okh0fxptYTwa!T-ik2MTia(pm|?7GAF{EP#3{|Y6V9XBlDHrtFklH zAKURZf@V9%#T0#qqEN@UBeNXDMzWXvKiF&L9q3(9bD8yMdHY_d76&(i=UvT8v+TMy zfDwG4qjyktVFs!Ox`rmm{?H$tvUgSIJ}G!hCTW&DgM9%pD{)i9XT{!upU$xM74WRx z@Q#O$2Wg9?Ms2wrto7oNzHwhNww!<89u=1lA=#FIXZ0+r2-zKZc~AH(N(>IVb(KnC zHxAfc&?rPlPMz=Vm&Z)-QRxO1hRLOQVg6R`${*-IN(rs$-<8lCM1FX(hj7Y^--*cZ zD$>~i(#u*c2%HC1I(UkVFeI{)HU?Ju?*;CZ+onb4SEcNND+&-1K$~=`+hFrFX>wrf zSq~23Tpl~oS-5VPkWxD9XQR&dR_w<-9D~p~4WsImNY%k_0hCA)Kt|anhu!O?j!oqP z175i~sQpJ6%Nu{T^A#j%e|5>HWuChw6HPzST@+{P;j^mU>4TfUaKH;)3bdp)%Ab10NMm`Ru=tN_;=pLHOHMs%I1}R`Q0=yTs^FB?U!*D>fTQ1fB3M1 zEx3k$jangp%B`)msQIg*lb4WYX7}Z{gE#wT@zF{CfRx}@IvE-Wm6dDc%iBYaVgj`FFEpTcKNmQZfm{j*aRt#uT>@t*@W zETj{EiHiT~&nYV+ptwwj)p4ottBX^X_BzPW9`lKkh@0=wm;NxQkED;4lt6ifo$B|- zMlMQOT5gl WWv6_s0F)Ww%TFWH+WZum6qFE_#4)fI}}*6N(t2PatWlFmYD-zQ;yKB1V6%E!(eQ-m0Z_-?@L>pAmQkn~15iK%X~r)O zc5}d`iV2m~6?cOj?53lZzv>}FxXexI!MLH?vFs=g>)WM(1++V1heT{mO~JSj4J3@! zp7-YeRIK#Un_d=n0*NvAt79Bg0X0^Vk}GPBf5E_}Kp%Y@ag!;T4m zlWNpIu)G%er#SX)D?elv`TA`RyR6Z~`~;OgoDZ#f+QN`I56!LxCQYkYIlCc?E8fc(K*Hf`x!nj69GZR~F_N21hP#!R>JInub# zimxCFm00i}V5 zOC=d_p_(mO-oB?@hn9*l(>pM3tSZi=JU z)@-AS$95;JQd(_eGX4}Tf!=Z4kQJcbuLEF=_PfC%2K1N%Q>+fGK1}) zTOLIYN#maK(N9{N(N)lK|A18;Z9E0Pn$zH_*Jd?HgfD7eO$R%Hl21WtzIy7BQCOMd z7K!g>^)|bSM;1p?;druX6dXBI`S}2cB)@QHAxy`^6WVl!7l#_?W|32c5=4=d#pw}2 z)3lpJLRHA4C2T`)s+WjE#@u1ZKA{&~{2Xz90xKyH&R=SOr($4Q)D=T#?B>6h>ak_e(|`Ihz_1G|utelfvDH1>`Dli#-3;i%3fZKKu-18}sy z)Xsr&szCLWX?|F}|E>QYEj^Qqs)0BY5AO4{dGN>y?cnJJc%&R!HvRtP*KXk55S}?` z2%2JBh$DvcI5_n(b-50vcH3UdhVF4E@Z-GSiVqxEMKtZfkr(VdZ2$vpwWP}%efsiI z*>Z@#Fpdw#c59xa$4!<~CP$*=&BEv__qj6047SJjeyR*;2((e2nRlRk87Qv@!uBW4 z#m~*ATyNigY=VH8hasDBJmF_h2t=&&JdWT zPPO*XWUphxQ(8&o?e|eE0a2s^HT1xg&=cIx9)H+W!&WTUh`rW6mv@j0{h!* z`+utB8ziJUCKn$Zp2DYxO*$jg4@Z-C%|5x@ASGs3=yUo?l544VIaqXqcHVB>dbU;H zN?Kqz>!uJ;@D3e5CAXg+1{K*v8gEvr+ulsYktDSO2$s%aRv zm`plNL>DsXjdVC28qnsdRbjnTPnGPbSEo)|)F#C(*IOcN2) zO0Ri3JPvlHF~*pUs$o=&Tg7$pk=4f)ZpN#wx!x0p3Zd9w5P6bSvxPu$uuLnLVBiKN zjs{l3lE-S9H8ve!!jxbLDPC&nhV(BigOU%5KzRo;JDzTL3)E6Pw?M#|+y_8Ni)GHX z_`!>W^<54iDQYMBIB|qnB1ncBWaGt-{ay|)FQ(6ra@}IWKlw3nUFs*>;O`N&HDiSQ zNQ}cn-73R9L2ZYjn_nX(ippGy;!vV5gQ|qDo&dQ&Bv#2nAxt9rM!P$f9z5p{dlfeGYK`m4voFcFFJR8);pF+(s?!L}4WTIiT5= zO(BO24V|i63D2 z?Ki7-8^2>MN?0_(%W#Y&?AlhnWP}PtCNc}NMJ>tWCdi`}$DXj5;kN=q=6CZWK0;ty zgy#`1ra4t4H8_>GY4Y3AcXPJCaXID*($+{`$XTOkR-at^I-S#}lO{y{$T@CtQ^b>Y zwNgR%a!klSP_oP_51L;^1LSq9vbM1s%xy@#@}ybxK}!?987$VC7Vj;$e|?Pql_kp8 z?V0$!47Usj3a~9!Qy6BlDKT*aF^h z;-akZqITp5Bqe0$1iNVJ2Q;qi(56=*_b}UP%^2NJPZUQq2ATdgn-}~lk4kEd8x~Eh5omOOzW(k7!OFKsWwWdrJ2DSO|B`EMX@xn# z!pHb+gq}B0#|dSjj^?zpJ7JbmG)xeD7-wyCtf(?4jLVofwdNUFQ&l%FilX21!<*f8zyCo64bqaGaK0%^8Wsc4V+*8-9#yBB<~vLdGr0%GT?i;jItC6q2_zw?;Y<}8y7%f z=Wz9@r80$-a=M^N)RWKA?-Wwp4COPYS9-uQvf*`Tl%>O%0DGFa**PEJ(%!3g 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%0D4Iwfo;p6?W+*v`tK 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 z z3m9BgGn8F^QCCE5P0qL)eZL@vE6|^Kk2&%dw;s2>IMs%8yLhYas-~*$*(CHG)}RWI z8yDZ&mJ9s=Ke*jev(Uo89w-6!)z5gVp>0^RU9@oJ$(LK>hc%jU$$J?bnNRY4JcF); zHq`+(l>SBqN&ofl-)XlJLUn6b3lvE~$lTOGC+_j4z~Z^O&}X~iX%WS)6GAHED_av9 z+S=N2ayPBi$Zldm_WaI8y}XMjzm%N~&MENz@paFDHGbNkp;(LSuSk)vZ)(ou{PD>j z^V)N-R6R0?OGZWp)kUqxi;1^9-fvmWqaBMnsMA}fRFh^VfVU6 z1zZZ?o`e6(A%6_I@$EkbDg6sOlk;g`QZ_4?vUt$c+NvIslaxRDue>>BjMLD|-WYy& zcm=M0;Ss&8Zd)iDDIqQG{`6_mXu}ni@xCCW?bzNCFK_RMAv{up*LQXx%-46eyTy<7 zU6{0%MQ_#i;}c3>s_V+(@T_a+<0`$qY)xT1l?L|dZZFpZ)Lz@0URYDo9Dn;{DfGXu z)&KbFg1yLpO#9=js|PdVblFq^6GWG`ko)t362uLaCMG8-Oj}jHBVmw@^}2K0@>bmq H*M$ECg#%Po literal 0 HcmV?d00001 diff --git a/doc/html/tutorial/img/shared_resource_graph.png b/doc/html/tutorial/img/shared_resource_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a25ed7d7213b4ada582bde1955cdecd3857fd42a GIT binary patch literal 74338 zcmXt=19V)`+Jc4MPy(%80br$J-ew#{Z@8;xzFX_CfPq(g^& zO3V7gz*XIZu|Q(+fW~ELU6HDj;U>%0NN9bJTK#RcnsB{a|17Z71iuWLU&))!VisAp zUPK(3ffFReCQNKITKMqs`Y=f{jdUA?{{<3sdDzH5@^doNciOMId1c*}8Y`l>Fd&U}5UuQDtV(j)Cv)E z_;6JI?@u(Tsj14=)^x;zemU=d_fUB~Z%X*J8F6^;7gZ}gZ~vfFnop!HmdO)l4h#&$ z_#u^n2YWqiIP}h4_I@y9PAj7-b0^X>FjVF4{arEiSC*2B0Od>7Ogq`l6+!3vJs-Oa z<6DkWV!RKt#<QLD=ep@M zQ~vvZOEf7%!JZ%AV~U^ImXDg`Xux0u$}Ec zMBzfb0rup?MB%lywY!6KLm6{4WbD{-hn*f3aMeop%k75b3Wr(aJ`?y)>Yw&G1O*NM zU`LT-4GIUt%pr4cl3`1hy$2>VIqV2z`u*L7)wZA)hEo?33b|RRHbrd zNFfU->Na)^qW~qnf5=E{EGr^`@CLme&a4%2^&G+PPnKl!8WHstU|bO(Naqy=->Bj% zM1PP}?lZCqSE`OjsAw#<`(a3Yf{RmvS*xz%#TzD15dF2RtF_c_aIJB81nXGy=o~N* z&E9X8a02TTca041OC5J+J=>(b$GA@#(`W-4LU)w~*OrfMyucV<8#YrH6%21V;LAI~ zOfeg!lz9!~gNWyhDL>5j?~%hZB)=?rW0UhWi7<)K&aT#NogX3fmm~aaS5Vvgu7mQR zspk}`Rs(}Vv}y!$9Pfxc3{>efpTOZkqr5DZh)uE{j6e^gZH&e5dhF`rtIVl_s$%EW z2Qx=$bdpIFE{`r@oXTLb+zgIHLo%>gcK>*PbN)4g9xMpr2Rp~P#7_P^9z}wVP7d2V zT%yEnUhtRri=$B5N4(&>m0|_%7ZEs>0s-37MuU1Kh=OfiXj>dpM!ab9QHE2dIGKbc z(mC8dm7)M~4Q;-ZB}mCnn<9yp1Ojz>RZbejj~81Er%*!P;jpQG^GdOeQhKPHkkBfg ztc9dYiYERaZ;vX&;0eTqWF|gCt5JKU=?3E(5@pjBnnPDrwLL}LJ3h%Os;UPsiwJ_&q~%C{>HFPIaW|Qc zpsYC+oeYFR<(6$1O{Rf5V7~=wT}Er0((aE(p$wthgK-q#4gRw6eL6^A2mpsPd#Y=u z`O+^2mLg~lEwo0@0LBEZN~O(2BS+y*NY)l3o`vQW1KAaQcVc~?>mhaph@XogysAj<=j-Au zT~`p*+Km!A@MZGZ67E~B=}jb@>a*y3zFjxt3@T6fd>*V@z%1c39tfeX-t1GU_q?@u zzFSbF@?s~pc1*xTIW{lI)#sgLV?U^Qsu;Og1u>H@wB4r?-658xqIvFIt+8xZcD)*1ga zJ43{?z#Aq6*F+-s7#tZ<_44Y#`eHGYC$CzraIhvs>~WCqa|6$$-4L=|YsdoKK$Gv2 z^sW1TnR7(T=~0ICp-xlL{l>Vh?+a(a9`3BGYDBT<4l zz?Mg^mb{L&2V7GTZXFGQjErpeqi)_P7j?Ph2op=V?S(xiv0&T81PycS2vTi;E1>yV z)4;P-E`u!OcTj!MH8Kd%2UvaPe6Vt(;2!oyF`)xsp$Rm51f)lgY~&I3*bU3T&csZK zYkC7ckvSZLPdSlq&Nz$>u8LG2;P(FdG;fZPC{{=mN61|xP0RZppxx>Jew%;OEsSQ+ z=2(aoLr9o`{r)Q$^{D%CJ2@C@8QDZb3;M7hY$#W40h)OwgHhPUWD!*>)_6{Yl-=pK z7#)_gp$hco1M63$N0+w1T_Ssg(uiDm0cz@E_@ zRFI#PL}AH9J~>bdeh-OL7>4GWR_Qn^xvCO;0wKf< z>C6%G=b50MNa3Bn|J%J=x-DqMX8hZ++#YoQ7qvSFEulI;d{d-l<^JbDcnPBHB6o~s z#~QtM6=wB7b~qL)xYrD=pZjPNrZFT?2?KwlBE7V*j6=iq9$I_fk`3BIr-=G?KwA|qk$G^|;OD>cva`Vb^!OWecG3(RA(rfw6&dFu6 zi@Wg=*@aZnWpD&(#^o7`+rOLAHo z^*b<@kq_q^rUSZqz`peRdW00$`{9g@*BgBA@AV!9Ik~V4kQqLpC!liAE-7gJ_8;2G-xHOO$7#M~?+Kpn37E@wAK78&HuA}Ao ze)O<00XOb9a0ENA zZu4&-04G44XRw);6yTDOFc%dU4|!j9)5uXL&#jqez`zdY1DV1&{4$W7kJeWLDU``v zk@)Y~LQx6JS`8uc*Ac;Y@_(uLT#f$MdZYdzm={Jl$L}}$()AWo1WrK6lhywClkI@h z>3;c{S67Z-nQ{m%6&i zeLk%n3Pu&6Wg^e;2_%AK&=m#qC8F+MZ?R|KbvvW&hV}b+a|cF}6Ma^pru#wXxF5#W z$H}RFPTS-JFCSZUvQPN0!_tpbmqU{iR4qv$9ir`UIi?7eE)KLkg+%2e)0Zg3YY-X5 zLw+vj-u4hxC=mLq+wIjnr|mqUY3TcjS|NvaV}$j0$xiCWaxGL=^Cio@N++v z#a(H$4NiWx*cbeGz3rGp-Gk8*e!f4YVQ$~YaQZz6|MLb2$%YYm{N6I3T!BI=>>$`! z54<1VHp&P)02<{qE(jX*J*X7on>~;#V-s?J+wV^`M*0oR4KyIq=cm|uJzg+vwFg7f z{!rw*4$0vgpu*6#&M*SQWSHT9%(0p)3f233H^I`22V4xwl{8z3H)cqtQC_G6!t3kp zjPukkvHPa+=wVr_hc@YK$~hH)@3C@3f?5B3p$ zvi5_gFnjbF*%9)2)a}|@=eLUu&qZ*)G8 z;mLG9%yobMW_;M8Y|1FUM!}qPb_wq*YbVkbQ6QD5x+AR5^hBZahg@b~2BmFMGK{t#7}; zl4-vGnM|xH-Dt7r;QcBWa8-dvF$!m~QGc{XDhG{EA;Z-dq9!jifu4ChMzOx_Bpww5 zAu8Db18sqUPJXiGzEgd>vtDN$tXFawPsoc>!4B(fV%WWr2`b{xreqc8Sp*`PAmIpRJHs6?x|agRR9rj34n9zbMS{Jjy|`wa@| zdrw6DJ^9$$Q_-Rtg);|+{eWi4D5%}%+|uvHF3PxR^gDgQSqNNa`5DH&zb*bq$)A_& zU>xO?WV2dar{kw)r9Qc$I#x%G?s+|1zoaV&8Fq218=Ookg85;F9iQ9SO&T=jTrEv? z(!S@Q=9l-giE-2FuZ$F5>4vuzOp-aojioDDQ%_zH?Q^7mWRLyquzmrS%uk@XqwjLE zSh);CMcoFBR#{1jlx*S$`t7(_QMIW~5h)XJD>bIVSVkXixwCK_J=>4VvQO@~CoLMW z$}A@{b`Nu9&JXhUYhL%V4W6=Z?I85k8iErH69{bckE`ALKPzQ8a|N=Bn7z;;XWb^h zX&`}9yc980u8QdgUv0w??8a}n7S|Ah52j>W`I6S-$NAHaC#+yPpBgF!c4}2N%4YFs zBAlULXFf+$2y!c?{ADQDO<^Y>pGUN<8QiCqK!`%kDWzhe8@FL==1-q^oC6!3nMv0j zo6O_yoc2fbg`qa$cGx~U%=G}diu*aobnnQyEzzWyO+0AR;QZ{cdl806vv;}N*1w>c zN3~n63xq)>kpp@$_jhchaD`X5AWMHWjU(pAqRuq2v4yV7o65~0ZUzSWiiUO()IK$>^YK6#)KvL)Bi%jS_4gL5;<-oB8JF5A?H~*g-9E)Mu4n3Jo!XXNI zeE5BxybU%>^t@howEVyd_1mUfG=O6h&> z(Qu#8U*wuOFswYNRS^)q?_K?J9sbkZd-F>q#lAMl`QLhw#N*=OaRjp>cAi0!B;QBc z#Dk``Ty*(eIU{d;R%b`?%7ap6x25e@M73-l;H<~_AFni@XlNF8e}+T4teh0^PiJvO zm&s*{tdnVPOaW3T?k+roVsJT5IhXPHi_;8x)3QGXSKMT zahK<}Y&A4=ZC(m&=y#%8uVv|kfAMQAy0X=&C7!YMZ@I9+yFXcx^lKq7*hv&XW}t_X}Blbk<8#SOg+%)bt%b+ zif=nPU-IP_?CfO^ti3x~iZ<}QSN8%E0_)S|YQLQsOgz((IAU2KCf(mE#Cm|L?R%Ab za!E4l_3|V>RTmz=>1ck~blM)J-r^~iSfj#G0A`}C><7R6{UI4yGAR;nDdp@H zmXfpH8F@4|F_HYZ*=(yRba99fLKznqhtijOcTk&O&9Ic}FVlSE{&B%b!NRre#V_JZ zy>2WY|8d}eF8;(r!9y!oi53G{^uUvn%&uT*~%66YWh}M=Vw1K#xStc z(7I*EwFYy)oeAR0?#H|)9EzYiL8zW@9=05%6qIbkySb9XR8d_Rr^pB#zt2~SlW+Im zR7|UuPX&tr)jmQ=`1$KG!NH5goFRmH4CdamQ=(!(BU^{g~AMmHcr-ufxS!=wbvfTyp3t zhGQD7w&&Rf%x_qmtto=tzRsYzz$QRpa*iQJ+ytD!><&ZOihY6%>&IN}cu7depv^J!>6&JoN?vY}6btEL?ACyBl}ZsMrC$l2s>;I(9){im9#GvaNWg^zuFW zgTxO4W6)}L@Ax{nbuPp+&3C`3?u8~VM-P9P-tCGps>^$zLU{6JaR(Ye8sE%L1gC>j z#Zzn!@-b>z{NKnlsD2-G%Kmt`P`SF8Y;Vx}%?={gu{LN3Cc{a%VG)HTs5}*FzFdb{ zUcD1BZb)tIykQw{LWz)G3mpKt4v+nST!ArvnK=&ef6|aEr4amDD#O;G-`b1K^4N4J z?ENkKgnoXnI=@l{)V1Pm=r>{d!Z6lISFqlfVn`chrY6E-9`%Z=1-%rps@6%7X;sA? zsDuPQFt-EL7U1pa3?`&Wajd=9`f4KZ^fcq+I>=zgQ4slaeAdP~>QPEcXErHz$&Zvq ztE7wUfRFg1%l}{?$>01!4C^fBW7qW7O}D#d@;UO=<+M?Jur#`89-}>uk!I-0H><0M zGQCX+iRn{&R#J(#g*>=|ykb3K#~d03m-y$IG!~FH6FnV9sRhfW@l5N*#NVyUkV?*- zXMH9XeCSU_O(kMht!U7d8sI$rEu%mBaA-dnFm>EKpKVVJtLE>cemu?in`ymwKwK1i z#H~Z+R4QD>HcLDbdP=u^w$7e?JZAFpWX@ktuaMrrb@pvIOD+OEsoA<#KgQ!!>UjQr zWN!7g7kv-9c3lQ(gSX?F5|IE^ichU}BQ=XJ53`Dg|-1?5hCJC3;)Z0skV&?2$0 zhbdfmn>6L;fNXIukSm*mOTqdD;{+{)w~m{D^K5_ z4FXHCpahEK&mK5wuV%Tv3pMHoU4vO`sXmQ# zGJQ~SUryUKIv-o+s1}*p1*cvD`9<^V)Pv8+M5RPDEhFuGO_~SYhX^{&SC4AQWtgCW zA`In(N(%+oU>k#^3HP9xK^pT23|QI7R`0a+Jeu{M7D)l&W-hNDzSh>Ao5lCL1O4Xd zQQb@#Vdn8H|F?O(=4EE3C}TCXlni!r8KH{%|0=)>NU}R^t|;Nl&+F&MNz5j=yvwUgt2k+8 zY;i+FPu4MKs;_29x>u?CyM0>G>Q?LTH&RjZ;FY6R`irM^N~QL46uE{m3|OwYt1%I{ zp%1cg=31$>KiKczNjC4JZ*YG!`zEB@VH>C-FgAO+8Q$!-EB@e*U?#%B`Sa+z2`)>X z2Z@9G0pC-&p-;!Y}vwfBLsRgT>BEF{&Z_@bkUH$v~ih?Ny+_A>B zg^~G*mMZ%V31zi?@RRLQ=zhVMR|CfqL&apu_1Tj)ESZ?jWR00Ql5!u|gWt>Ol*cN$ z44zUe{hSO*M?E0EaX~$WMXr#n)|3f9!={@AO^nStH zT2QBeo6Ptoo?JOqpBi87&WYC%yeAC&pXbA zm^Yq}utW6(b$VG`AAGJTq*E>ptKd>@Q%agC)E=2@t@B|`wIg!|*<|$K7#^>7_A+_P z&wyZUij(&ubAnUm4KYEwlsCTd-TRG6@q7mV386ck&icu)cRTCj!dSr&m8@dsXBaZ# zm44OHcK6qRE&ISuW3rR52SG)9i^pxfr&y;wmgOz3keZ(JZ$;wYBi-JlbfODq(KHz( za-Fs;T53nWMwS?-pXf|--Hw{%iIN)|uXBKYXlFZ-g*?ma2&L_|F337zT3OXpkTCujp9*rT-wJ`>CTE^?`f+DP1XCw z=4b!a-%rF#83{@!RHPmJ&B`k}U($@#dln;6?U(d>k76#=@7lj}rEc04CX5HCv^bK> z=k;#x7U$*XS}kEYc>WO1R}%%=QZyT``cBh4hoh9wWkCA?=B%fmeR+F!VAPK?ro+7s z*@MQ%)3!$txA}3q=T7lY<@u?gN5OvExd(Yc8%6K1n-dbRbEU{^Ew z#}m-RvK~z!|L;!aJ%z~J7I1TW3;7&u>2@ZcjN>P?!+1hXc(?ye^+;sF=43_1wb75)jbX++?frxxYBq(z)5~Jba57_ z&fA`Nnc_O=aqq3X6MiN+`7G?sz#>;b*X?Y5f9CfPujbWm`E-Hp9N77pI_Z=Zqi65D zmFi-BC-q#604 zb`q8<@NIn(>$!RGIZ{;8F`r(V79{VEe?(oYeyg)o`QtKWq2^rWw0s8*wb*>gGG$;v}Dvoh3kl$GZ~`wR`egn4e??JJ*jRQtrt-H1c&ugYuHt~cXMPnIOUONcw$=#gwo`y_%fvO|Uhoo2d_rYQ>8mS{U1N8A zW4d%rFA9}b_j$R8_HxY9dSUC*M#ksUft_x#eq zAZB1Mk7}()j0~^UEZILL2ADj{6(#z|$3;lGF5O&CF?XRv*l0I=y~+kFYC=N zN}b}@Js4R9@Zh0qRkY&|D=#pUgTpf&~loc-=4LfR4cZ`>qbV=`a%AuWvg&{6>#W5;C{duiTy9?juo^ z`#E$?6M8~)PA&6>0>KuHYt=8Hmm5Kw&&h%w3?JP?%h9&WmYUJ;8rogC%inm8Jg%V< zeHixg%VNH4=(g7iGHn)lGqmhDxzEJB881J2-r;51d{_y*;oKN5y{l|C32L^nEc{j- zsD7GRm;ChpX9xM;+^7UTE7~2Xuh)08CS>tXBAxayKrBTwhpU;4j3Hp4sVT0s+_V6<$+gy~w`SJZ* zTx{LSU(b|eBk$p#)bXl9sY`xSzQp{_VUK>j4}Y)XUfaB54+oKR*R9r@g-DhuS1Qh|E z#j@{W<7#BR?~brra>u5#Aup}`vbO(nB^PNoDxqet60I<$*(dG@M`kLkxxjj&n2z5c z{T?oZ0(aEyeDwEFbm_hK-O=3pRs^Yyv07#G>UMX~(FM7BuWSmRilKihD4$UivZVB!58~y-s&oLm=Q9C{Gjhr1ToFK4`pq64y2$ zP@h`PE?9SfSDTRXFIt1yH?M9BA6ZX3god$fN?k8!FTC2)%u#12t=+r|lU!zEF0W;k zchOi|YpAzbMYnskdwPF!=xtuQ>9q4dZg`V-wew#xdDOi;t(N;at$KL}Ei*Px2cFvU z%KhkIHaRtw3W*EyEG&FqSL1Iq8^hrBd;KDx#Tm(%wqB_g2qLU-IPkpKkgGxjF;UxY z!N3;Q|4z@Hk0Nwh`h-=}=~q;Ak{Op@hg}wZQ~9ihr|%M4JtUVcZu?k;pd|e@O|I;H z=FjsT(vr0>ze$9JoPT9j-NwKL^Z8N3!I8X%oULI$ro;krcjsb3T*v97zS$hUCXCb5 zMOQE7V}-kaKwO5;U5Mj!c=u~p^O9b8{eenihni9l8X(rX(UG-64!glG7gu}!+ zie;QwW|6I(Q;x;F#~pveZA(C+_uCr51u`?5Lgc95abGVI?h7@JCIq)XZZxBtlI=Dm ze%+#Xh;Ibaf2b5fbR;TMCA;Ha7~ zto$T8XLeOr&uBEKv1VPecv?q5z`)!aj;&gHw1sR*Jf1BK#^ZIVK$0|6h0x^=N&l>B zf@)4$x@4#uJvTn}{6c>byhegXBf^mHQf^OLB;JAayjwPv;Y@t0Z3l{oYueg*U^85g z;dqD$R)(i&9eu8x50dkC>4R!+j^V$INV6suWw+lz9V+?L>CyV_q@vZ&5GxXDPxhhz=wfu=nVX1?})@xy3TN4@NQEV@%>oM(bEHl{d~!0A1I z+a>P(289|l5?v*NGkP*vQt}T7XmPQj2%08=k^S?vw-k7raaBeBPr;Yne}6}FeK<2o zD=6TQlav4ci7E(slMiwPAxHWB)HAY8xA7Un5vOj9A<$9Du#8_Pu-vE_NI$$O^##vg z?|Ih|ONseLjEhV2`!}YTit~?A2KJW^=2IzZan3DZzcq{@;qQ20r@&P6P(uPQN-7F| z1%xr%dq{f5X49x8*X2(pkpfW~P0eiS2c^8S&7|yJ&$UyPA4Y60YL)v)o<4N3N1vIE^p1Sl>RsI9 zSd2@iQH+Xa>CuwQVC}DcSqx$6eO0;ma0A4qXh7*9@Lfs2QFK;*&)d$8Ix@#*1O-Eg zES?@%p4skeK9zSfT{w-qyO^|mE4bHqFQrfy7j69XvMrMafsVWTs<0>^*5YvZRK%h;NF=AWm6A-CssMY4HfF}&`8|_J*x=(|lF6rU6RYip^~-Fh-w#e7J)>hV z*V^&jps9K3M#`Ue+wHm@rF#M*XO)X3#;Q92tjYFnOXzA=6g6@|QLtNMLkap)i;(dx zOxm{dI_`WRul!4*_OCBvyT|R5&^^ty-CR~LHnwP*Z))m;#vj|}1?Ka=f1Av;IvAn@ z=oX+NYn;BY_J?W?q3Hp{LBrM5A04^wr{Ezf%a>>wnUGV%7AfOe5NPs#=lX2`A~D~P zENXo7V2kn6SjE4^BSA#ZZ_DhZC;QUVH!SOV)ii!A5K_d__vW8`xm>LqjZP^MK`9xx zI1}&X>7H@Uk(w68o}A5H#qyzII=-W(LX}@Qs83=W*y^1nBP$m9U{Hc`Lc!R=v?svd zdbrcj(yMabs`rNdMC`1$d79fP|6+UHkqK|wysN?Q9ZK9khR!AbfHzuDG$E-$>fY&dj$Rpd87OW8$5 zBKQs4PuVhTF==TijhlwGi}?Z@y1kb)+uO=Qb9t>LgW`lJSF7f}mK|TUCz*HhM=T$e zsU25n+KYi>Ute}UaH@5hlai%g9?q-!TOlWah0iD=Dhk;YUKjuO%d*Dl%>B+I`!bAt zZ(x^=ubyAe@(ebXjcIK7%nOw$RG3dC(55^SIp;Uk<+KOUGS2#aUFkUP-hMt@=|ocM z46Cp3e!TeIFu`1vs)>Zz^|u6%1OV-FJpW|=cJP1E)jtfs2Gf%wH)7WBSWE!eu9wSF z=n~m<=HGkqf}g2S<)&B<+f|VWS?YeU0P(BCTs~hwAHi25I5PG9?PcO^7D(CEv3!RW&}Std3Bv*!ks-%t6P_M#28J9(tN6*w~Se| z#RJul7Wms07AdVrBO@c78MD7Q75xQd!#>L9!jA10chwmr(ldFf(q!HgSssPA$PvtbLG)OdA!v^S?s^F#!SaS z;wkNB`R|6}MlC3Om7mOD6Fpn4|9ND`1%Gzx&Ii&o%R;GhWYlX@QgAlO94w9(ps$YU z9|T}PO6HCuihnf2^}22C^>g)b3{S0%y_H;!l#Dd?@o^;un}WSTzP{i#q=8T_5vNr` zinyWY0d{fY&qZ_rhA^Xp@l+LZA)4_;Qf+PR`61|21ST$5R}kf|GT28G7qkqcIWZ*!Ch8Z+b;4e}K0^|@t^KUiE{idUnh4;m=fDyN?qv!dg>i1wI zri5j+vP!~9*8{yu2@dCST3;Jv)Y6}+?4iX<)zW6j{=z&Us28{e|Gdfl``07Wu&wRe zdehhuBb%$3^tX-(SAxc36HGC;9)Bk~h<*V4pf#22GqnfC<-R8+veM9|1TP3+4)i;$ z3cpuBa)rw$s8?x7pAGyjrw=Ws4p;c_lf+lS2m_%BP7RD`F`(_Z+!Db5N z1$J8<>YL6JOe*9tF)=BDNdy>xu$!DFs>M|2_Jx;M2c+NmnRe5V5EaKBq;lTpHO)y} zhl7Al(&=_i{{kFC?1?6;yJo@3fqOV!?i&O4rpTIZ5Ty$f70T%#AhyXsW ztSHz@XPIy;wrBvHH=J0Ic=?X+qkh5dAl#|kuJ7ZPWo%A4vQ2;8ML+QoETc94lf*>mWqmm-E)UNsgI>vcXxP>etEEWmB+QYY_iN zACK%%-+ocux^3f<=2HYnmD_$V_Fl)O=|?~yEdYR#6wXhH0Go5_6Kqs=9V~yMs-kif z%e_q|k5@F7OtbLzxTE-w-<{J&q?L>#Dr~l0neT8twYvQ?RRZ6^3DnU9Y$j01qyl;Z zERW4dszbotm&#(bRRkosV!yZNxqpoa0MjXph=40@#8c||c=z@K7S9ntz?WN0Wz7L= zQ~_YpY4m;Xm;NzI1^+=m?0{#Q#{fxE002-bc6N-hB>d|~AhvtCYHU%kz)t|*L?4E$ z?}FY9upyj|zxss!)Jk8U*7p8G$wU}5YfAnBwP}pnB0$;A1>i^~!1Xkl3?b+=S|I0s zaSHm@whNO5>=8s28%@@xE)N+n1KZu+2WFzc>fpOvC`a7_rU|G0Iw$YTS!3+9K`u}c zGDB}66Mmi@jwP(Dt4o;XJ!K>S5YK;z+zlLf2DW$^ozvAX;pel)nIr#?7gBR`b7|qv ze0(`!D8%&8>ujdOoU8SX)JAst0M&!_r}z1Uq2pH&;(o|liF7hSF8d@D$!HFsn2`Xq z%D7tyyiZIu0Kt_bvUJS?~i_XiVZSTucVD7BZ{p)C`D4Y2}F2@5qSKd1i z0#u@LnD*s<0hE)8OAEvRpfU-Q`re@fjHd2gKP>4ia7#;tycguT=l+4m0A$0>8!d-+ z4ID0GdkgR(il-~J<-RWubM1$D4A8`rQHH>lEMYmPbR{70cBje{L7AG8A{FS-7XUu5 z6X3F>uBi;H#n@^3pHNUS_*Xc8ZzfpIj{yX%sIHEc2b~xnUs^N_DbZDslXLOtj6lM` zATK9kNDC2>9_po{f|h{$TaFJmpXVT$$BVI@_%m=prIV3f5HrkjKSDx6@N&h6jUbBf z=;s#}=mZ4v9?sS%x8z8@&)7PEBp1^4MFMtHA0R?XME)63<^VcN>L2(KWMI1Ay5pCe zhT1mf`*$~7O+!P1-}@nj*;%U2uj$*?`jH*`J(9)CE_-HTB6<8sJZZT>x0m!OI|deU zn=IQ>AcLUZOrad5uoDzOxa7I;gi^#(Zgyk`g{E4ss;Q|-J?#Q2ej*NQ3D7B!JwUt1 zML^m7QQQ89fCt}s-MSn<_n?4^hDLJSRO$$mwPwH;Hs}MuYyZVh3CqMv8YA^Eb7B%2 zDMwKW-@d`u5O_?p+@+o|7?c_tR2%W+{KxB|VCig7CLc&}5QIG=rWKg|X;W+$ zBFH_+RRvY>wax|Imfnc}H;~?x7Da^M8_xpC6c41&dGm@4c>w_I!W^c+Q)Pe!{(}7k z6O6st|1Y-k?!|DJwZ{Vx5_JpJN?fsIyo|9IkS{z?F4IFceWHz!avbaa=L`X?4D&Yw ztoQKG;9AYIxMb(+&Cx)2kuDX_1Gzx3?W|$qXq=%o1(WcLbH38o0yv-7>k;^a40Ou7WQ{67Ql(SmU{ z_X}A2m|$}8VOX_d$neO7wSGM=IR?y^r(jK*IBc}YPa72>Dc6i6BQ<`=uOWk&13T%c zixbFvDEr??Z3h*34zNz8wDXC*_Z*LEFz=lOY z;laP6?i-|(Ae6Z?`+`b|69j){f|r8(a)6qEkx3qhcsAx*Zg^C3Xa0=2Yc{rUE^R4 z2Z!{LoDGi%`Oq>mr!5PXyuCb5aLGBMj-dNPD%~hKuBowI(Xf;F$&#MM!^b zD>j`+flu}XI|%h7zO{K9K3y$e?RLf?Kg31t6`&aPUS*~fIA?{keUFUWl zysTw0+N1)OgFp%GUoc$*H^zY^U)>c5%Zvq>%oR&F2!v&z7FX}tv}(HA3Pa_Fu+64}NgLploMA`+sH3hH#goS33b59Z&EstnIEIMR;(aCJG@5Mt>4RE@ zgJm$eZ{!P=g8A1;bS;!_XMupE%TFwPAWM$1P11#yHbS2Nxv19YSI`h7JVMlo6nS06 zkJwC(Nf(O#d0?0&7rEeCGjfbmL}T?tNAQj7vJ{U>Sn zx`2Kvj3B(KrqMD11ocTs1I95n%%?7}Cb}km+DI!)C9K^%FF?)tLUfHUrhL#G=ZZR9 zK0mKgc~!`mST`w5oM?2Q3UAr~ar%CT33eo!3XKoH;<=^b7%V^_6ILr!II=F*q{=mI zvOyM8KfT8&011u0$2hE&x+sROh@zAFt%*U-s;V9vKFm+<&IhZ{gSd1!Y1Z)~6(Uf<_ z^yEn_aT&A=y54FVBU(}JakkT<0^3X>UZo%gaT4iVQ9OH@{y72$pmHkJZnSv1(;nr> zXnNRBig41nR1YYjjv?bHtf8M3Q170nS>$Q*e8Y>TTz9Dpj>P0@`CTzRH*-9qkvgk@ zo$!^60Wc;FB4F8=+m9sb3*#5V5e&^@qy1qMEnV*a1$Q8KIUUlE6e|mlNiQ5ABndSn zpHCJeWVB4vCS4&>jS+%38Bm3<+BSBCt%kjXO8qK?NTrny2aW#zUdLyGhz50H1OW?0 zl~Rjg;v_awZ84Q-^d=;Eu_;!7R_I6f2^|toPkTxE)4jiz2rFCxN@eja&joxTD!l9B z63+<*j0sYU6{OVkp_B~kBI-E8EA<6DIVvWBjZqj_gj-1*8dP>r!4w|kI@Yr`oRX4O zLO~ZTv;@4COuMoqtyo6gcj%MP>qLBV39}Esp8w>`lCa@aTniKLKKyWq?;%RWrD{?% zjI;WQ_r0z~HdgQp;81i^_@QqaGk_k|`t_>IYDFe;nPCZ!GK?= zXlE{u&k5L`Cxkq0j%DqIbv5=tGS5yp&Nu>lHXxB~H5m$O_WQl6DmL8v)uq2bddt>} zs@QNOshZfhYIsQ#XK_*~j+l2wIfm6!S;t}?FLFF``7vXlnoW*ST&TvQ!iyW+jxeFT z-hM@g2;(EqX={g|6>8EavKon?tJQ={aGHQreQw5RN};h&v5bX7#FHuoSrd*dw{zps z)b#1Bp1&`ODk6|hUw^%T;dtXhTAU6pz7>KuUs@ZloK{|8yAI&0&DiYY)r=Du`Sg}@Z2hy7MroMQu^FBsr_@kgWuU#Fk?rllDerUxFm32V^wFE169Bp2TA!S$ULMPK6y4`vHpK~ujrdeE*j5}`n$hR91!C+-Kf!>H z1HOuSWBBom+YQ)$oE>;T&5?0&e~h5yV*8*VPo@AX;Sm5qA6(tZDFrnz?~TN#?`|nu zqTk0GXHjS|yq{Fn&I866vydI2)SbIKUMPi)Xsww4=M4kA2=T4rMtH;Ez**2&b=kx5uqob4i@jRxG_ZYsqoh6(qs@s`{a*sPcM_`Py%EOE8 z%FD_oFAIw?N-ny98i%yvzXL9If1{x~^q?toTxLBfpukIM40J?~iHtNRkGh5jiQ|8D z18w>v2wMZb3M-d1Jc*h>al^2CWuO^!#y-P|Pgd5i@(%P}q)X9iit7*tc;OhxTjT-H zJUkQ#@3To=<{97sBh_iK%WMLh%Ke%SxZao^yG`&EjT|aAzIDpOd;ep(jyXG^|7W0bxg^wzvUjWN^>< z5@`v`NaGVMyY)D(Z6z2E4vvEd3?-;t=BRUO!1RBDp@Ec*1{Al+kdJoMICXd#*#z>jjj}YQ&=7=v=K!EZz-6l$U2iYH6N6!8e0JRQzZ5Cn#z-hloCu%L0~02aioFA+#L z<_d&^W2Ol(LyRN{adLplTXv#}cia<>SsjLEIYjNWsD>!7{S2!|A zbH|A^rbWQ7Q3xE&Uc@?u`gn{$+DMeWBM?W#Cx047yk$}&aT(6T# zpiDEylNg8&#lug4@m}!-N|d{Qw$)6pHl%@SXdH1Ua$`I&+g+geItIAS0>JK@)${a+ z5V%-Q44}(sitj~wk1*$`O=m{H3%K{$12oGOa%t)5qfkf%F(|ZY3UNAQ@TMA5K#Iz$M5^r`rZ4-U6^mGpozfEeg8;>nam{j48{q-a7yg6lqr))fhc- z&f*U;^``{m^XcZe`vF{b1i&NgfBqrG?2Rp}A5S8B&7vQ%c9*mQT!btw$kYb2VM5H! zT(Z5_%QDE?3Jjx0#iKxR^zW&zqk=N1?g4O*USjQs>B3+(W&+cRlTe`Mhp?p0H>7ix z7`4}PR?U{*GXRRih37^Mv?_%_tD>csMD4kW4|SWSDuK*Bn7_i3oIKFs&?LxhHM@H1l}!h3{dzX6Fu48en@l{Fd$0ybETsL zDDfT!6}#$inIkF#!de*U!0O!g)S9X}8k(SWe%Bw19gMu9u=DCygkt2cTLMp>1X#|c z3WPXBuqmxd`CX0ucZw1y>d@pcmIXMGN%h#<^&%at0{o1DKi3kBJ2N!yWOE0&AL#Is zki)tF^km@|^H?J2VLERCm4M4;h{20D06DW3Yz4pq=hEpksC)M_F`u~(~z4-RN(!%js~u)BFQLHGC5I_|E*!E}@X0sjnSicJDFJ~Of8 zw}Dfko<1eu(Gg(~p6pR3D2e={U@vPXjaH{0EYba{kI1?OoY#@djXR8(1FG~SE+wjX zA|#T&0y2+VC>%Jh1OY=8^~(3R=d)^Jfd{xVk4H0v^(!RoW-HR6(MJ#O6$kKTVOn;7 zhA}W8;So|$6!tsKfLmb76kA|#030e8V#lNSkM;a)pBbc>l2PzGP@wgjJq&X8Czj~L ztHM12eT_N5t0pDNNg7S&4n|VrQ5zfiDu1&c&M_2-flzP)^yHOe0Dxu~COe4qOeaw{ zHrep}!urY~%ISvlq&ckp-s8#O_Z{_pkmaSmyI0!2adz@5ZM`>68T+$H2m2K(-M~ zQT8xrIygLrUMb}%(%^Bk7MT1iCcU3AFja8Y_L2D2?cOhyYI9rx@R8jRZ+@xJxf+C% z=ADdpjP&$D0GyjknUejgXQqQ58ymX^JTnruhB@6os-dm`Ai5Zvc5WUB>{-|X8kfCT z9AklXjXDU=f<~oph(zJxq6#~s8 zxIcw{GP%e-=sXmh**k7r^jhAq=?6Vxv?^qjQQQ^P37!rzMMPl<0I$M18kmY>NTj^T z_@Y%QN~wI~o;&FbY$0G%#-Hv!qbqIs=_CM}jlxGXKROqtfCmi-dsBYEP(?Rk%_)u2H z+Vo-#nn1JRHCq|QICE}y09*Y$M6)2=knj*lD>@^KyEzqO!JAwl7O;=S zLg+vJ)dpk`%aGyVhgv2*BEcibp8GXdErA(cMZ($H4}eo9B=O?N13@P|bwa?}Z|Ze| z@zcIo(qZ-s71lwi{!Zh_*2#(eilXcxJQDTGQ+EA^2uR_>^!|t2q>>u|$R~i6%GY%coBaVDUyj)$y14ugt>-GK2=c8^gmlp6oVkW0iFtg~b$`#{E@3n247z9EwkrU)g|QOdEZ1|Gvp_+3@X>6wrS03cZUUt$IVW_0c^q zME)6|0{}a@SzJ~Yhmct%vj%dje8z5?RBMna71;Xbd0JiK+azZL7e>DBlG-G$3<;`%prZYzhL(tCutV^;Z>8DpxWDBP2D<3`KCY@IDXWes5HZ)+NpsdC#RAsa8{pIw zKdzx&*{p9m*k8aOjsecW)`UIT1i_&<)B7SBjA&INT|<)U5RJdIDGp?7HF*pok97^j zvp0$ruL5d5Bp(6pcrt>FJ1@rroUZ^fER9A)_=Vdnl7O`%BoHJ2c#t78PG6rUh6yXT zUZSo40}|ShQg1ee*#xq!OEAtO`W1ft=~TXs`@5D18q8rD)_(M(k8gq*b7X-7$$u6A zMHslIDNlplJS~zf4FP=$a?X~R9CQ-(z7n}u3BV#&f14G7SFK_1k7FVIp(a2xx|j?I z#@sqlNM%bO`?-YJ8?TCZ0jgy1JiW|`Uujh&B68c5xF-;S7PVWbGOiO4fPm=$ah3in zy-oX+zw=D_nL@Za;u0U4tal0V`qB!f1`Bryrr)#N8&WsOTXuV^P=0;K8`N45gfklJ@ z9bQ5w2uGr5c)SPS93lxeiDFx=rpSy zkPQXLpWKmDe(hRXGsCGMoJZJ0hQ|RW+&U}=ir+JYnds@Io8??rlY{!fiX&(I{^X+u zayDL9OE%y@dEWfgu_mJcTrK3#_MeH2VFp&6Bt1BY6l9@OkE$Mus|27#W3V2Tg{WYA zPG0ZRgb>i~nx$gG4rmOrEl1M^XF5^QF9-wmIe$p1?tG#WmT&VquW1R%`My>^3U$8{ zdVlL-`Wle=1ggt1N*QlYip270j)PMJZCA{2>aw;B%CYHzNw>wXtG0OuJ3Ga$N4{Bj_qS*L&I{wsPIM~*_kS84nHVKoE zBZb8cAj`|fg~99ju#fn$w56XZIW6P>p}2f3rDBeVbzvycqtl0vOx*;wUXi1y8%V%} z0LvR}oYe4pW(bZIzvfMVpqHoV1ej1e9I(qZMa0#|{@0!;9@87Zsj1-yT5$67YomsB zHos)_ufpzfPlxUhI1Ws~@cm(AW&H*?N-&~I z=>PpNRnwp4cUujQtBAm&AX)1g`T6(HehiJKuTQ9sPG>Ha**Ni zGV>gHCHPnOAB?+em>ubOzCxnSEVS(^DJ#nZiCn5cFWa^p{I63eot%p4F$oDlgQQ%* z&?fW60n>^1Uy=8js~ryrMEb#1IB`%Kz{?3!Rh2z|yk|=J)!o4cd(!Re8=74-9;rzm zHZCqzDv$zdtI+`N@?jqv#jliqO(T5Cyju4kf|`(qf)4Zz`1AjAC&UHM{eQnwf=>0I zjembq1i+m5->-O_|J^F;+P-Hg=6^mxpM>#WZ^X&D)j=BY!-DM2M?b*&&Z#I|<$j>$ zNdd;9QxIw{X&-t)|J&GP&l>Ol?`!_2FW@k<{{LtJvR>Rz0-OBQ6kc1cjbHJJ@v6GI zf|?6=#;Qi{6^tzG1ui?`sIIK&zo#A+l@(>3hRJ(Qbu5R4HT%rR*JKcrQfJo$X;j5; zxjEg7RX_(0?2RW-5csUB+xl@E$69*LenBObZ;fc7j6=A}2>}PaBh+Ph3(acUAI-{O z<@Hp-r0i8g*DggY@5|q>C-B%_mM?7;ySx~gyjw1FG$sd|y@V_Ik7UKaK0EWcE{p56 zc>D5hH5RKkaD8W^xt9W8hFV7Pldb1_XCrWdSme;PZuXKbK@L)~v>oNc& zQMexCK|WJ>BToo?q0J7{{a`-QL9e0v^NLJcUmhOx;CP6jM+1X{S(^<~Z_kE!TO@^%wKlzQk4Q*azb?Pux@HQ9Ij-YxfqeRUXkY3O2@NWKzi)F4h+$l-s-K zJk@8mVNllD-~98oqns&o!Lk2kQ=eD%tEc%1o9Yfe@N|l}!(M zZ{3-viS}j-|8TJzE58Q{GdLGC2{^mJq(deiDGw$U$)en99;OUd_u?6^UYXL9O1FOc z?dtyY6yAh7LL9%a5=FsOu>NF={ocrwu&6p}{F1~)N#7!0|4*m<;j^tRV)%m*{bpbI z_0IHQ=nIOY`Heog6mrB>auv-fJ`u%1H?Ve^Je0-|1PFx}CCPU!@Gajl!kx zS3jnIuU1gBiUj1me^GCu5>^DUe^+2B=;%1>@s!m(q1>SwySN}(&A(H z!u0;ZF|*ZT-#K#r+0WyWQqw~()sBpE!yk=m6`|!9A~qjdns*y;wMiz|nQocFN7c*w zrP1qWi1y^QE!HFqRW7R%Y7gH03oDTrAg0iVpxe4O9R5VvrxuBtctf;!&u8QOc%(hA zdHWok?yL-IRWKhoKAFv8o3G$*v=;vz=DESBalKe&nqH)S?L-deP+}&C-|DUNKEzBB z%p+4WYE777r;uUm>Mrg*?tS`8#rd;Q#{6t^0UJ-8cxq&>=3=;ehk>*$>FV;@f@5RW z>ya+&1#*KwV$a;fE*lr~TUgN@r@Pi1(HdE^+ZVVSL`CX&9G01x8-~x~>z>&o@Y>=l z+oL|15eaY)S9c3L=US-qpy$Q17h}_-`8e@8Io$dW{s9iIgPw`;fq+G?gJ(w_TF_kO zh(Y~JBbMdHbS>7Yqe(NkcNJY^pY@+^SB`{VEkCXv4M;q)6^wXifx0-nSUWb(VGL(_eWI7V~Y*%V4?K9_D-qq4PZeQHXOPL#QQ|rD5 z5AjylP+=#FV`-P=@UYq6@9FDt<|Q8*j^-^9>)50ew4u2lA}naH<+FPgb(h(RGfa1NTGS292kcko$>J1 zwQt=3xBd&w&o*rdpAF4!eZA6dd|NN>bG|*rFTSP>i>OQQ4-;2?N+M~sGp-<+J;)m7 z5+fCO=*o0C5TTpbw|b9HOIN9}+``G-d2!1atC{+vIksz-j%YU)yo{UW30n{SH6cW zgP!fe0fe4%;|*`48Rc829$vp2sc)N2B2vw>=vGT%G1D|6blt4oDd>ClTtd;TM7Dl5 z^X#|M%eF`?Ml6emkklmWE)3sSjU{|y z)K8|V6>KXUKQ-pd|CX=xX1FWS1(D!1d2VLhIUO5s1{+| zq9mVOeBTfpK`B(JJhree{IqjF9v2BLBe=Xx4y885%DhUn(?&l5d4d`4xIA4Qu=OUeXy*Q?Lx zTq+oo2{{u#2p^HFnhE_IA--5BUpk#ya+M#SUt)BzQ^{>lWWSo&MXlrIZ6sS&KA8*^8@*`l{I}Pd95c}d z7_*Rg(MleQInzjCPZIiKJtPor8?jgY?&)UAK#b9&*k4m-$*gRV`Al0~&YCF_=Y^~_ zmZe(wGB-uLp=r22!9RVrvBPY1bHkG>^DSCW?~Ai)9=lChay~m+d%H(cs?qpUjjmW% zC&M_Wzj7;%j+{CsZBCP-G2&8F#rH9oE)euM-wD)DqC}U?{UIAnE9>~whf5{>N(MLg zq&iboLxV_4@`6qvEy%q&3GX+(?YOzkq#b7YTur8fep^I^ot)d*qT{A_Uu28qpYF$Q z=k{;)U%tJSrS}|kc2BX5qc$aqY|2S*eK|`-xmU=BPER1$&2DdbZ{A|N9o=hJ;9h(E z_Y6BKQ1uUPd08RD`vDTh7m7{C-H{LF6896H1i4Wv*3vpB$Xo_*#j1sCX=$%q94^d> z5X-NXPbCNUzo|DHf3qh#==^RO4LdTyvVc(YuAs2~^bWn^z$|I@--B48#`P6yp50dy za=7VjF0I%XXLRp6X}!o>#;ZTh_xZQy?G6HG;o?`2ms|JkyTX_#BI@elhR5aa#?vfX z7+(l?-h~2LZK>my32Bi2Skt(&FIM$fRKD|6f%i*2Qod*x?se~>V7Z~Q@wodD_J#W4 z6gcIvzw{k)-p$4i?`li(x2(o=PchAOrY&K&)j!#ekfpd{^43NVW#;yC-(Q@ zREEKO zs{&JdAzj}KAkU38@Y5C(T&x=72?{!^SkjxcnJU43mRpHMAKdX*pA?$&1=Y~$02zl~ zZ@gHzt$k%2K52XNd`Pb9P|102)6>-%jV>pKZ{(5UlWmT|z;CpA!j=N(M;;D1r?o+R zJI`$C;=!^kWA5Of$#?3@=zgh`sS!n3Q%`6X(SX|!v8mgecL%yl(&&Co>W;x!Z!XA zy>2g(|GP3>GSzNPNI&C+?9sH$KY6H7Z|VQ!p@C|i%Rpah+eUx=C#x81R#i?p=4L=} zEqiL;KYY`3rWptKR~-;-!uKtEG!s8N@S_T;s^*hZXjgn@U)G#1?Apy?DI+r$u_q~C zsx;D~JJf+EU%f~@nB*29oUx_N@B4h%KFMUCX(2o8yDmyGYc!Jd;F;}KThxG zpAr6L9Qys~#W-?I3JpR4YP>?61ZgK0@~8Z}6TT44Ih87Av5$OydI2-!R`uZxGx+o5+D9byRhXwW z$NzEx-fXAuc!R9rWy|HAERPOB{KdIoZ+F`f%(`;#P6o<4#h*GTgC-1d?wV&ZX)BW$O2?1$@Q@B5k}k=&2@!k?KaCdd(OwjeD$gx5$` z6zlw)_P235Q}`~M)upzNPdCBnqDUVdTa3ELSXAXD8E>xZDrN22#5m!fQna-bQbS(J z2xlMq4L96M@H*OXA7xdokjiG_Zp!^Y4tEV4jLSvU7-anXK{pLSQ;|2?dV-3lrf zfnoS&98^q#M(=|ey68hywn=*Pu%C**;)tI+k8qT$y|pQspjBz^V1cK$#i18=>FCC7 zEWg%><8=)s!BI=5Sn+YKbv5^5ay=)OT4q8f`j|WR1YS};WSCGw^V){+!cJAifZoP# zgt>4aeS@ws0lr4}7Sj*4&?U<|kARt6GMZbyQ2ioJe2r+DEMHByv6;H?uajo)cC<~G z$yAQpYnx)aG##nXLU@Z;5YHX90xa4WW>tYoml#(Ky&DS0YwnV+p z8pA1a|1{9LdWPT8O(s|si|Y+YFXPMDYxWuqWfgzX*t95;cM)@L`rFFbGGBevzFYag zayxO@JB^7|W6Qo?XS%F>(24+FWbN0!8sT&x6h%BQ{tLacFO6Wl)fNd1?YJn#Jq=9M zW7R6}7vJ58gfD63)xLj;-G!kTU6>Hy z-qWvclfpqpad!JB&F1+>FJ|#)z~kV<PBALwgxa9?($0q#?C_HWxM$Dx?K|u`jgC%t@1S!m) zX-Iwg)SQMIKRfCFJN$v;75=4iK&4yXS}wM z5N)4x{dz@tBPef=kql~d0h34qCX@_TnlXS;`YXCT5ZzpJni~{5A)=;!z)b``LL)9l zB?11Xq!kf~Cdel8!Uu|9V@w3_qi96%zs1oju}?viN{LNOWOxC7Dk^{oT^qKG2&K1N zLLcnHX9V?F{(a$X{JUf5d%uThVNhqGuO0#5&GnyeY5KsV`_H#9F5G|p16q_PO~U_v zhHm@$(?jqbI+q6-7&)4W5JC?x=zpeT~zPUu9^p*;o}R6f4-&>)xDMllCLs>(1)Dl zG_aWhv@ZG*?>(xYvfuCc!=;wlUm~PN9*@&qhM3&Wc2%#w``$@F0*^hweM3b|hJMx5 z)L6|`nTjP6GJBdeQM8i)xR(RUrUSCH!tm#SJL45T{)(ibufLe>B2M>GAl?;Fn_ipI zGP_Xrz@h7UD8tb0B{z^lu_rQ2Z9zBa1wFF#zrg3@AH6wUs;#c1gp=-lF@IKSd>d8( z$PAEKGp65~lvh*~0_Wzo23j69rdcE-!}UZ&KsHQn-9&c*``Jxq3g0)smX$zH6E2ZG z&mBNH1Fvvs5tF0v5Bj9MEIyP;QEVO&KXw02=6+b+6JmUWGQuO#3$eZPU z015?%3@%wgTN49OgZpe$pjEsE@cLvCR?XW%S)@(yzreRz1vn}!Id$Wl9T?xI_*@Pf zPgM6)l{SWa4FH(@*zsDoHPCoM(lJ8|XXYS90MeV^bCE}0VGv~>=SF(p&uOH__dr~! z(W}Ck5MnQInXiw)3m5pgrUvc>GRL;eR*Y~MK<)Y?=)Ezd(1bfhcA9*~q-6=S^MV$z9wBJZY3wTc z!cZ!Cyg_OTJmj0B&+kWMJ$WxPML^?-UzzX(#=Zghv*P{V{ugH?g&)lZoZ>W$Zq2yO z$GGMa&wwt~g(;LITne?+)Yw>yAXSDR1vG7j0(xE-064BtBi~#1CLtX?J^8kGe-grI zSOP;r9_m(!zi{1FTmXJLIDm(6bbikqgpJm_R!2WLIB3YKde%kXL+$f7`wU_G`ts`s zq<`I7@Bx~hI(BktMROP^Iq>r2tw1! zGe&7WxJC{YxC`V}pl3_OXVHE9qsAiq?0lV={(@3bL19w=`51!HyF=b4_!$_WKqXEB z->}C46v64=K`sQ83BepnA-NCoU-A^#o4`MS8TXT;cc58S4A6DG4K-7$}Pf~%k6 z2{F1Bx+gJ$BpS$fsW@ZWu%%%CtB&17Z3N0e043DD&8$h|;vPtUjFDdlB)sG03mKBv znLTo`^r|*C{~eLX2q0im@$m4-#&&^WNq}6OAl;b;s^BjZK(c`e5s0UZxyqmL+yQKPfvg4N=kK@>jX zwFguq$;8&{mBTX)znqNluhempZV@rs&3qH7q-mY+@a;I$wV-nb^U4jV)Fz=iJn@nj zO6I-Ppiy+0tcU(del3Ej?}RTmV<-4SMoyuM7mZ7AQoo6zn+1o3VKxcf02)~qg^OU- z2Qq(+ZofWyW_^cA8vvA&a=+cQ2=4!M+zv%3Mn{_`$bhH zQ&*Dw4o8gQdnD&%gN*CZB{wH#UJGiu6w{mr6ZZkhk^-2J6i(2aF@^+&w8X@<9K7vm zU{RF-H`s>^F6VsUT+I%qiYb-_(n|@DTIUr$NiTp%&l3DIAOt;s9O;v8 zYs?p~a~o@~A&$zqsknHk)X^RkYyBP~hCL4P_=4r?z@>%$;^tU_oY#g3st_=t7_R;j z_I1vVZ-2Hj^Bc++r#11mUTbb8C8dd*&&F@6Iv$6xdr)jxHG!KyCg-CD`4M#*1ckto zcyDj--z!Zs^dXiwM8^ksKk2o<7X)d@5dcz=1)fl8JhdBBgp&nIAUC2F@ThUovVyxR zPh&oRrn%<5{^q|MaBC>&J~WZ9P+U+Ty*&$T(~1nXwn-5w#^d^*DMv#41vgY3E@XT( zv^Y=T-LVTL$|0fQj)6S)J&;aO0D{B;8#%hVN7BY!XEeF4@UT&wl&_zGl6QaOPeiW@uAQ(d8QUPKhI?eQ?x?$zDn245P%;KMv!+PN|6**n8_idM%%j0lTjs#3okO*Mi>5mczn0jq21S=M(*couehKik0 zzWZ726;4P1`KVZnj|{M6#fM?MKQzpDHCX8?%XtU&f$Tue+(qX3QKnu*kn8noSka&A!rK7d_MeoTl#66jY7 z*g)>$UJq4?4|MWm;rXkaf|Yp^#BOH71sQd!FF`@5*6ahA>mVB&YUxP*j)#*nN49_Cl#gmfzMHt_15>bC0W_1Ni-7LBN8VU3qaQ$7F!n^vKwogIu_-Vhexiz%Twz((`f5Ops`v_$93C))*_&V*GUm_ zcHq;(EiEZAM|5QTNJHeLEO5aRL7)FwPDv>rtN;WBc{GdyGPJ4Gkhfc60@?l5Y{zC8 z5qxvHRAMQ8$_vA_5&l@r>AKDSUs-zi*1u0zbd~6nq z`bXBCe+A_Cro+9?<+B67;Pbpa5pSm15`w=y-*Wqz_3Y}b@Xotne4Av)A@42e%iO>? zBe#zeJ6C6W`2#|cd{Yg7Z1^Vjb$`4_^R{>%x!MjlLpZE@TSZ0LCH5#$F*nc1d#^6L zQ1!mO&FZELXSbHd1rO%N1!_^$dh8b$N@j|9OM=y}2M7lOr){S7S@A5AMqW1r;ZeUo z{;-_mh6zL7YcUqA;7X=$XSoNEaxe| z#Bz&da!%1V)^A(+IW+w0i_%?5`m}aJa->>w%u)$Wx|d09n#zyJOj2;p5iF z!$cVa9QqB4j;f+WP9Qz+1ZaRmp_(30b(yIt4KA?rx-{DYd4Gn?;pO6~KP`zonEW)Q z=2HkvcD?c$u&YykPhAYKpWNjXNILK*OB5a>E5z0tO)aJrTk_QosBCg=CU`jz#cyMp z?iB^CY-&j3Gc0WvXJ0_NRN*lSxPUc5_Q#cB4!B-=D5uJe2w@cqdlZtyqVeZqIS zXW#1^U(fDT4Oe$B@8gQ)#I21D+1lB?o-G<2n`_3qJ6M(CKc7{N^INKB4u%K<#Eb z8~U7dMwieZt}#CmHer&((e1?9uEqBHHyZ@Na}CMjO!3&TuH%i>7CChl#RRUF@8E^3 z##YQ-ynDTd{!V`%zvvQ@;UiDOls|&71^?v~rVxjcl9C?aYqGVdVB!Cm&vCh|QI-Z( zB~IM=XLWzr!h&9#)Sd=dX`dWif(*DlHp~z;uwzsBX9NQI$wY0mV&3n(xYva;&ePv0 zm%8>=C1YgNKmTsQr=zmhHl<;hP?@Y!k{OXEuDYRDWKBRU)wKT>HDFkA`X_U%QQW3Q zQ`FWcE|!-XI#Y-x3ND6=+*r)!o>KGDvkhfk@=fIhH3mdUHJf3o&brYCbQ`~Z4|#e{ zF050KftnNxBzBZ~6B>q_szyPK@YyfzwYnuz?%uIg(;8vxh_M4apE((KSe%mgT=dPu z;ok}8N~C-eI!nKGosw6&>Xpj#{MP&2}K0p|RK7!MS*bk7} zp92bby3khp+} zpcg6>T~Wz+tYWk;C03y4kgc13qfPX>g?`0iA=D;p+MdkwXs|($qr0sQsJ9ai!$8l7fYJgl2!WC7%dodewXMC!*?>vtNFWj=81B&sYlrsgIsV z4S5u*qTuXvYBgh?3~%`7VgW;9q$SZHeXvdFN_rD z@y?g!)aaC_J}%Umn$nk4Qi^2cuv^ZU@w49~qz*HU?JZ-JqjJ|GTFqG(kIrYZNG=-y z2hET4q}OFLIyRDRY@*NJpI98s{;f~%(laimDjiT$v%o(m30Dcj)08UdvYen`Ee+F@ z;+@@dBC9(3P^ly(G8~_8s8Ij%(J9!eHh^U{Fs-Xg+!;U=VL<8?4o>@eJiMLlRBn_Y zPmZvk!ZpGJ*u9*S|VnI2kQoqu@@vOCl_5ha|3_f8%Dei zYW7gFujD^$`1?@G!6&rJLs+duD#`#ujeaC-Le=mUzGi+?#jWmTttRncXx$F8lIiP& zo6+LWWUj-{hwKRG1XIkS4Ox*=1a2>%6L*K*e0#lUmm{iQKNzq4St+NvM0zSAwUr2| zPp!aVc%Tx!1h;(h={KpSk%d7T%x_1oyqY9MVY*t;iRzn|`O9Z}*w-CzwDT&xf=c~tLT z2~;3@6{tR3n>Ir+?|SDwl^YF?Y{|b+zBhhVZ&-eG^{&iCi>QbL53@97LGzD^IrFGi zz%`Mkm2hi`sJS>7@*zwlh{hcF{d|nWV7}ev@5p}S@I~wj-(^4a?_aAC4dkw9F#O4& z&fr1Cq<$Q`=};WgMDQQ522JV{;XPptqhSimQsf548$NpVHt~vFJ(rfCV3TAs*uYxI zM-&tkM5PZ{(bhJp{ASS@$WXwte3`}bNhZv@KlqICzS;-Z@ZFw;+aYn{`1w4w8qmX% zMLc1YyJW8ZtB7Jn&58p^GENatv5(iVn?J8US|?(Q0g&cNGt2g zDxJs2C2rXjgIt`F2W;~ig$=5c-%tO1jqYX|XM+h_!G~TvVBvlLONt3$r0G_#S+S`h z(U32Bc`sdzOd2UtKsP$enZJB7YwG8y?O-lRok?k=T|>XMY>wrvcOxd{8{c1J<}Ro1 zetb6ECm2)OTFnp6T^tln+k+gM(tPKT8YNg}1)@{d#)&MKYGPQ=&)w{YsPx)ANa%3V z_v%aUn;+nc7f6ynm%MOFvDuX(ByE*!QFF|W|1I5+-3e3ajG%N&0ystnmDld$WbPwi zegohwzHz~wwA@A=8fnNF#bW))VaY#vKuYAf*h_i&9LRnNkW0m2|Jk?N-p|4Cw_A)G zI=DfWN1=oaLw$@7lr&*R`W;>J8G@A{6Y&zgM_gLy;WwI}eXxx4#D6o~32 zRE=3*@LbbJ6X;t>+0!{aa>t4CJN#NBgwbr=!#}>gB zrFdHwjy!5?%K3OzE`e2c_I^dA&MdL9hJW)4MZ;lY|I5lge@#(t@4VLdbv)bCEG64n zwI%10oL19u%!TnXmFtX=y7Go6(VPKRxwvu5Z}c34h3!dt#D1}V(O~{qFhQ;-=!l4; z^kRDBTGV}|!cgKKK7CX*mS>?~++6m#uJolVdy>o|UKUXuK>D)`odkY^S~yx2-yn-d z7q}0w!)v&WX^ ztqZTr>{rD8oVEFhSj%Vih3#1FrXPe7ppBpP9t@~uaJ&`dqWj>LCZc%PX1cVvne7mB zyT}Ib^*23Bj$5z3{k&98f9E8dTJ+YoDPm)pB|0d*5VQS#UwYk}L|2zzStAOC6Gi>s z#HO?9|}`Ijy?y9Fgz)#&64v}auT;;Q&v|RL+aG#-> zjNnP^cE625stZUacuvB3+s5gnuR1$+?Wl#9nqlOr+Wf=pI(u}Z^}~L9fHc|{K8#SD zI+JIZgZh-P?g=@eq-ouN^Jn3OW&kg)47cwf&+Fkl#e zMq-tPOyW5&u>OOX!x{6DFO!ASRE2B9;*`#XHlQi8nX;*9O3g%+gyYo%F}W` z(>EutKdoOvobDtYUFDB6CDTz(>_y*)iQp|Ngb8Iq%RqlqH$Rp#_U~JuDY3| zNXwv(^Hp6XJHdYRPf;zGy1A{YEDpWpY6iLK#J=WwvYZ&!mD!oB(=Y68iBUfRvASrE zvUsTq^z^3uqgcI>(SZif3P120_MkL1M>6xNiRY%P-bf7~jO&yamvS^A4eI>(U{<4; zL$gB3IPf`|jtWkUWt-KE7B^Tj6qo!96I&y}_Va8@mvPAh*n3zn9`Xp#i9D7DIy?db z0&^plmZhN&FU$Uy3sBK03;XgHSp01U0D4EwQPph?SSOH>k&$_YBZ#U%Mt5ewK5D%n z)qwzDYdMg=W}lpP*rTh)2!ye`dq<))iRxpRwQW#$`jgaIztMq8UCcw-yhVJcJDYL1c2J!V9NIka#@)Tnk z*}vJ-%Y;_Vm(-mRlyn*A<@;FGQ`*Is8@;OVm9G62F>lkxEc~01+*LBUNisZds0npA zV4wP~GE$T1b@PEKPmy<4mM*S5%>QweFCNSX9G@Atwzi^kuqOaVvvN_K^8g#JDDF}Qje|{oN?O08vhPf-|eSI0iQ*7dB7bjvoIA{}x zch|zEdPDw5Q~#^vmWOdaN=d-mkL1Oj(Tc^PtlCJtI^|Q6a#IY#BMKLN_6khBoWbzl zELK}TJEy*WcoTQ3PUtP06{kDA0%|MU=%sw;Q&EN{9I zULYL=#b`tbnER9g>4-FBM{>CV3(-&pH7LkN;J}xU~r8u6VuDp^1!jygkA)y4M$TcStgmuN|nJEtA@|C}mqTtIT$oUcQOw6|{_qWvLI@SJVTBXZo zLA)(m99eOyzo&g?zURe#IjQp^bpc%Sdn9$WRViKFrs&UO#J#zlnEL3 z7s#aiSV_VS=x%^Oeity7xlOJ+`)mX-v2M9K&zLW+JIZZR7+8PrEHV`?z9Z6TnYgN7 zNNvXV3=PQ(0k6R=W?HoJPFYLB|Kk&k?}77{}gwvKJ*3ClUKEG&u;o52`5 z_&Lh;W8k8l2|#$N5b7Wir(gqm41!M^fSd`P{;*HtYmF3tu^wgSotN^D z7l|+MVhvKW4eo*yH70nkoq-G?#nd~12Ty=T zAeyt{p-bMY3mHhsx(D{W!7pfGG_U>49wL?LH!3S_=?Z#H_@80fpzZ;h#9h5Bu4ghV-X5jhA`W4{i-)wRC zW`i<53M-)>u}JsXaAA-0>*_SxcSTL&XVwgY(!NJ7V#3Cpp$#ll&Y0!JI*kMzq=(m*w;f=O{D_tD04S_(}xyN;Y_Ja4N~cshy@y z;P(@klr+GrMgb%$-j~;VO|<}t{-F~&2;m{fSr4W0A>!06 z#uqS7dw~8O)2Dz5q4;ojfLH-1j|B7k!l^0(L;%xiJU@05Fu_lISvw-u&&S-SIZDTB`g2eC;bP+_ zs7U#2dzx=jzz}ebBDF3AX-k+y-RMDt+Qv?uC{rE2zJiypjA>yxWVk5bJE`U}FB%pd zCiT-oRsoO|my#lHJ5%-#vT<~V!Kf$%T>|ChU)g&k*hYSnkfc$jn^MT)zd+GIYIM-h)M3@j3V-P-iYM`?`CLfdF zL0Rn?37Q{!KmgzIzV`d~t;;!*L}d?M7UvJ&v`Hbr{+gcePm3J}PfNf=En(E%=&!)? z$K$dodv#vv%XV7^3!(eVCMffCi}RSq1M*fP=dr?r1h_6zh<-YO@r+S66r-)cVPJye z3)|Vzl77l;VP2kFj0Ozmi+nB4K=9S}54!&fCUA;Uq96AL%>Oym9ZN7@PpM$`uU5Z) zh|9=e*CqoHrOwBA@jIuePNyx9a4@Ei3={qQf0#PUu&CZ}>my2vfKt*3BHi5$(hbtx zCEWFhUQ9D)P=aU`K1w)KIu!UbRB`DVSC0Me77fSB1iVp(O@8MVK)-In{B9 zJn^3V^Le0(ML;7;U`T}?3p$j_6NpeBc&Ip9ipO-s{e>WHCr!{NI%|P^@yI+VS~QV? zd5Gvc(C&TL$xreMhJ=?BIH*7oCeUIk5oAJfgjTS(u`^`78)BOB3EQ}K>C@V#I5Svg28K4IL-uA@@M$;4Ep>hgT zrq_1gN(5ul_%|*KMa9@3y%d!qx!VCI&bp@P~sBx+yqCBdBjTXl(ztq(O#ht_H>#+`uMCW&(8{EqGsG zJH;rb9tsn|(1H1?2pWBs1zPE8z(xZk86SY5ySW+=CO7yrL4+GX`V9evhnE1d0Uu46 zZblh*U_cJ0$uVed0eBV#UBRLh>dyR8^)+nFE)*1lX$M~%^bNzy$A^CjSkIrm5`g(G zXJbQ`=`^N=fMW%%OI#TH>j6`kKo&9-HbzSz$4|~d<-oE zgX@Zj4|QGNpR0j@b9n`BaL|7!CIdJLTwwT}Y+AsW{`|))%&svY6;0m()^Y0pb2~nO z+ri@2eFFT4rnFFCI*}=Za<{-+mv0o!hh6p$|NIPoG6MKhp?L#K7-Lqve}Bw6XjcpF zC!sq)=k!#wETn(%C=5OL#n;f*G}O%->cs}GK8ZEd0qP!fMZsE7<(U8!ONDU*E2ap> z^kG)(Sw_Kao>oV}g;DR@RW7 z?L%8Tg&q~p(wBo(Y!>L2ub z=`|Tiqt?YEa)3P$P4;WRvr`C=^~e`!yu_ZImu=y8H+H zYzBKcwm?UcOZT7MQl*wX_cS(p-fr^CT$-#WB|H0hgxfDI`d_wz!hihf@mk=CC(rx& zhI!7bQHFw3d!&SfIAKX7$*_q`LHiBJ_&WJZ3(*Nxj{M|)%GT~p6C_V!O9gB=JTJ_LL$9qY8fN&)Z3?eepSj-}7@VZLGS z=6^Fp%}27*o=AQ#0En>7SIO0l@Ro# z)bZoCR@Rt{;8{j`JI|Rh-=n6=WiOOk9Hsd0ySbfMmX!|Pz9-8k`OLj z=l1uuQcA5QIe10Oy~grbv9>;znDQ?^ff8k`s$tej4fqa&7Z_D!pN2b&wI`Xadc(e} zV)wc9^|1ttSE4%tDuHSRaFxfd0vAv9%AY<_HoG3vgN^Zy?_Hj^w|*JA#)$p9KQL4Nw&o?WGg13`b-`Ln}se6LIw_77BUAtrs<}mm5 zx32AF0)YVA;nA2cYF?_6bQP`l4WS<>*`}tO9%Kj(FUgQU(+_8Nm&p>;)f&%J&I>;8 zZ`jcxxgne?u5)a}M<8^J;FhUtHY^_3cvvyJ^CVopdFUvVS9W}@dGPeO2Efa;@?u2m zv!E-Rx%Twzhv#(3UrdzNlqad`x?@j)D10)ZaIu73kHadRWPd9m^?K{BZm!{CkLMt9 z1)lp|cN-g%4PqoO-L#qB=RS|y;xG88zmpCR!(R)bJt_*>wKokL8S%=dXcbsLF4uLB z7u<>|b2zJZ%^mSqNdgXOdb5}AL)RoFdPVnqpZoMJn_RYR5fD~(hL2;n`TMd|Kg&_zd0*l_Ro@(=9VS!h zFSrePyUCazJ*l_YBSofl_%VCbYwuXsJvDImhC-%TO}x&@t%7@1et?MvBZEU*Sa|o< z3%rg+(Gd$hsp$7r$5+^bp6g$ei)Y;B*{t&eF*Ya*)ft*u$tCB<<+b)L zelH0g)2E8rPh^W>N2JMZ^@5yo$L!|jE}4BA zew_MMt--Lz;jyjm^OhBMMJ<&Ij=NM)GkTEuFp^eO>%T8iyR#HXPh4&>dj6tQsB9<7 z)h7LNB8p^mE61h`r*x<3Ldk@f-v`e|ZRER)i(VQ-x1Kys0p&t3Lv9esmfh_4qz}|9 zkdJzlg*L$>D0yucUAU1`wszS_$}M*t*;nePlTTEQKIp|yo|kOH5R3K2!df6MK0JD& zh9+%1kmPWc5F6HeA1>@x?aO`)TBOCBvrNkMsm&<}`GDq98u@roh~iOub<@pi^J1{o zkG(>dlfxeA(7t#l3oBWaWou78_MOFx$hWz-+>$Hb0+5Ei@bE4C9Y$Vg$X~W+ z*XuL2)!veC)r7Vqi)p!hV+axmow^pitlDCE#cIE1>8d9;nzKK!Kv{V64x6Q|_H$m@ z5=If-^eth3=<)f>gkvR-ag*fB!gg;Z^ZT#U^PERH^MvWUH{FXIkckeC%A(L}wD;q2 zvd%(v&gQ*0Gug?HCP+@vWey`sx8)uTlqSC-A>CFD7Rb7c=OHjQVtzZX{jzU-IR7kv zHyCBtY;($`J@`3&Tzc4f-K2Ef#9%|#!VZxd^NKO!s~Um)spHYUzK6S}E!=4uEim^s z{iQws_TyWD-#Kl}aJKjehx4^b*bJ*pqbk%(^@_K7=P5CH32kov9zMNU(^J=ZH)qF} z=Mwz~^~R1OzK_SAQ8iUAI5wZ!RO%;HrH6==g7jtJY%g@HUr-ko7CLav8(MTA#Y|i5 zn+zp?pp%{PP}ESPWM;)c-*KT}D{Lz5|EN(1s^nrq^@>XjH3}yK-eUYu+2o~L%a?g1 z@c}H?8 zWYOLkqH%4I%3(K9j>@CGY=o`xsIXS;)+AiqCS>cLqZ@J=a>vzOfXx~-P1@Q{D0Y#) z#Dbf6AGt7WS%TgqewopoIGtBi#9z#8qbinmBON=Bli+<;dxb<%1KB13AgAGUsjAO4 zlJnE`@5i5)Pd^@h=si`b6;KW-4boI>qaNSuanU_v`Jk3G{mFNV;J$KSLV9YVe6gmdT;9a82pv*KDJ^7v%tDAJ;JZqFWG_RBQdRB^So_A=!D`9Gdt=OtTrrNl} z<{yBfyJftE6`I#dd-z1F*x${nAtv^{Ih(0Lbm~7)=Lx5Mn-g16SN~0F&-MeSijk$h zVRr&+vn9q)>%~Szmr9`IsBb~33RbKMR{sai;F_q16Fkz3;L7aNt!W1(W5o|r9}dMi(lXGnuKg=-dQ%c~?f`>4^gcZ@23f8r@+D)BWUbbP|6io1W`1Tl0q96p2=D|Y z6F&L}f2;ZF0R>rT9FeIQcCaZ~mBpva= zhFjSweKA{fAul{9w%D7hvc~|hjrCwh(uB5W(fHR2_B69-$S+Zzwu`*-e}s<1bdD>$ z$=ivi0tmRoWfNMRgTV4e*e1H_(VE z;NpRNLqwccueUSIj_>DdWrIubM{-$|iImT2zn}iWKQ-8-6_?%2t$DxZzkET4Q#nO< zT08!WNU6+)IN{OoY;W?Y-umtnLH{pEWI^CT+OGOBzeqeoHp8)B*cMC4=wo(&wQYUx zxzweAv=HV&U>XkHb*qlboxMF$P+1*iceka&@o|fNB#mla?@&3Xs;Nf zbN0W$6F}y}CfjP|n-4|`H#{#?P4E_bbw+Lbb$jRPo+CsN938P(Z0rif$Ih&D_@NFm z6*ZM9u3C-hrhdikN-ZGTXY!uNFriS8Lfg@!u55RmrE_0>JoYn_`ebIp%55VPX#jTU zNT5B?dVh!_Jo(P!A}5y>9N{kpt|&wC+kIS#3g6)kcW+=E1U5t{UK~7F&lRUdb$X zV$_RXRKuTib5Z`VY*KVA3fGLv=RU`FPCnk>q}$)E zJ{=SsQdC5~X~-;B3Lg0f7R8WwI7DCMvYMQB?43*84L-B8e6nx~awdgoJpGx2e> zqh`7Hsvbk-Zc^hSugRC5kWD$&tNi~{P%TSVXRobOGrmYlt?-<|i?j=Hx(O)+ls+}g zKTdMDJvr(vG)umsJtOP&JxLMyHHe?{efXgxS0eZ7e^~%Fke@@a*UFS7^>|iDUMoUvkEm#of$}B)rOx>i!Ruaxf9j zNL3f!j%#P#KNI73b-oV$VMADI&p&p~JbOTNf~$7Qr$NYT?`r!ox1B7ZMMx1vK8b(O zM%jYzI9u>Mq$j7RiN1AnT(eh|O-LJR-SDD5VhHY2wc$^=}S2mMe7sA*R zs`A@*QKXKCmepcTt(2ao0OhcS3uh?b=1P=X$g}@q59d<1w+B+t&k^8MJlqw4Gm`Gn zm4{WEKj-+f-HgSi%vn76li0C(eep9J&6XKLL1B@|>X~SwN~-ZZ%E~;&-*l&l@HvUI zmg!T99R}hzPg%_*>Q$O#Ay*WhbQ*FQ;#xMUDk=Foep@US+Y>gM@h~RsH-S18*Fl8F zdnp$>BS8N1@$UK<&2|U<@@Zz_=|JxIiTCu6_gAm-@zMrY*1Hk8bPn6!rRZKyc99?t zgDSp26q;k_&jWKl z0amO@mPwIR&x#FirVNXF=Iq<$6L~u}a(6_!Pa1OKhbw6!^+^b~|DjuQVX}p6wGPWK z@X~xNL9?)}!YW!4sh^Yh#2q()*0UXL8~2L*@Oq#4)XAY45AQOEZuaUzHpl&!3te&e ziaj-Y=6%-m8VkI&Blp_!OH&j(4#LAHxeGkye4rCF5C#I*-2e=^9ME{KYl-+9a8%hb z&GCL9K>w5{p)6|O=}Am^SI34#hKN^9^$N7qgVjA{BL48~X0_vtQOF96hvkZtG^)9? zMx@Ifh`!ny+#QNERu0>>zh!K?3v#ye*_0#S#A|=(URqC&9B!YNwJpoNUNPnwKxsZB zwMdYzC*IfO>+u$YZE#-yp%8ign4SEy&*3kP!05M4-Gb#;2YU~6x~|V{Za?V^6OT!^ z;mxM{dES34RZ;oV(UaZs|{>74>9X zq-L$Tt9WjYNC+Y#|aNf#Lp-s#H`5Z*~?a^!ofP)>nW{+Jx2_6#5JfT$**Umg~HC6q7h|8=H zGoFkqM3{W?-vkXLCp2mcdbvO6A#hbk!Bbjer+VH~9PWCfC{Sw`BR~vy+9!V8;R-CnRlYwSQG%lqT z`r|xAa3jI4JdaZArERBQ3NPM(Mizu%YyPs&exAohKC?Eu&L#?Ute(LFSC7V?qLwv{@NAd4 z$|MN+GYg`HMYJn4_l`+addjG6WY3b^JwV5`!Id{V1zS(Z(K$VxMp6mmHZ5 z(SPeoM8z<8cN1@$tGN9Oz_2K=nG$dttnNW}i8B0~d8^BR*bl zzd{tQIGH6b-&0%ZLs#Ik!CGX8-n*mAg!Fug^uao$)VpPuB8K8VmfHkb-FPoo%pXy; zCdIdgW)t5-Gt=1LkuC7tcg)+JizUw3l&15!x>;9Jp30&9K;B3qjedyW${W&NR~lf> z*4~g>SiLviPHajX^0isIvTyeum42#z(c0V8Hn3=+5FzfbrhdHBy5jz8pKTpgzy`~W z==I;!V2)n}E%9_wan` zFA;LpXSedS*bN2^#i>t;E2 zSz5oaczleItO!%lc7od_m)@^1!?(Qxhyif&e3zJX+Kn-&M7)#_uUf)-nl<>yjlZos5U$mR($sOufEfmoFK(XVjr(|Ea=yp+r8({ zun~{L@Fv(XFVMWYQ67+yl|H93(mGxFu+MdXXN{SiAXUfu95kv>9FFcyP%K6xrxIm{n^?c`@C1yni-0y&2{2c$ z@Gzx1YGy6xG`~01l9{K= z5ijW~OGmuLVts-ViX$aU$5*f=D8FDRoTj-5V+O7@~%iOoUKc%{uT%& zq-N~Do?~rI6b?#E1TUGAvojmiN&OvN3)$f@_p%*yp#R%-%=h-|<0yX+&@`dg%vF%}DnbV@P22+5>VtBtiQ- zi#7fEntTV+wNwYk)z8i7;VXI_0m?;Qt2}?G2mz$V0NlY6m&@V38cKfbU#DiDpYgS- ztQJOzB;TD0=~93@a1I7+4v&8kZ~0=ntnPUTRf+^mCV&D=wH=4qnEwt*5PO4WJ_+S| z;SIyi*A02YMxFyPMxZFKw_Pf2c&qrb>g~~TTe{ERH3ZP)&iv|FKB0vQc9sK}M04z0a z&Wax(=Ne#)ijo~Z54(VD2>#c}|3wLf5B4S@lc1}-3z$^k+yH~l{&{K{wDJctJaZg< zi7CKWqPKvb75O{-0K^z_zAEoq)z4{1Z3> zUwXgCJK$2If^;9O7yl5A3|Yijl~97o2r-orSV0KXb15ZpNlL^2=z3w;4g zu?CP!X^_&B*ggXD3l>mb<50HfZI{rT9N#6-_wPCZF)tIqn(^qucF+_IW*7^jEgpJfahLdlkWowW-gF${~U$-fQ2xDQ%C=DJDE+% z#gz(uRG=V@dKBN)r!*!bcz|CE-*)3W<=nG6J7NPW;0mNJE1{-fy7LmxT$s9I&xcw6LH8rY*5cwh+Kl z^sj0H(sxFyHsov70g$mvLj&%ZjCywIP(zqFLsV-4VIm9^lXkmMAs?^~3V@~-ZQ?&? z>IZ1bF1UZmlE+*Q42ZA5X9`4Sc>nT^LT&N=g1}Af13E%|&S*l|X zs^YObC4Dn;IkbHYI2XUf=P-mY^P&OFpH~Gn8*DQ(8iDu$`go7Qp$Y@a^m+`SmcHg~ z@7}YqB|`aKsKFEz$|?5sH~ts+X|lE%FJH8{sNGcEU3Tu3ZU4)jGVsuUAzC&7>J|kM z?HqqWrU?Dnsqn5#2AyUV)DW0oq)^V9&~?%N0{mwvslx=&9N;VD6tll?sR^D_uhhY^ zWAOA4(t*GxODn6bV<_@z_nItA0AR@ut<8Hy>Cjg<1Oe%YjDQF+nL&>}ei^*dnNX4! z3K>fq5NqkO-9!CJpgE_kelG}vDKxFO;bF}20WwzWa;QlSl2!nN9z8KJQIJY000~CH z&1-N|?2aPjDF&tV&unXzFGR+ zj8Z9VR@lx5Gm)kv8C1_DcmZ06`0=?R{K#ql>pi!)A7w$H!!n~)5EA^{kbu`s0e*mU zEdT?`L4FHRN0?j59u{_Yj(I=;f(E%8T4>-J5L=W&=U;6qFVOX3T6snyx+)h&%DKkD zqwk2y95vRRTlFjiE2Avv-jv7*nv20c4GZJeCDji#R!Hn9QHBgm3$YV#VS+dZIuMx& zmjVZ^S5CZ$a3qAHAmA+%OlI`FvQ9Pid$1AeT@^(A)1s`Q0hoEf-_!Wq zPlT#J19m>7Sg}CtfNOst|K%0~c-_g{y*5I^v!hqgfKx0QwJ|V2fpP6MT6(-;H~KG9i70~DcK-~+bs!dr_p$!N(f6SM z~BUUrdVjq ziwBswFR+n(K#omj3|C&WF#}fH{c*=1fL#S9l8$E zN~FJlm!SZO3Xx$}_J?KN#Iesc4;00t21^c+Zx%8d8n{3tM>!ii)(A4#(;_YZAAKH?D$C)j78mjmo^<;7oZVgdWi zxcK-IkYolmOLBy|CjRbtBv+RGtU&&F2PWwR3pCDa2CWI-lcIuxfO@+X`a}=l0|Z84 z@wJbIP$Ce_&>HRD8;DjZy#D6?j@tGg9cA9nkM2RT>AfppLPYWK@Cr02cL+Ck2)f3_ zL4c$cZcdngtzX|Nm^a_$kADPF&tqUIkO#f&C_J`1J3CJTo@THs#)%IP$~NDpv2E%o zL#*j@-n@|btTIJHxvLL@Gq%c1Dn=)lXwcKCXNF8x^(>i+6C3BNG*<2EC;hh)$SI}W zg{zoImSxy-wzOsqz9a**d??{;ZVa<+ji#eA{Rp4Dkrfor$P?bOhMz8UmgSJE`bZUCq0)QLp# zS2zUt!68rv34+u|(kI{Q9VOjhH?S~~tkSa%dM;=d+@<~p@bW;6_V_7$VsCY%cGxr@ z%zM8yF=2!|ZPG<#zRj_CuF6SC#nnjjiu8Ty1;e}{9VsVD0Qv+zRj<)@H5^PWF?b$e zcn5BQbz|Q+SCnU8rm)M(t8=BXR0A}Za)N4!7HA&h%(@eGW6dxji*7ueAn#9SW(o?4 zwD9e%t#RO*MV=@WW#9q)^afIja?ZP0Isj@26?pT{NuuB55c{H^P|`kq-*OIV zeT?Cm0q=1rxIzTXi}sr-UVq$>==bvdHv|FIJbnSD*TLBsm|tleD_-$Q^g1BV_8JUk zBgo4>cZW{E_N7OYbqsY8809z&n*-x5=v^4}#}yePy_ZOO`m0%?hI_nMJxCv~yW}Q{ z?K{%PGRjM4F$ZB7Qbuj3!!FbvvM*uVS2v)4G*HYwpnFp5_q3)a(wjN-6*N4gulZnL6wNdx6wGFHk zzhgrte^fr^0t6oT6k4ox20EC=@F_uM7W}}mZO*3(Sf+5F^^qCTk(x`mRTP7{0eA~^ zgB#Wi$4CxW@%1+zNIeX9=-C1dzJvoF&JZ^b507%O=OmW1LU5kTCh1R*EpY*!n%_wa8Hq z{}w{mm;Z(=qco_j34|ky%0XCW)}NtcY1=K?HvBRF+V|}_9%uG5!e?4VGAWEgnnl(N z^|C>!t8ZQYn-_=m9oHi9IVNN|mN22;&JM0n@C%-!6dqUl!?_v>a1o2c!S-pQ3rzr} z;fmy_e`qM-AkmF|9c(E>>p1Pv(&MW4IN`qtdj2@*%kn(pDnY4M+C6pKJPVZPzY(R^ zS_QsGcc-8(BQ;tLCQuvbeO>?}VFGNZSmHpy?a)9?4Vw=Lf*s&vu|%Cng?PJ&q}+RA zc(VSKVAi65tRd4^LRw0Cdh$=lPY(ikjQYN;SX+Oate4wN2C?V(weW2_H(ZF5cwg1k zVeVBW)z~r|R)jxw*c=6E&MVgiU(L8IfBIFXRzd3jljIIJ$C(o!uQ>OoB++5R!rVoh z$X3XhF7F6@sp`Crj*f`T<^d(QvS)xH;(S0v1d4^+E!Y)G{hlZ%IV1Lb%pWyifC-U+ zV*A`+nNn!<9CZ*zxXYi%xboH7>^VvG?}|WBxe{-$`*WCHO7ZAG?x2RAs6luFpYk{TIOK!+f5I*Y zMW%|@Y||AvFI+n{*Va*F&D*fbmke4+Wz&+8MaCuEI*qQwu~HvemhSGJMtnQ$mQ2Ty zhZNMJ;H^N=F8332`?xcutkCLM7fK&$*)qTJA;Zl3L7l{Sf!ppn&?F@;+~1rBp5;Y@ z*PnF*Z0IlmdA|mg)O=wMjG1a^5Ca*!I? zBON_cLkW+s)nTGWWtC2$QsEkJ|7tRaAWJkVS9DU2vLKfYKKY7FO-&Jp%?hz1Yq|TS zp_&ZRRa%>9CU_MqR59p3JH*c2@!WeU+GyNO1|GKpPN0GKH7c+mCYdEP2yDx!%h0j5 zunk67ZqFpM)k(Eu?dC4+Rl{ggDLf45fu$L0OEG0X4!2Eq_wqQd!JyYYaDMWDNndDZ~p1ifKsQZyqBytcE9M{0Y z2%-z^fg9G~F@4$097oD?%pd!C1bV5ijT0EboYZI2_kC1Iy!te;cd}SEkP}hqzT2JB znCDE*yx~uBiW&x3S6$O5Xf+SD7FyVuHGG{3n6)$n$oh}>Hx94Xp*lUIH<|W5xD!rx zU{L)I+=oMfRM+a&TtP)?DfP_yFY?wAbSoyI+Hb#Cpw2}-KTUStf!xEmHM!+4Pu@!0 z_cnN6#%ive)0%$X4N9T4DZCb9Kb+iq-%z_}$^1u3CP`uw&)r1M7xKR>fGeVB)vqZh zDfx@PmBmZ-3F1RkL)vkUIf;8TE`nq?^n{7!W7!LmG5E4X(ZPE~n)I@UN_ylyW-^wA zY573imJ3(9Aqu;dvr4#OjpSQr+7__{oGo^~$ruJV!(XZvwjaVfc!j6J$C5DnL~>Cc!QsH1In% z`H{Y(plumFj@r5J_Q@MRkZc+boJ2K^jg3RVXs+i4)VYUG`VxWK4MuToKk#BV4l)qv zHNI&ePhIjY%N`&0?NF-Ur02!;4Ugh91r^C9&+RMRI&6_L^zI%6^!HL_>REj+eSgBu zk-qd{U+13ISx-nKazfWKV6Key?aRRYSRSWaU({^fDxYo4-vNJS+2?5z>e%0qOulx%P=UBtE$hwF4xBKMmDu`GjUG*dRDr8RoB-UgY> z*IG;@OoewC_T^P`>6&QdR$&}19g|x>o+HuMjcg_r6YhDG&B?om(pOn`@AHfJD4VsA zu8h?(SaW?L1zvA=8piS~xescUiD9Og7KouDiVDttqeD#LmK`tu%oxUQ=p_UDkz&RU zDh4X`Vv%?3b@aGcCZZ*x^$s=iKPk&q>~@Q3RZP?p=;Q*W?}nwWMi@kDaYkg5MN}+p z#FMpXtuI{+YUV`U4LB%F$n{8O&nwg3nX}+VQ}pBRn2A-H~ovgQbF)mtBIBuY zpL8zvD!Y)1)wJJed^^#VFT2CgoQ@Ix@TJa3-BuAyx9@kWk$4oinc@lb4+vsnin}GUJWSA^NE3qYMpj;BPfn>1I?QSs2kV1pPLf3 zhSY`R;M;>lZb_Wmr|U0I5}^GP0oJk4gD>^Jji56Ek$8|b4KN8wFp$yp*dxEWffj_K zxVBSJ`KH{Ih!1DqXtq_*uUfn2-&&+F`FYS}ho-ib=$Tfp z;PO$i4Bzo(7L9f&KUg}(Nc&i{$MrTygu851dPuuhcLvR|o=$vcwZH$AmT{gG(F>VG z%TMqvL%C=qF<8|>Nws*^n&4}? z!XMicMJ#XBt1F)##StS^m2W^n^Ma-LnQS{jM|+AD)fl-fsx9z z@fwO(xIQd4w2vvb@`~KO(ek-_{xs&QF3Q0i&G*Doqv|Pp6R%mY04Fs}P+_fMS}nlR zwscmyhevTZKT@ggvyL+J&xo==n;c8>TqyU$`8egAnaP6* z*Fu8&+^3k_NVlI4?vw9(#Lj-?$sQ@B*{&in@y z^G>1DATo{3Cx`GwVqtp-Q*Zv_#E3OGrKxrXHKqbflJ8W&28Q_wl2CYw)ExXzsns`a5*m6osm-atD1GGjS>lkKbQsO z_kVGvo0HFwYtf!oNwHEut4xt(N&Yha%sugAZ#IdljOK&*Hw0^r!^QfA9lBa)=RP5t zyNf)Ws~6Os{uHD64)IAn$Akua;T~yxHf%N()*qhP=ru&`M=4@$O$0J1sE)}ldAd#< z&3A=T6N?cM_AF`158ixhnEvW!e%>lwsAOI}Yd+nUJQ=eL`AZm`a3x>MjKZL7lbBh= zTN7?MfGkPloyNDXJ5Lzc3aUif`ICFb2ur3l<8kEDn}1%V(*rLQcVqT+lVCXCs~pgn zy8yeGevLTL3Y!F_6*9f4Za>4>w!fe@Ny)$v4XV2g!}snn0mEXz4MDamSi&r6O4sem zHb;vcJ++3x-1Ihq-vMvSLd_|f))V5)an+JqW18+%md&;y)zOrXy_>6>;xQj+DPi3u zqgmTiWwcY7*W@ieei!L?jy#-*QU#-@lu0(gi1e-;5C6e-@%(~i%WUtKqi>~g=HXC+ z*}M6Cw1_o~59m1aK@XEd83iLg>daf+ks+2|ueD#j=UhU*aJbG=S1kTX?qHI2Q;vMA z-+y4YGVf^mOitv(X7-F9`B2~mPstl)RKbTo-8{Ob|oSQia z84n4j(bNf6Q8HJ+9v@oB&S_pH<7-=ieF{26`>QH_khPA9XR#R5?zHBnnweswE!y&M z5zTk7JyA@>L*>4jnkIRS-0V1Rnw_^@vLH8k8=Zru{Z16+LjqgnPz!i-m~F;;Skt~P#v}3+3p!YS0^}O4wPLAztCJ1N%$m8LkF-k zHa+-6t2bU%LE1g++@5>;#900Hn2v?Fr+hYj7m?qS$NhbbV7hoVK$3X3pa(}q+k<-u zhkI-JiHXgfdJ5Muus@;9;}vTPTXfuIo}gz|32&dIw@K`1mwr~^UVl{BSJP@wLZw{? zy5WhnPs(+DU?8w{r!Cf%W&C_fW@=osHFIwXEYy+Y%h?r_abP;n|Qm5ZLCP zOBEjTq-(|wx8<_p?ZglHFus*IxPvZ1afTf3-^u@0?7P$LxG)zF^?j>v9OL#TV!m2c ztFAm*;X6#-9S&p0P~>#A$x=H04j9v(aKTd#PWGSGi?68=fP!-E2{GE0 zc8~o|qfo?KCgGsg;;Lwtm4%$iu3S~lO6-=^z8c?D_RP%XQzMq z%-?he`ejitG#UA&ymhMJhZIYOe!dBmAKR!@P-F63J#7!~FZe1%gM>k>wbrnJ0FFjn91SaWF$r-;zuNumyg4RHX z86pE33@(o+hY_G9|H~SXCmuAWfXQm~nQtN-RyrPXoz&X8jScTnQQm+JH|_3ES$;w+ z_BoWtO?!LTwE__)`m|i2`}6ghm{U&HhIr>PUfTe8$=t0>$ezh z#tgO8ChZWpw{4;mAMG(OoAS!@M9&KbzQYgZmlCfH_Pj%ml-(OUnBvw)4HKGsgLF^) zY^>iv-qc!ifJin`jz%_>IS`sx)Wpy9?%lhYbwBzaU>P9+4aEYjxW2l|rC4ZZ7V7Fy z3OuU-DbTG+Fecs#%FMN(UjWU#A{)LwZaL;}UJJtisEBSvry0EA!rdB_GNB zKtwUkMyYOGgy2TzG&B81tA@O&P}$T{f_vB;H>v+~Umf3Ry%Rb|+TZP|srKnVw z-+snR?e#+)`#1@t_~deR+gP3-Y#nVS6s61dz|vF<@JHg!jz>8>U2LMip}a2N+8Agd z;bUQO@>V<>r^3jRDak#uPZ1r+XDW5-_Vl;QUn-Kyw1&Q-=$fd_nc>loyB9W=mu)-a93j!4IOTJ<~jD<=_c`s54l zM}Qqj+l}QsoKOb^eMQ#HCS0iNBzg2b#~myDC@q~|UQWwZ19fMb1lZt~45{a2%VwOk zIdGE!&TWr<9IzxW%HN*Ju#Og;&^o(r{KAkg06X5b2QamImpT?hurgZjew>q*IXY?rxA!x=Yw}Zn{DGndN=%b3VeeUx+^x)><>O zCjM7B@lqIw#v$iqrRg04pQI6x&5;KX?7_bWWRxj4^?-u#4hVGSkX}?2 zf`Uo>+&Yp!1Y|Pxyg4VXfOU$To}QkB`(BINzAx#LTOzyrEA9OAm42IVfQQfo@Q4HF zUi_}i>zk;)(QzZvj8#`{d^CR6AME$%g1~_}%xoZmTHts#e+UHqa0Uo^3cDY?@jPfl zeUghIK?TS%07UienKlor|K-5b`1l9=4lzhddnx=N;`3N#btfRkS#FMID?fTQ3z#mL z=!33kfvQj5b*VPJqQBn;N-uNI_7M|U|ad2=ofMt z!TX*Laq8AJ{Wm%i@r>&pa%tlkLx*CIF0wVQuGBlrNb!2-A` zjY@=1k?g^1Stlv01&ZuJV%x>6#pl0%=K3X#d;AxBCc)qSv6~K@*830ZM^VX1m#Rzp zfyp(_TUi(kT?TBQhOzP);B9Jy+Q*BNkcANVoPZ-?uTBTR%Q|%hVU+Db#vo5^Ge%7bl5@tGyRh78 zjYEd7Mm`s&A=H~KWkYp<{2?2C4thpzzn7Ytx<#ksMcB_&*I|!0zw7~N2b95KqEH(? zI&0^(nc;${PV@r^Ud-o=VE}=RQ-4YeqMy&XxwtxY)v;eFfyT@yu4wN(T;vrL)dGnn zlKgXE3wr1-NV=&KFEAo#@kF#O}*1Fst3pu`BW{>&Yv>I+LcR&>OFM7a_-eVy2T9;_(gdz`q? zt@CWZhys>O;A4~m3gG{}cU~rUgHB+v$s~?{ps)-gy;$+2UH|^fyzp!`{EhWCmnY5Z z=b(r?N`Qbs6HPT^3E#Uho&M)FB0K%v?>I&PB7y)@ePxvbzy(=XizuczVf+G6s>{jk zz-LmJ-ye_%;K%dnyF`lYNkZb$jD)Mg(NAQoZpl-@idL{t6o7ZKIxj7m4w%-kSHTo2OMH2ICU z3byIqKER?9yhLPHIj+fVBDUte_8}8a0!|!oi7t%whQYE9ma{B?&!7KoLV)T?HXwAB zY6qc-);<8#NRsZ-)>}CM2W0|QOW)}$LET=O+-MrbC^%%-s75sGvKY^OM%<&Mr_HxB zmixL$lK=gm9!$n2;tXVxx{iPj`Gfw&0*%6VH*YFc4CT9BQ2a`Mw|{vI(3HfWvVdX;ETSdPf*uWAE zS|GnPeJj9J97w7u(~=E~o{kso4yyUsA#d+xKDL4-{8yB}V!15?P(Fy{C=eB8$62w9 zYtNM*A$=nO6CAk`RNRFk3agAeQ21Vq{rMweC7JXF2&?VF-pvs`){@bT{{uKc;4wL_2Nzu|j# zm8vhm3kY-dVZ5B2(O@_UO~*coA$8UgqxU0z{2cb53vC=UNTis$BhmvbfEnm$Fj1+> zDkkj^`B6W{UE~em#ZltP%wsLb0avHiffzAXLF?|yfMlew;sAn<*d?7C;C?GNc)0+G zg{th3FKkx+UtnjZojm@~(p)f2#>h#^tn;WMr51Sx#q z0Aq<+#6#-Sly^BY(HY^xWmMne5#=(@3@F|3b2dL0+uP@a0UfWx1&_X|C-KeRA9~~i zO)!&Xl|>W}(wZNpu=|e@z?P8#5TEu~MMsAo?-#@y14IZL2wk@5{PtvYh29S6@LTlB zQ20qTmpvxwqBdDen=iobC7aJdup`VIaO-4kYl*g3WL#LP0LO&DKgE34;{be{k77y{ zX?X6Tt0;0VC#(|{yyu7v$VMCToKK!E%jjNW=T+wE8eh>VWGtx@8?^EZ``jFU)V~Mz z0?dkXdX%iJrN4NM4#j})FM2a%oIDIHLW!*%Oi&VCD?ig2?t1};K{X|%F!Yy^DJi7Z zBd~AQ+U)NhMB<5Qf+*W^DBE`KepvW#D2=m-jg;43w8YnhI`U<+A=!DQx%44VM6qmv@RJq^HWb?Y#ime;X%peIp}QaoV!PYa4h?kH|0q z0RfcFw7L4#0O9tGmM$5OlzId6N%)WB+*SfS#@!tSx|F4nTd*WL*SmZb)Z~Br8{Lwj z(Q&QUtcwp@$m{-k+6l1LR;}N7g`Yz2uZkvm0`Vx4k;q$qhETvnOTw4mz=^d&MOtsp z^z!K(o48$5+K2>*kamObm?#tPb$Jb6f!Lx@+s0j<2H@!mwnm96&9qyco3l{hM^=@;o;)S z;Jn}adDNhrzM2_AwNo7A9b>pv5@T*&XzZ-C>?mEVeO-T{?H9h9EESuZAh667fs9R{sk#V~1L}k;ES=Z{dE1tB0oOX( ztSgLn8I6$R-8XcKcA~}!GT{&I(%&90qgTBgj-kNVYuGt5Qe+m`aE zZlWPD7=^>`o)yv2P*eZXKKkn~kUw9oOwIum65ie1Z;1;dP?>a9?=2}jWV5hK;~W{i z!t}F%LZ}hSygLu8!c}`e^UMjv>5|4hmi!{fOZuw5E&%1VXVv zl)h$WX1}!^hvPvuZeTSUXg5)PK-hbTP#oARv9 z61KI8kpFsWRQID5;4iy&2^jw1gG~T+ywWdV70xJ*e(<}@t%pRwRfan9yQHg`8Z@iC zD-$Q0XQ^AfSD%Bvjr-4AQ4H+WV8i)KZ1{!`4nXQ@v=SxneI&-9rt%FnR|_YQJ{_f$ zdrTj6&1W&3rX36gH^Z>;q5g8F2Z;!XoywtDI3SHvoI5aa@Q9dB9XFL%baRFRwrj>~ z+11yW8WBlJ#4G*-{zre5mBuE;564mQ~%U42KsYsn;Ffh2h4})0+<$~mrm%R(nKGoT(BZx9F9T4C;-qpg_bS2N+ zd*w2;bOeE=?dq)zWaH`#+#H4hch?-6wf%o?L3i_w2pSfmXzrQ^QSvO2iTEiROsuTA z(3Z-l1jG_DMC|Owm_Ka}qO=nnd)^O@T?$ZDAMnqI!Rn+4{vSCMriWGtwY=XCsO4c9 zodSgjgTn5d9AJHUMjs5emHa|rTRQqKWG8x_tE;QIKsF$dy2LlF1F+|t zMg??7Ftm7e1-P26}rV$b_>E4+Dy(sDJ6G2y4Dvr2Ig7|kle@- zBE|M$;P2szB{)|e2|&L@lnGi1U{w_FH4CP;*Vez7qmp2vLW7Ulu-0;nW~Rxbl8f0C zM~ycRx^q$KPXxfi)52W4M_{*VEDwZW?|8ib)XNzTW)glNv{X(g_}BE#_rZn^=7;Gg z6xE<#64Ax$vn)%SEa8255-CUJTS2e|mQwO_Wat*EUP2=y4f%~-*7Wo=Qg7<{G2~F- z@9%FmwKG#)n4EPO0gsmH3HXbj2JAVbaHrKel2(e~@~1JcZa6xUAHaB-W?j^`Wzy$$ z1-8+5m0CnNzMrFdrolQ%0E-da#2esm435#FAOuBZ;0L=nf8x@QukrEm6yMv=-t9NM zm*aEe z#?ECHQbBK%0_U;o_^puZ5ga$Rp6sPNwWpirdL@^@ZHZ2ub&_$&D5Bx^+o@4)o{V)c zF?%)e?AAVj-yCZ|EsU1#g67yR#P?P)L+AL}Si`Ot8p_!}0xW0@Jr(J~xMK2(!JMgc z|E=U|Q4{{;W4N(I_VrtG>MsIQV|m`P*`0nmNVL0i@L_%jBm@-|R!jWtc3zfs7;845 z4P83)3%x5Yp|P(2vPa;1k2zi>vE;b}LpF6tI=hqkeY!PTmM(}IY1({(WAz?ghZ`5fZK9l5DI@BBzwNuq~7qi;c!cL z(q6;J&Ye7pBh7(M`BA}DOAmaY?T zBFaX`7<|_E((wX$xCNTp{Px5Q2oyb%^70xI9-TC0#*q4WxDCsa78K7YG2#zp_{UgQ zIlu`MVq(OA+NsL<3TuYXXteM(Q=0L^CXrCpsIMcVs>Q+E4x=f_*;OCfoaJO1q8O5T zOPa0oh7f#52VePKtR|#q3si?Cd$BU7a)(5zs%E)OX8FsWET7GwIlgItIcsuk4(2|p z-j}zibek;uUyCq@q*Plib+PYNDfCEP?Y*OAiO&>NkK|>qvQ@+GC$xMp_e zdt@ieWj3igW3UmqO^P2PJ3Prhm@#KNUoBNat#LjluF*84BM+Y{&eG|vAB!!?bP1+a zc@#IcCLg$wJEBm#SKS@6`*gSy?UHqaAaq@U)EDJg2{wtY3V+4jRs_D{9Z1uvCjT0Hg3b=4sRx<%M3H8r9ZX7-8i8c~Zo# zQgkkx{G55d!v)|caq4}q(P6ImOV})1Ms+O^XFB5H8(`bW6WmamRwPx2tJBY?tH=H9 zk)nwTRca>A7ft%|yz(Dn-S{9@hW5s zW;UYlA5Ol9Uh1v8d->}-b?#DeKM%E1b@ZuMQoF%;gmz4Dy7@}jv@Q_BbW*{?idf|XxY^pR~TzW zUey+nb9|4NT?pT8RkLg_ra4`FWqN$Au+T>)M6WoXhm}0I4J+Os(GuK#Ua`BEZTj{Z z1HTHAq9Eg!9SlHH>doE~(h^}5dM4l|EI+1sKwr4Io~~-LmD`&5C_^W6C)=6Fl!{7O zRTl+=!27X{^1Oh@1L}7RNyY0QsiK%{FEh5J*Sa=NT9O_p=EBLitZDLl1@fE;2K0-Y zMvi(B>r2giZCoeoU3pY-Lw`gw@rzzynGU~c_G}sY!NcD3a=+)wbGy>gDO;12A7`5B znN<}$@As|wjPnMwW2#3=O5Ob^)Ys(ExQq8aY*vp@(^f=rK{5scWjwZ7K~5y}QCNO% z!Q6t{=!k@O-Eq3JOl-gR$MwAg>G+n)W*%*n%Q=s&d7sa9W2@D#w`Jok=bgqZFRul@ z4^F(NO#H0hX-kt(8gaOL@$2fBqF#y-W$QqTH>FVauF$PJGQo+_s9&^NdpDA(c}~7} z2pK%FhA9;2FSx6WKUb)|j6$IbXpryoYWZ_UdMG;h$0Z^VU_nx^ojo`zlS z?=0L38zb>xyHqJgE-%H>r?|7Oa~gJ$G437j6WsG(n{YfwKUup)>SR7IbbFb<*=R57 zCn#MV@q%I`F^}@@U4v;SbHPK)L7^)0t0O-(%DyOtTnsZsH)O>z)8T?yvEHHP@0xRk zuD-t4SzGX8x(%8p(#aBpK)Xhne#<;WC7ogx9bpRx~f!2?dgje z!e_ z_v_61D9t%x-cEv`ib|)?XK9*2JFkaQxZeF8s4D;ac1uK3C51FqYz$RvxL{|gI6{)* z%7bARBtm9bG!ezlQr3QQ6fg}}$Ryj@qFJmC9OwN_Zn}mf+s7`=4n=( zv~_)Sq{%Uj3Mq1s*{`B$dStfQj-SV1AvV?QM!Q>b+Om2;djDU+1cn%OM}&5nJtcT# zDYn13giuIGiOcmdDE~H}XJZ>QX_DK$uQ`}t<0$pQ`uBIAw|mUP9bU!^2E2y5IRiW_ zly?!fUXugaDr$g{G4y`Vp5Gi4)JSLQ9a$7T^s6VB^18Eqp1|9bKi&~kDyT3FQohNzig0C(fYm2o+&;#g3Zo1M63JTe*j_T zC^<*q?tT5)QCiKyIjJM@Fz(3s`o(H$tnhq=-YYkjnH{1J$Ky7+mN(MFs3qNNspG%d z>57#+hPKEHQMUaj7>;Kin7Ne`7{D1U0e zSnS$2O!rOX;&jC=`OMlqMm^2+ymB~Tv1(`sJ@QxCDBk9ev^zX5A}S{-lQ#Z5v|?(Q zE*Ya2l+fhNaNfrq7p%OiWa;j+5&4hX;fm=sTlIbQGR2xBQ8FccGexJqKBI2*NyYAM z*Z3;Cws}7ujatc;?ARO41qz>iJdV|e@*eec9NgKj%)9YSYowk89ev1rO%r^_hjbA` z-MhP0UQt%TJMQ+aT=cY}cVlBS>!r%Xi@dpWCC(qc{+`l}bZk~0RIFAL_r*#%D91&O+|xW+$bw62O<}h}8VEXB$x|A~iHEQ*T-nbeM z)Ck?!Ul47gV%w$Q$dsk_;^7v4hIH=KeBkdK!KYhZ14aZ~czW;Zur(zHeyuIHwj7Ae z4KFOf4(GdijjqMBWZPP`@J%W# zZic&2Iw5Yk@Q459NT@ju-|D*FM*NW3jE^7Jj8!{K@+H6h=HVTfLE@f-k;O#;Vgz%? zC9vv+0%M3xkDd561b(fKkCUgekvj6!(X%s8xUt$U1m12`54$G2RIeT!fRWa#fI-jB z&1L@sZA~aLrD#^lL#g{1GxeZ?&Qd*P4xl~so0}BJv8A<@#nvXTfq9VIH>cTNAwdrR zfTrfI7kvy?vr5aL+RMeQo=&pv#kPKm@BHvTk5;%eXj-VkuO1(tety2^jdqTl#`r{1 zKt@6F{IM5yvubx%%^x!ydTyZu?aH$`F}UKuj^Yz4O>>4~9!ZXv;7FIDj`8eEe)Np|$Ye2eJOIxC8zD|NFQ9)k{H?qB$t} zmOrD|yMP!G|DfsTX^;KRP?kxW_C@vn9YXmj)N++VtI?A0Imd|Vfq&yic3=3|0TupW z&Xgssx1LYMI(5;30@K0{obT>Wf(`J$kLXJXp7_tl*$Jvf{rB6}pnO6eW^DHjs5Jo0 z>t~BJLj+3`h$b&9AcVn|qd?iisDXSRxJ7j0Kyik{z%XQ_WXL#|683kD1g=LnYx@#p z_TFWH0Lk9L!LVxHG>o5Dm=cfwwY5VB6srbU$JEh15p&t`Z-1ICrNC^_d>}; z=5uj5baZq8bcy)-ZyaE2>3g3}wCp#nZ-W9|Ixu&*|M54H#fv}c&LDEqanTgOdPrSB zvV#EeT)~m=V1C;7prU}N{!;044$|-dP;?irZ*6H2mI5f$1s{kgfqcUt3}3h2Fp?Q4wdO(*lt<5xnqctOz&0@ zl%xo(?LouxDnJ$|4O<0;7JzJk#2H}Ej|}@)=^zVJRF2N1Rbv?J9D#_k1X=DLf z-{Jg4Wmce9fbiSVSZ2MfO}a{uIhi2j#e?_knTa<*=7|3_20sRIj2FPDAwGzllNwC) zoqO>fWDKRDp-}}mH9tb`!Nl&Vse*P({tA4YVju(}LBP!xQtXcXjnZy#EgkPOM6N-C(3!-dR^wP0bSM zK~F$unULTiCjacZ{>uPGfqZ`Gz5v+je;(5e% zh-az(1%>;_UnU<_(O?!h|K?kSY8i4EU*ahd>@9O{22p~579XAx<^8}d{FEwl*$HF`SL3cjXj%Z-LJzJd}`ri%iM=w63;Yu zK|+YboQs#`kfHf|iANoP0QCY@2r@1t8IaI?Bs6Xr)E*3{pHkxY{>13g@9{0reoDp0 zAkXn6qOy%Z*}SpcDRDwCJo;>JTE4h7S=BB{DI1J2xTCT_xSd$74K@T0f+{HS&E;w4 zM4=Wmx|s&#^g8BUj)6PQ$FHFT;%{R>2Gjiu0Se>iiV4EO&r0>By&631GSdrUo+*%t z%hJ=w#70qxM8^mw2-~qU|KJWO(bs)q{iI_#e@^K*=XHkhL;7*w?su2%%;%$L-yd6y z{xFUiEfi5Sys<3$h5iOmwp8gAfCYpcMQMI$=e)~wjN_hTkOAGe@V`3wvN_S74KW^0M+qsEwCSRt` zq?Y)Yna9*xrKzqNzI_@+N6ie%o2qn@k&MRu&bm#`NEq_`n$4Ec%R3ohCN@AfBM+DyvfGKOH6r&dbP1V)}KiT;TFxAeHZn(m-7j z&;DkZ5GIz5o^UY7*O2rth4S=W@6!prg!s00)m5TiPlEdR(j&&xo%nH<*KU)0Hqiur zohL}n@aEb`rCUOof~r8S#UrB48rhlo)ic?S^aDUs7zQjKh0V>)3Z)bfLZ_my@xK6o zz$=4d-DvSlGZqT(uy}^={HCS(X#`zOCF8UiD|4;)lXtV4y@+(1v@ZSFohN>bt(_~c zX;+&TANjHv%(9k83%(>~o`Pp(s;-%*W#<@k-$5}|U7l*SKFq|@VhU$CipmQxV*FTo!E(<~(y+w<)VoH;wQxNL)8_7}C#7xp z4>YyL_I}Gnif{QC80sYU5$&rdRKA-DbZ*yIS-8IM70*W3b((Wj<6D<0hWNe_%Qv(2 zmBpCHUKc&1eLtl{u2LbBqBWzK)L9#F{Kb>(+aH<${*no>YEv=VC`+iWP~Eb!l@*Zt z^Nd&GqhYbuFP^)bP@wypF73m=tp>4ItaPj&NUZCLwi6b_6f;_#N zk9^4i7r!Ei$44F+Lc0#;rGoi(V>!%r(Tg;o4xg{^(*txh%n!EM@+Bv_BY;zs$st-1`0AZ@_3~ zHek-}-L>VP+C=ZwdCkn6Ec{8%lKd3S!8q75+x~(;_u1=}wr8g3dNn?l%2Vdm?umIG zkgFJQ6Ukh-UVm8y@HvqCXC9;FY0(!H-(oaLjWtqZkHeud-Y4VFEFzNB>qPizYMPzH zQq%M1bk0WrXY}HvePTli}y;>!Ls>R-^}y^_u?JRa@|Yt z?WWz61|u%;8|GuN~O>gV9&cV*wI&A`eJ@V!RY-KW4aGo%g}f@C(er-$-JcVqn^D8#?;bP*wV z{H5>isa7am_vnS0rF&IF*{lG`FkO+P$Cgj>Iq}<{7Ovi=<=vx^3#XpO3^lzYw+T^# z3qG0C4EtI!ndiIUI3IKM{`*?{``)M_78b^+N;eLSHP`r@sB5Oyt7x`W+;4=f65}y= zXvuenvtq_$IYbNtQmOi}_R*y!aw_Wjn|-B==3A9VUnWZC##NYu255}cM{U@2Bs^4X z$Lha+P{~ZrK_noZli$2u9xJoNNKO4{O3YihSoVx7)#IUBO(-UC<>3it63R{2#!W;| z2)W4Mb{cPc55nxe_i>W{mkR(HEdbEp5IBdGx!}W@RljCzS=pG$MHc@gT<(nB$`;2Z zba6~I+?!%NUk+MU-6q)|0}w(3qBq<@J?^hrc9VzpoBYF`C8OV8n<$N%SIj5XC%YZ3 zi|8K}q5AAb_rbB9i*)!H)bSmXd!BG7FV?f@WwZLa$mwx!5G16eulmLhl=7fX=miw( zf||r?^*q6K#OB{OiENieEmE3>Cm%^@ z6zRL^ZzXWe@=2(J$M2KO*sbYS7O?$cD)^+VtocGei1OVTLrT!SeiPltA;s$MTVJO0 z)?R&4Tu-lN>&nF~lhw^^7F#8_#%0N_)Kk|-s3AhW6nxq&)00dwY%bB>aP~^I4-eS(Ul`^ZH5wilHX?Dq<`9Eb+T?X?9I!1>GCvPiu5#>ZrYN zfb5u5r)(X|`48CQoc5lUSZTBkui@sKMabO@y!2Ncj^WtwTsB7`9U7|E3ziJ?y)}!M zP%&;vrA*i^eEadVMkS_FH3ut-TAiPe;lnxScS(Vm5h)vi7{M_6eRk{4jmsmVpe2g` z>?LcBf&ImDUS`-+GGM;v&zXqZv8b5(omP$kSwOkwsS8(AT9ect8y@3YEzk@|%Ojq9 zqK>r6sd}q=t!ftiqqyRVhl}yNA_kS^IojL2TM`b6nHf8)FSqSIzgOpYv!u>?IO>+F zjH|;XZ0hrMx`qsM_SDRytRzZ^d$eLwJsb1NrzNX@3CQ;ZeUiuBuuA4$OR~7sHI!5% zD|;3_rEHn}E6K#=Y!FDhH5;08lx#ihb#M4RTL=b+EnOtzQ%4xSM)qpXH>#>hxX@5E z7RsU4{w8HhCFTwnzRZ)6k%@3Qjj$++;dH8>w=~#&c|q@I*ghqnt!eT3$*rlOT7M;X zPL7MklfI#n!3su?6|Ji(LG>7oJL)FYc(nI+4NOiyMg9BqgdfZ|sFZ$x8y!VppVIm% zhrasa)r^>+NUe&VKpv=dR45Nm9`$d zyw0-kSbnv3y7qNeIS2+Fs!QP^u_OO%DBYo?ln#{5Pgr%B3^+nLp5~18+IS&;YYYv` zxDq0+Qy7YRb8Q8aS8D5M%NMepb5mM%@{ha%Dl(_H8nE4`CZ8kRHp)W+$L*BuE`j{H z*G(u?C|7px|K!h6ja$r7^nchAX$<*eX~M|lqn+k~pO7g34V$W}D6-P%WbJM^102!y zT0QP6nkIFv_GKhXo$=R8mnp5)h{mWqEMLqWNrL$?)%L6joNH>f;+~Opb9La4Lxh$Wd@LX=1oj-R-3Z+otoVI!-yI!hvucW zGBp;cos81>Tb(*4+=){RjPI~)yOb(m>Y=p@t^}&pW*X-6o?S+t(iJ5)44Xe`AGV}MVXaNu|rkNe#mUhCJ^xY{osRCb^L0BbW+v>{F|dnXQZ=_xHQNl&vX)iQIgQiHw z>V>h(*SX0^w>W~U5v>p$V^C!s*Pz3+ZP{#!&)n#dH+n?~$)2kR7pxNaF4g4{syWi4 z2Qg`hk(ztCwm21oal*?oLrS%C4zzP!WVA46~o{V zXc=cp@ZiK;{^dySleh8po2ZSKyNwM$OLQH7!??*j&n!5#jwtrWXf6mOr)!XQhSxz2 zB>IuDu`$I!Jm&`X{D9|n^~u?X2}Vm1-FJ+KE@{&G&0Na)V`p~7 z=#xJLtGwsk9_$l(Am*$f_p1mg|3V_8o)q5qx39K zi8Nky%~mM+cZ*_LE7Tl8I{tJMS$P#ys0a}K07o~gDrZEgZ`B+LuLy@DwVC3=ToOvJL(tQ`Qp2+SL~hl@ioXKfz#C7q}xb8_nSM>CJ2mT0bL@+i%`D}84O9hOz`z=^p|;$fEan0NEAiHN)f78Hp6G6685~bkb5$C}p|P#K zAjuP{VqK@?Nw(8b`7N1&_vJB~MKw|MS4YZ{*o4{FPp^{lG4hJi1n_On=(AHAcDai0 z&@M$se4mDkXw=^@pLCw3Eyb?lrpCVw?@X&FFCKh3cjv&sG`Af`(t1Bht9E5U?h!hd z%GA5znfMeUi#7vDh~4l$%RyY7S?GPdzm;^08}MD=EtR>t_)VJU6F~{6XEj{M*v2?uuqWP;83*x&{!}_9x zOVy&w=+8klNQA6EMI>2%^1^8U@#{B7=LuVRX!iMb{XHXs&v+gboxP45{K2S@qd%b& z+%~)V{g(586l8D{OdPJINaOY+l?=gX4uzN)c$O5jqZE`=`5osO1dCU_=88pi-OOBiBf7l zK>O^XVTa2H(rKuYYnk-%TFzp%^eKorq$HZlaNk|**_;cpE)4aVwhYsE&G)|iJ0TlP zSBrZw;g;OZ-J1I~pql~HqAz*5zQxrJn|h*R++Xr>V3fwV`sBb?u@N8Qrd`=zPP(~i zeq3GZtDuUeB~FP{oc%cb%YcSG)GtgH)ZL@;2puXu-0&9rGh}y`SZK4C97@^2eBT0um@1NMjp6 zZcO6x+3z<`ZJ!n_8~4}#{Uzu8?Wr$db3A=E9k0fpc44M+D_ajNqhBNSvmU$17}S8| zklgV|7Wu~pOWB6F9zx+(iN3_*OSIDQe5~CQEm}GH#`$O4-SyY{L)#}a+)@ip&4%oW zN263hkB{%|E@86_jY%y@SWc^;Je-PpEg`FX$rrBkLt7|`*pA3-v|Vc;r|2ki1AS*^?| zC*?Pk2%~vE?G;#N<=^P4!9OXdti<5)#H&Ul@2?bDr;RJ{1UsvJKAKDKj*glXOIGd8 zC`peTjX91+c6~W~XSZ+Ymsx-%6m~Z%%hu*kA(Qti4R2eNk?6DT2qW`Dy1X~;GN0U3 z4j7hPf4;&_mayv*4XBr8IjXX6zNbXQ6~U(DXIv*JL5cEA&NCzFiaYfpVpnl}P5?K+0idoWrBE;AfbXSIJ_zs!(VO2<@|n~AZxKxAr3-qI}}bM26-x=hAVV!YN93oI@GRiu4{ zoJ)bX?Fi8M+FCs+o{?Cz`f#;do51f?pr<%{KfI4OEQvS3x11duiCL(h^uG`itwA1BtpAq!Qa~wYotT{~&nN0n>+D z0GQ{e5r!y-AbiGo~Hx-b75WG4`sA8d2)bY4&N`V z8BWmsx#jeCSR89Y@ffB*2$Yfi8>T=s?g{woxI{!m2udW;LZ~k-ewP_{sB3FmBs>Ts zdO4_Ij>PqgaO4aWPsf2*K`ym?ECOi0)ZKY23y~1~h_`4k(Z>L2&X-HTEyNNfzT65ODXlOafO&q;08%r~^|mi#o z1+}+@A{6P^qFRz{_hD&xw!o$b=U&UjIuSJ$6{rwX4oiyp73ag4Z3s2cZ#pxa5IL6h4Boa z71J{h-{^3Eh6Kr;XFK`85+7=BJqmCq_ILmqDFovFDK1ukHTo8I1Yn^y$RNmVYxN%E zvy21pfK#wVD$L944pDv#n|r7TU_}e$LcUF47El1;$PXSo7^igM)D#&7PQjZ1G4uoz zqypQ0zrAmSU>whoQ&NfnY3x{MAP%?BwfopU`dkO-bnXv-?Kz(ob8pdsMs$;c8ZorJ zy}im|MM?<7btDLTHvn&CLNHV?e6A0rnGKt?fn*{rzIN1#<^$ZO_CbR-Y&cyE*#PWu z8a_uvV1pQf{u3c!JGr5*shOiusJTfivb6A~@u{_s9OJB>;%6g(U4p|6?XcuMKc!dD z1xbW}<`}ZwwRCk~?tEx7-xSZc*MP=|E(}a=8-Qt(GY}Kcd2A$uwg#BsEddV9&(#b= zN=;ik4*-)0pz8!14sSdJD4s0AMA7Iy(0SG&EiTg93~7CL$rvDggTSrEyLD zfHWnChliH{FLhr0iNvg3Mh-oMAJl=vA0dVSfS%|D1oT*&Pom-dlu&|zo;Q{p4r(&7F(c|sxNd4d=| z{s0`9Xr8ZcY`7sjU}?>4;a~$~IGJ?ce`FMNG-r0$V!;z=erP{h>#GJ1GNSm%2L9aL=-%o`&Zf}x znqcfbVy-S*j z>9&aHy--o*o@m^W+_=Tc4zHSzlMqGVjD68M2Rx46+9c`j()-Fr(5HSE2{uIu`VD4- zExh`0LX-F8;N=$vCZ_QLwWC!g2aDHX1{;oA)|0D^6SVJZ!d&BvaPw&mMKVS|(XV?Z zF^m`W->XlUZa8{VVmP}OQ#ssl8?aU+oI(3l!qqAe31$N|6L?$S`sCQ>+Ih^5Q(+K2 zEk#X{nYy(KP#u_YNjU6ngT)@meX%;o^S_L%=d5Zj%C{P-oM}1x)u8n-KHN(Cokc(# zCh#qX`m##r2MWza?CoYru@MPDX*>Z>CBiu-PbE7YP94|hS>-FBR(oCtCL~4DX-@!# zCnT(IAvIH8GUT`QQTLr0ISNh%k|ccJ#_)gGV!eY$>T0QDHCRwlp$}|5)#DosT)JE) z#`ALG;UmiqP15;%US~&BS*{H)VZ#{EAVIL%YNVWLQQvaOwKP;!&NMpKh_zGVJ~0N? z!MtACVH%eiLE927t>GD^sV299j=PHC)>XDE4vbYv$_=d|E1lI{A2#g2Tkh`ge(?w= zdiE@*EFy5my>2!p^ZKu`P4`jCOOpgw;{GX#{fo>D%BmxK(@N90mxN|!e+C#gw(itb zOjphqjJU<+21cT~_AO1$9c^S%^UCss2|06GFVBNjO*~u9x4f@Xc$+kIHpiOJjT6qu z1T0FZDH-Hcj465KT=Z{EDRhSD?F-{s?EKl`W+^Dt+yvNc_$NHCSP!ujyLA?R?hEvC9m-AdV9~W z^v7>3(DbOOufa>XXeWv)vv>0ae8PNNLo$LcEBQ6ur>2Fd*JE;p2zd5+&bU*eC#qA% zer*f!+|@e?Uj>^hT8SCx6iJJH+V?PQ>&aowpInkXi0yHhSt>XBLt9yQdsA?;{?|Hb zB4zZ{_1I_hk@Orq+oQ$0`y{TmioE#M#gG@V2SI3WbOYs3bS>q?9sh)yV+(gzdGF>4 zmChAa@qxB=0kQQ~xOJu1kz4`%ZeBlYH0;5s!*vCLR)ZKBW)u@CSjPy3Fls4d~; zKRo6fD1TNuw?>BcyVz}#C4$+h<*UE^nwOSkxtcDg?HU7pCXc2jfKWLhg;z zy9rNU_;AP#-c0LVlTvJo=2_OOxcUSqRfQ(QZUwf|M@ITOFTV|rh_J@05nN6gM_zVe z#qC{$Z*i_)@#cRUrPou^g+{GJr`v(nF}1le z*?846H5O4t4*abbv&KB}yqj7Wu4og@;X-SA*C%!bH7Ok{)#NYQ8Y2n^8hiWo@KP@m zv({VE#Wf#yC4`?G@o!>r26!3OoeZW{48WaIQ_|R1ep~kcc(>a^AuIck=hqxA#l&fW z{OI3ClYS3Wj4%!N$8k>cje6H(1V?Lm`pnF{6omxaqYu6$XdT34Bu?A?>918+(a3(N zV%j^DQ2Z^ul4Y7EBhKz*)Q8>s+PWQgV!K_HF?^-9sFb1QxD;(_F4McG>{4GbV4etu zPFC}&Ph)5xrFRQClo-TAn zoJZ4G6l+Xa;4-+~Ibe+H^5INwxBXFe+OblLHrMKjtmVq;S=c-MT%*q~(Qm39Pj8kL zJ5Xu4W0mU|*HRK#a4OZQ{#~I?AygOPL2{GI73%Gfyu*0bU7p+eHQZo!HRo>pqEJ}L zJ@s~dy8dr#)p>sH=}+?7Ad!kaje@5Ex^0y?D|;9)=NIG9DxNYs5XwPV(sJ`bp3GZw z0+BqN_k8X>b5dcr%+hDtzX=-8T5^0-h1Cje7(p|=Pxw)i$fI7X(5JB;l@)AN?O0v9 zx~w8F$KT{q*gM13ZI<^m^`_ZwB)-^^Q?swd$B>hv&uy@IGgIM5->k2$-GHyC_*+!N zUmkkGN{BRBew{ZH*tS!DQoqnsQHgO*{=eM}4Vbj{VDG8xfuN#;9aNRPUGeDltF-&C zOJD1sEq=HyHp}AP($}y3ee5l7cia{U-EJ0jInL{|o%Ph&(JQv3UKSCyjrl+A)q9!c zm7DI1KaTIavcKnZ>7?1&@r#mqKb`Mf%U$|CrTvhU%8Aog&R;DIuUY8yzIcXxOe>$? zs@J>IO?S?*PmQ>{E%AEnp6{7&Zv!XjY%Pqgty%f^T>VkobxSq|W%m__y?=XVs%~!o zs`J-Z?b;P4cRqTS$rGpEoZt6>Num#2vrJv>wEWypvHRLK_rAzf#x=`Dyjag#6S#R3 z->>bfuSm}<-g}<&*ZWp}lUI)gf6qSt^mJ0@tj`Vk8)p4}{^#5p|(+ITG=PZmF6 zwIy_Mdbd|dRoJvk%a6aDc5?OBdq10!_D+1x9(?TWt?$#@Cfk~@SA3~CU%LPa=c0QzFT{v zBqO6kAOC%SAg})Oja?>TtG$Ac6&tP1jV_$CU;gjrv^AgOzMZpwWiPfY^W-E~ulOlT zw@QC1J!2p0S`G5h=i7=-&x?L~=Cg{4mir|207(DO~yb>3&+ zxgTm)s-G>p_;ty%%9^FCKcw8snYU;1KHF^X&##u%uBg9ZW2t&|-lRQSewA`&&Qm%* zZ&#-No9r%|%Fj8y-%g&<{*a<#YU9_me8HA&t&c^1FTc8D2hZ2*?^omqyKrGwUnl3A6SLMyUESd3T-E=th*w!DClan(0)U~`r%2!vY+{^CVGb>;2tnBgHnEDxWbW=rM z?sMGtq5R_)NoRH!(;M%lfTeChFQ{$au?Cp3uv2iKpwoWM@eo(mTW z_FZ9ckOsG>85meBL7FI_cV2K12eyv0uL3V2+X87+1G_ii#-L<7pKK7YXT6}Ck-?!I z+>dGb^XHF)IB>n8pR+u$!42G}n@^zVA@GT)p@JDz~9!DR4s^>bP0l+XkK DA9*m5 literal 0 HcmV?d00001 diff --git a/doc/html/tutorial/lesson10.html b/doc/html/tutorial/lesson10.html new file mode 100644 index 00000000..3c84d999 --- /dev/null +++ b/doc/html/tutorial/lesson10.html @@ -0,0 +1,556 @@ + + + + TinyOS Tutorial Lesson 10: Platforms + + + + + +

    uW7S$v&w@ZcZAH{&uLFwo+Z` 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 z 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