[Tinyos-beta-commits]
CVS: tinyos-1.x/beta/teps/txt tep110.txt, 1.1, 1.2
Martin Turon
mturon at users.sourceforge.net
Fri Sep 2 18:56:13 PDT 2005
Update of /cvsroot/tinyos/tinyos-1.x/beta/teps/txt
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18135
Modified Files:
tep110.txt
Log Message:
Initial version -- Power Management TEP110
Index: tep110.txt
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/teps/txt/tep110.txt,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** tep110.txt 13 Aug 2005 22:12:05 -0000 1.1
--- tep110.txt 3 Sep 2005 01:56:10 -0000 1.2
***************
*** 1,524 ****
! ============================
! Service Distributions
! ============================
!
! :TEP: 110
! :Group: Core Working Group
! :Type: Documentary
! :Status: Draft
! :TinyOS-Version: 2.x
! :Author: Philip Levis
!
! :Draft-Created: 20-Jun-2005
! :Draft-Version: $Revision$
! :Draft-Modified: $Date$
! :Draft-Discuss: TinyOS Developer List <tinyos-devel at mail.millennium.berkeley.edu>
!
! .. Note::
!
! This memo documents a part of TinyOS for the TinyOS Community, and
! requests discussion and suggestions for improvements. Distribution
! of this memo is unlimited. This memo is in full compliance with
! TEP 1.
!
! Abstract
! ====================================================================
!
! This memo describes the structure and implementation of TinyOS 2.x
! service distributions, collections of components designed to work
! as a cohesive whole for application builders. It documents one
! example distribution, OSKI.
!
! 1. Introduction
! ====================================================================
!
! The TinyOS component model allows flexible composition, but that
! flexibility is often limited by reasons which are not explicitly
! stated in components. These implicit assumptions can manifest as buggy
! behavior. In TinyOS 1.x, on the Telos platform, if a program
! simultaneously initializes non-volatile storage and the radio, one of
! them will fail: a program has to initialize them serially. They can
! also manifest as compile-time errors: if two separate communication
! services happen to receive packets of the same AM type, the nesC
! compiler will issue a warning due to the buffer swap semantics.
!
! On one hand, the flexbility components provide allows expert users to
! build complex and intricate applications. On the other, it can make
! managing complexity and intricacy very difficult when building very
! simple and basic applications. To promote this latter class of
! development, TinyOS 2.x has the notion of "distributions," which are
! collections of system abstractions that are designed to be used
! together. As long as a user implements an application in terms of the
! distribution, the underlying components will operate correctly and
! there will be no unforseen failures.
!
! This memo documents an example distribution, named OSKI (Operating
! System Key Interfaces). It describes the services OSKI provides and
! how their implementations are structured to simplify application
! writing.
!
!
! 2. Distributions
! ====================================================================
!
! A distribution presents *services* to the programmer. A service is a
! set of generic (instantiable) components that represent API
! abstractions. To use an abstraction, a programmer instantiates the
! generic. For example, OSKI has the ``AMSenderC`` abstraction for
! sending active messages. The AMSender generic component takes a single
! parameter, the AM type. For example, if a programmer wants a component
! named AppM to send active messages of type 32, the configuration would
! look something like this:
!
! | configuration AppC {}
! | implementation {
! | components AppM, new AMSenderC(32);
! | AppM.AMSend -> AMSenderC;
! | }
!
! Services often present abstractions at a fine grain. For example, the
! active message service has AMSender, AMReceiver, and AMSnooper, each
! of which is a separate abstraction.
!
! 2.1 Controlling a Service
! --------------------------------------------------------------------
!
! Every service has two abstractions: ``ServiceC``, for powering it on
! and off, and ``ServiceNotifierC``, for learning when the service's
! power state has changed. For example, active messages have the
! ``AMServiceC`` and ``AMServiceNotifierC`` abstractions. A service
! abstraction provides the ``Service`` interface
!
! | interface Service {
! | command void start();
! | command void stop();
! | command bool isRunning();
! | }
!
! while a notifier abstraction provides the ``ServiceNotify`` interface
!
! | interface ServiceNotify {
! | event void started();
! | event void stopped();
! | }
!
! For example, if a routing layer wants to be able to turn the active
! message layer on and off, then it needs to instantiate an AMServiceC.
! However, many components may be using active messages and have their
! own instances of AMServiceC; while routing might consider it
! acceptable to turn off active messages, other components might
! not. Therefore, a service abstraction does not necessarily represent
! explicit control; instead, each service has a *policy* for how it
! deals with control requests. When a service changes its activity
! state, it MUST signal all instances of its ServiceNotifierC.
!
! For example, the active messages service has an "OR" policy; the
! service remains active if *any* of its ServiceC instances are in the
! on state, and goes inactive if and only if *all* of its ServiceC
! instances are in the off state. This is an example timeline for
! active messages being used by two components, RouterA and RouterB:
!
! 1. System boots: active messages are off.
! 2. RouterA calls ``Service.start()``. The AM layer is turned on.
! 3. All AMServiceNotifierC abstractions signal ``ServiceNotify.started().``
! 4. RouterB calls ``Service.start()``.
! 5. RouterA calls ``Service.stop()``. RouterB is still using active messages, so the layer stays on.
! 6. RouterB calls ``Service.stop()``. The AM layer is turned off.
! 7. All AMServiceNotifierC abstractions signal ``ServiceNotify.stopped().``
!
! By default, a service that has a control interface MUST be off. For an
! application to use the service, at least one component has to call
! ``Service.start()``.
!
! 2.2 Service Initialization
! --------------------------------------------------------------------
!
! Because distributions are collections of services that are designed to
! work together, they can avoid many of the common issues that arise
! when composing TinyOS programs. For example, user code does not have
! to initialize a service; this is done automatically by the
! distribution. If a user component instantiates a service abstraction,
! the distribution MUST make sure that the service is properly
! initialized. Section 4 goes into an example implementation of how a
! distribution can achieve this.
!
!
! 3. OSKI Services
! ====================================================================
!
! This section briefly describes the services that OSKI, an example
! distribution provides. It is intended to give a feel for how a
! distribution presents its abstractions.
!
! 3.1 Timers
! --------------------------------------------------------------------
!
! OSKI provides timers at one fidelity: milliseconds. Timers do not have
! a Service abstraction, as their use implicitly defines whether the
! service is active or not (the timer service is off if there are no
! pending timers). The ``OSKITimerMsC`` component provides the
! abstraction: it provides a single interface, ``Timer<TMilli>``.
!
! This is an example code snippet for instantiating a timer in a
! configuration:
!
! | configuration ExampleC {
! | uses interface Timer<TMilli>;
! | }
! |
! | configuration TimerExample {}
! | implementation {
! | components ExampleC, new OSKITimerMsC() as T;
! | ExampleC.Timer -> T;
! | }
!
!
! 3.2 Active Messages
! --------------------------------------------------------------------
!
! OSKI provides four functional active messaging abstractions:
! ``AMSender``, ``AMReceiver``, ``AMSnooper``, and
! ``AMSnoopingReceiver``. Each one takes an ``am_id_t`` as a parameter,
! indicating the AM type. Following the general TinyOS 2.x approach to
! networking, all active message abstractions provide the ``Packet`` and
! ``AMPacket`` interfaces.
!
! AMSender
! This abstraction is for sending active messages. In addition to Packet
! and AMPacket, it provides the AMSend interface.
! AMReceiver
! This abstraction is for receiving active messages addressed to the
! node or to the broadcast address. In addition to Packet and AMPacket,
! it provides the Receive interface.
! AMSnooper
! This abstraction is for receiving active messages addressed to other
! nodes ("snooping" on traffic). In addition to Packet and AMPacket,
! it provides the Receive interface.
! AMSnoopingReceiver
! A union of the functionality of AMReceiver and AMSnooper, this
! abstraction allows a component to receive *all* active messages
! that it hears. The AMPacket interface allows a component to determine
! whether such a message is destined for it. In addition to
! Packet and AMPacket, this component provides the Receive interface.
!
! This snippet of code is an example of a configuration that composes a
! routing layer with needed active message abstractions. This
! implementation snoops on data packets sent by other nodes to improve
! its topology formation:
!
! | configuration RouterC {
! | uses interface AMSend as DataSend;
! | uses interface AMSend as ControlSend;
! | uses interface Receive as DataReceive;
! | uses interface Receive as BeaconReceive;
! | }
! |
! | configuration RoutingExample {
! | components RouterC;
! | components new AMSender(5) as CSender;
! | components new AMSender(6) as DSender;
! | components new AMReceiver(5) as CReceiver;
! | components new AMSnoopingReceiver(6) as DReceiver;
! |
! | RouterC.DataSend -> DSender;
! | RouterC.ControlSend -> CSender;
! | RouterC.DataReceive -> DReceiver;
! | RouterC.ControlReceive -> CReceiver;
! | }
!
! The active messages layer has control abstractions, named ``AMServiceC``
! and ``AMServiceNotifierC``. Active messages follow an OR policy.
!
!
! 3.3 Broadcasts
! --------------------------------------------------------------------
!
! In addition to active messages, OSKI provides a broadcasting service.
! Unlike active messages, which are addressed in terms of AM addresses,
! broadcasts are address-free. Broadcast communication has two
! abstractions: ``BroadcastSenderC`` and ``BroadcastReceiverC``, both of
! which take a parameter, a broadcast message type. This parameter is
! similar to the AM type in active messages. Both abstractions provide
! the Packet interface. The broadcast service has control abstractions,
! named ``BroadcastServiceC`` and ``BroadcastServiceNotifierC``, which
! follow an OR policy.
!
! 3.4 Tree Collection/Convergecast
! --------------------------------------------------------------------
!
! **NOTE: These services are not supported as of the 2.x prerelease.
! They will be supported by the first full release.*
!
! OSKI's third communication service is tree-based collection routing.
! This service has four abstractions:
!
! CollectionSenderC
! This abstraction is for sending packets up the collection tree,
! to the collection root. It provides the Send and Packet interfaces.
!
! CollectionReceiverC
! This abstraction is for a collection end-point (a tree root). It
! provides the Receive, Packet, and CollectionPacket interfaces.
!
! CollectionInterceptorC
! This abstraction represents a node's ability to view and possibly
! suppress packets it has received for forwarding. It provides
! the Intercept, CollectionPacket, and Packet interfaces.
!
! CollectionSnooperC
! This abstraction allows a node to overhear routing packets
! sent to other nodes to forward. It provides the Receive,
! CollectionPacket, and Packet interfaces.
!
! All of the collection routing communication abstractions take a
! parameter, similar to active messages and broadcasts, so multiple
! components can independelty use collection routing. In addition to
! communication, collection routing has an additional abstraction:
!
! CollectionControlC
! This abstraction controls whether a node is a collection root
! or not.
!
! Finally, collection routing has ``CollectionServiceC`` and
! ``CollectionServiceNotifierC`` abstractions, which follow an OR
! policy.
!
!
! 3.5 UART
! --------------------------------------------------------------------
!
! **NOTE: These services are not supported as of the 2.x prerelease.
! They will be supported by the first full release.
! They will be fully defined pending discussion/codification of
! UART interfaces.**
!
! 4. OSKI Service Structure and Design
! ====================================================================
!
! Presenting services through abstractions hides the underlying wiring
! details and gives a distribution a great deal of implementation
! freedom. One issue that arises, however, is initialization. If a user
! component instantiates a service, then a distribution MUST make sure
! the service is initialized properly. OSKI achieves this by
! encapsulating a complete service as a working component; abstractions
! export the service's interfaces.
!
! 4.1 Example: Timers
! --------------------------------------------------------------------
!
! For example, the timer service provides a single abstraction,
! OskiTimerMilliC, which is a generic component. OskiTimerMilliC provides a
! single instance of the Timer<TMilli> interface. It is implemented as a
! wrapper around the underlying timer service, a component named
! ``TimerMilliImplP``, which provides a parameterized interface and
! follows the Service Instance design pattern[sipattern]_:
!
! | generic configuration OskiTimerMilliC() {
! | provides interface Timer<TMilli>;
! | }
! | implementation {
! | components TimerMilliImplP;
! | Timer = TimerMilliImplP.TimerMilli[unique("TimerMilliC.TimerMilli")];
! | }
!
! TimerMilliImplP is a fully composed and working service. It takes
! a platform's timer implementation and makes sure it is initialized through
! the TinyOS boot sequence[boot]_:
!
! | configuration TimerMilliImplP {
! | provides interface Timer<TMilli> as TimerMilli[uint8_t id];
! | }
! | implementation {
! | components TimerMilliC, Main;
! | Main.SoftwareInit -> TimerMilliC;
! | TimerMilli = TimerMilliC;
! | }
!
! This composition means that if any component instantiates a timer,
! then TimerMilliImplP will be included in the component graph. If
! TimerMilliImplP is included, the TimerMilliP (the actual platform HIL
! implementation) will be properly initialized at system boot time. In
! this case, the order of initialization isn't important; in cases where
! there are services that have to be initialized in a particular
! sequence to ensure proper ordering, the Impl components can
! orchestrate that order. For example, a distribution can wire
! Main.SoftwareInit to a DistributionInit component, which calls
! sub-Inits in a certain order; when a service is included, it wires
! itself to one of the sub-Inits.
!
! The user does not have to worry about unique strings to manage the
! underlying Service Instance pattern: the abstractions take care of
! that.
!
!
! 4.2 Example: Active Messages
! --------------------------------------------------------------------
!
! Active messaging reprsent a slightly more complex service, as it has
! several abstractions and a control interface. However, it follows the
! same basic pattern: abstractions are generics that export wirings to
! the underlying service, named ``ActiveMessageImplP``:
!
! | configuration ActiveMessageImplP {
! | provides {
! | interface SplitControl;
! | interface AMSend[am_id_t id];
! | interface Receive[am_id_t id];
! | interface Receive as Snoop[am_id_t id];
! | interface Packet;
! | interface AMPacket;
! | }
! | }
! |
! | implementation {
! | components ActiveMessageC, Main;
! |
! | Main.SoftwareInit -> ActiveMessageC;
! |
! | SplitControl = ActiveMessageC;
! | AMSend = ActiveMessageC;
! | Receive = ActiveMessageC.Receive;
! | Snoop = ActiveMessageC.Snoop;
! | Packet = ActiveMessageC;
! | AMPacket = ActiveMessageC;
! | }
!
! For example, this is the AMSender abstraction:
!
! | generic configuration AMSenderC(am_id_t AMId) {
! | provides {
! | interface AMSend;
! | interface Packet;
! | interface AMPacket;
! | }
! | }
! |
! | implementation {
! | components ActiveMessageImplP as Impl;
! |
! | AMSend = Impl.AMSend[AMId];
! | Packet = Impl;
! | AMPacket = Impl;
! | }
!
! AMReceiver is similar, except that it wires to the Receive interface,
! while AMSnooper wires to the Snoop interface, and AMSnoopingReceiver
! provides a single Receive that exports both Snoop and Receive (the
! unidirectional nature of the Receive interface makes this simple to
! achieve, as it represents only fan-in and no fan-out).
!
! ActiveMessageImplP does not provide a Service interface; it provides
! the SplitControl interface of the underlying active message
! layer. OSKI layers a *ServiceController* on top of SplitControl. As
! the active message service follows an OR policy, OSKI uses a
! ``ServiceOrControllerM``, which is a generic component with the
! following signature:
!
! | generic module ServiceOrControllerM(char strID[]) {
! | provides {
! | interface Service[uint8_t id];
! | interface ServiceNotify;
! | }
! | uses {
! | interface SplitControl;
! | }
! | }
!
! ServiceOrControllerM follows the Service Instance pattern[sipattern];
! it calls its underlying SplitControl based on the state of each of its
! instances of the Service interface. The parameter denotes the string
! used to generate the unique service IDs. The active messages service
! controller implementation, AMServiceImplP, instantiates a
! ServiceOrControllerM, wires it to ActiveMessageImplP:
!
! | configuration AMServiceImplP {
! | provides interface Service[uint8_t id];
! | provides interface ServiceNotify;
! | }
! | implementation {
! | components ActiveMessageImplP;
! | components new ServiceOrControllerM("AMServiceImplP.Service");
! |
! | Service = ServiceOrControllerM;
! | ServiceOrControllerM.SplitControl -> ActiveMessageImplP;
! | ServiceNotify = ServiceOrControllerM;
! | }
!
! AMServiceC then provides an instance of AMServiceImplP.Service:
!
! | generic configuration AMServiceC() {
! | provides interface Service;
! | }
! |
! | implementation {
! | components AMServiceImplP;
! |
! | Service = AMServiceImplP.Service[unique("AMServiceImplP.Service")];
! |}
!
! Note that the two strings are the same, so that the uniqueCount() in
! the ServiceOrControllerM is correct based on the number of instances
! of AMServiceC. As with timers, encapsulating the service instance
! pattern in generic components relieves the programmer of having to
! deal with unique strings, a common source of bugs in TinyOS 1.x code.
!
!
! 4.3 OSKI Requirements
! --------------------------------------------------------------------
!
! OSKI is a layer on top of system components: it presents a more
! usable, less error-prone, and simpler interface to common TinyOS
! functionality. For OSKI to work properly, a platform MUST be compliant
! with the following TEPs:
!
! o TEP 102: Timers
! o TEP 106: Schedulers and Tasks
! o TEP 107: TinyOS 2.x Boot Sequence
! o TEP 1XX: Active Messages
! o TEP 1XX: Collection Routing
!
! Not following some of these TEPS MAY lead to OSKI services being
! inoperable, exhibit strange behavior, or being uncompilable.
!
! 5. Distribution Interfaces
! ====================================================================
!
! The basic notion of a distribution is that it provides a self-contained,
! tested, and complete (for an application domain) programming interface
! to TinyOS. Layers can be added on top of a distribution, but as a
! distribution is a self-contained set of abstractions, adding new
! services can lead to failures. A distribution represents a hard line
! above which all other code operates. One SHOULD NOT add new services,
! as they can disrupt the underlying organization. Of course, one MAY
! create a new distribution that extends an existing one, but this is
! in and of itself a new distribution.
!
! Generally, as distributions are intended to be higher-level abstractions,
! they SHOULD NOT provide any asynchronous (async) events. They can,
! of course, provide async commands. The idea is that no code written on
! top of a distribution should be asynchronous, due to the complexity
! introduced by having to manage concurrency. Distributions are usually
! platform independent; if an application needs async events, then
! chances are it is operating close to the hardware, and so is not
! platform independent.
!
! 6. Author's Address
! ====================================================================
!
! | Philip Levis
! | 467 Soda Hall
! | UC Berkeley
! | Berkeley, CA 94720
! |
! | phone - +1 510 290 5283
! |
! | email - pal at cs.berkeley.edu
!
! 7. Citations
! ====================================================================
!
! .. [rst] reStructuredText Markup Specification. <http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html>
!
! .. [sipattern] The Service Instance Pattern. In *Software Design Patterns for TinyOS.* David Gay, Philip Levis, and David Culler. Published in Proceedings of the ACM SIGPLAN/SIGBED 2005 Conference on Languages, Compilers, and Tools for Embedded Systems (LCTES'05).
!
! .. [boot] TEP 107: TinyOS 2.x Boot Sequence.
--- 1,209 ----
! ============================
! Power Management
! ============================
!
! :TEP: 110
! :Group: Core Working Group
! :Type: Documentary
! :Status: Draft
! :TinyOS-Version: 2.x
! :Author: Martin Turon, Robert Szewczyk
!
! :Draft-Created: 19-Apr-2005
! :Draft-Version: $Revision$
! :Draft-Modified: $Date$
! :Draft-Discuss: TinyOS Developer List <tinyos-devel at mail.millennium.berkeley.edu>
!
! .. Note::
!
! This memo documents a part of TinyOS for the TinyOS Community, and
! requests discussion and suggestions for improvements. Distribution
! of this memo is unlimited. This memo is in full compliance with
! TEP 1.
!
! Abstract
! ====================================================================
!
! This memo documents how power management is done in TinyOS, the
! general design principles followed by components that affect power,
! and interfaces by which a developer can influence the power state.
!
!
! 1. Introduction
! ====================================================================
!
! This document defines the various power management techniques available
! in TinyOS. There are three disctint levels that are addressed, each with
! their own considerations:
!
! * Microcontroller (including subsystems such as timers and adc)
! * Platform (flash, radio, and other peripheral chips)
! * Application (including specific sensors)
!
! It is likely there will be applications with specific concerns that cannot
! conform to this specification, but following as closely to its spirit as
! possible will simplify generic applications.
!
!
! 2. Background
! ====================================================================
!
! The original TinyOS power management is as powerful as it is simple.
! The philosophy is that once the task queue is empty, the processor
! will automatically go to sleep. At the component level, a StdControl
! interface is used to start or stop the use of power as required.
!
! * MCU (automatic)
! * Component (manual)
!
! None of these concepts are to go away. Rather, this proposal adds
! extensions to each area to better handle some common cases:
!
! * MCU -- a notification hook for the platform HAL to quickly
! set pin states accordingly during MCU sleep/wake.
!
! * Component -- a set of services to power up a component and
! automatically "spin down" during periods of
! inactivity.
!
!
! 3. HPL Sleep Notification
! ====================================================================
!
! Historically, TinyOS uses a section of "adjustPower" code to calculate
! the desired sleep mode of the processor depending on the current
! conditions such as ADC and Timer state.
!
! command HPLPwrMgr.adjustPower {
! // chips/CPU determines exact sleep mode
! if (external timers running) {
! mode = IDLE;
! } else if (radio running) {
! mode = IDLE;
! } else if (adc running) {
! mode = ADC_NR;
! } else {
! mode = POWER_SAVE;
! }
! sleep_state = mode;
! }
!
! This code is to use a proper HPL interface into the MCU and not directly
! call registers by punching through the HPL abstraction layer. As such,
! it must be called by a wired in component. This must happen in the
! scheduler:
!
! [scheduler]
! while (1) {
! <do tasks>
!
! atomic {
! signal HPLPwrMgr.sleep();
! __nesc_atomic_sleep();
! }
! signal HPLPwrMgr.wake();
! }
!
! The HPLPwrMgr.sleep event is in a critical timing path for sleeping the
! processor. It is crucial that this code be extremely efficient. The
! first job of the sleep() code is to run adjustPower only if necessary.
! This can be determined by a dirty flag in the power management state that
! subsytems are required to responsibly set if they are started or stopped.
!
! async atomic event HPLPwrMgr.sleep() {
! if (pwr_state.bits.dirty) {
! call HPLPwrMgr.adjustPower();
! }
! // set power down pin states
! }
!
!
! 4. Platform Pin State Management
! ====================================================================
!
! When a node goes to sleep, it assumes that all GPIO pins are in the proper
! state. A platform may want to intercept a signal when the node is powering
! down to properly insure that pins it is responsible for are set correctly.
! This is especially true for a platform subsystem such as external flash or
! a thermistor that draws contiuous power when its Pwr pin is set high. Such
! devices may have nominal power consumtion relative to the MCU, have minimal
! latency requirements, and are convenient to have available while running.
! For devices with these properties, it makes sense to quickly powered them
! down with a GPIO pin when the MCU goes to sleep.
!
! In this way, a platform can specify reasonable defaults for pin-setting in
! its implementation of the HPLPwrMgr.sleep event. Restoration of these
! pin settings are done in the HPLPwrMgr.wake event, and account for whether
! the device has been started or stopped by the application:
!
! async atomic HALFlashPwrMgr.sleep() {
! // this must be fast, responsible code: just flip one pin!
! call HPLFlashPwrPin.clr();
! }
!
! async HALFlashPwrMgr.wake() {
! if (flash_started) call HPLFlashPwrPin.set();
! }
!
! Note: for flash devices that use a bus command to set it into standby
! mode, this interface is not suggested. The HPLPwrMgr code path must be
! fast, is run in atomic context, and is reserved for simple pin management
! and sleep mode calculations.
!
!
! 5. Sensor Power Management
! ====================================================================
!
! Managing the power of individual devices in the system should be decoupled
! as much as possible from the MCU sleep. Modern processors can sleep and
! wake very quickly, and are on a different time scale from sensor devices
! which have warm up times and other latency requirements. This section
! attempts to address the concerns of simplifying sensor and device power
! management by specifying a set of general components that handle common
! application cases.
!
! An interesting example is to consider the following case: suppose you have a
! sensor that takes 2 seconds to warm up; its driver implements start, stop,
! and sampling methods correctly. The application samples the sensor
! periodically. Now, the power states of that sensor may look very different
! when you tell it to sample 10 times a second vs. 1 time per minute. How
! should this latency and sampling rate be embedded in the individual
! components? How should this be presented to the developer or network
! manager? This points to a set of basic power mgmt policy components
! that wrap the AcquireData interface with an internal timeout.
!
!
! 6. Application Services
! =====================================================================
!
! AutoPowerBasic
!
! An AutoPowerBasic component would provide the StdControl and AcquireData
! interfaces. If you stop the sensor, it will remain off. If you start it,
! it will only power on when you signal getData. The initial getData request
! will start up the sensor and internally manages warm up time latency.
! Subsequent getData requests reset the timeout. Finally, after a designated
! period of inactivity, the timeout timer fires and the sensor is put to sleep.
! The exact length of the timeout can be a generic component parameter and
! tuned by the sensor board driver developer to a reasonable default value.
!
! AutoPowerAdvanced
!
! Other wrapper components could provide a facility to preWarm() the sensor
! ahead of an actual getData request. An advanced interface would also
! allow an explicit ability to setTimeout() time. In addition, an advanced
! power management wrapper component may want to provide a getDataContinous
! style interface and power down immediately after the dataReady returns that
! a burst has ended.
!
!
! 7. Author's Address
! ====================================================================
!
! | Martin Turon
! | PO Box 8525
! | Berkeley, CA 94707
! |
! | phone - +1 408 965 3355
! | email - mturon at xbow.com
! |
More information about the Tinyos-beta-commits
mailing list