]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Added isState(), improved atomic access
authorrincon <rincon>
Thu, 14 Jun 2007 01:10:59 +0000 (01:10 +0000)
committerrincon <rincon>
Thu, 14 Jun 2007 01:10:59 +0000 (01:10 +0000)
tos/interfaces/State.nc
tos/system/StateImplP.nc

index 0b5507f45db8b497e1a77d78aafbc2d63d89d428..bbf1f1c3c332ac5ba375592fb26f9a0c84454fb2 100644 (file)
@@ -1,68 +1,73 @@
-/*\r
- * Copyright (c) 2005-2006 Rincon Research Corporation\r
- * All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms, with or without\r
- * modification, are permitted provided that the following conditions\r
- * are met:\r
- * - Redistributions of source code must retain the above copyright\r
- *   notice, this list of conditions and the following disclaimer.\r
- * - Redistributions in binary form must reproduce the above copyright\r
- *   notice, this list of conditions and the following disclaimer in the\r
- *   documentation and/or other materials provided with the\r
- *   distribution.\r
- * - Neither the name of the Arch Rock Corporation nor the names of\r
- *   its contributors may be used to endorse or promote products derived\r
- *   from this software without specific prior written permission.\r
- *\r
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\r
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE\r
- * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\r
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
- * OF THE POSSIBILITY OF SUCH DAMAGE\r
- */\r
-\r
-\r
-/**\r
- * State machine interface\r
- * @author David Moss - dmm@rincon.com\r
- */\r
\r
-interface State {\r
-\r
-  /**\r
-   * This will allow a state change so long as the current\r
-   * state is S_IDLE.\r
-   * @return SUCCESS if the state is change, FAIL if it isn't\r
-   */\r
-  async command error_t requestState(uint8_t reqState);\r
-  \r
-  /**\r
-   * Force the state machine to go into a certain state,\r
-   * regardless of the current state it's in.\r
-   */\r
-  async command void forceState(uint8_t reqState);\r
-  \r
-  /**\r
-   * Set the current state back to S_IDLE\r
-   */\r
-  async command void toIdle();\r
-  \r
-  /**\r
-   * @return TRUE if the state machine is in S_IDLE\r
-   */\r
-  async command bool isIdle();\r
-  \r
-  /**\r
-   * Get the current state\r
-   */\r
-  async command uint8_t getState();\r
-\r
-}\r
+/*
+ * 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 Rincon Research 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
+ * RINCON RESEARCH 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();
+  
+  /**
+   * @return TRUE if the state machine is in the given state
+   */
+  async command bool isState(uint8_t myState);
+  
+  /**
+   * Get the current state
+   */
+  async command uint8_t getState();
+
+}
index a14ea79a79f4aaf148930c8346fcd83aa2e283d7..cfd5d5d47e23c018d9531a3b53069aaa195f0f52 100644 (file)
-/*\r
- * Copyright (c) 2005-2006 Rincon Research Corporation\r
- * All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms, with or without\r
- * modification, are permitted provided that the following conditions\r
- * are met:\r
- * - Redistributions of source code must retain the above copyright\r
- *   notice, this list of conditions and the following disclaimer.\r
- * - Redistributions in binary form must reproduce the above copyright\r
- *   notice, this list of conditions and the following disclaimer in the\r
- *   documentation and/or other materials provided with the\r
- *   distribution.\r
- * - Neither the name of the Arch Rock Corporation nor the names of\r
- *   its contributors may be used to endorse or promote products derived\r
- *   from this software without specific prior written permission.\r
- *\r
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\r
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE\r
- * ARCHED ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\r
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\r
- * OF THE POSSIBILITY OF SUCH DAMAGE\r
- */\r
-\r
-/**\r
- * This is a state controller for any and every component's\r
- * state machine(s).\r
- *\r
- * There are several compelling reasons to use the State module/interface\r
- * in all your components that have any kind of state associated with them:\r
- *\r
- *   1) It provides a unified interface to control any state, which makes\r
- *      it easy for everyone to understand your code\r
- *   2) You can easily keep track of multiple state machines in one component\r
- *   3) You could have one state machine control several components\r
- *\r
- * There are three ways to change a component's state:\r
- *  > Request a state change\r
- *     The state is only changed if the state is currently in S_IDLE.  If\r
- *     the state changes and access is grated, requestState returns SUCCESS.\r
- *\r
- *  > Force a state change\r
- *     The state changes no matter what\r
- * \r
- *  > toIdle()\r
- *     The state changes to S_IDLE, no matter what state the component is in.\r
- *\r
- * S_IDLE is the default state, and is always equal to 0.  Therefore,\r
- * setup the enums in your internal component so the IDLE/default state is\r
- * always 0.\r
- *\r
- * @author David Moss - dmm@rincon.com\r
- */\r
\r
-#include "State.h"\r
\r
-module StateImplP {\r
-  provides {\r
-       interface Init;\r
-    interface State[uint8_t id];\r
-  }\r
-}\r
-\r
-implementation {\r
-\r
-  /** Each component's state - uniqueCount("State") of them */\r
-  norace uint8_t state[uniqueCount(UQ_STATE)];\r
-  \r
-  enum {\r
-    S_IDLE = 0,\r
-  };\r
-\r
-  /***************** Init Commands ****************/\r
-  command error_t Init.init() {\r
-    int i;\r
-    for(i = 0; i < uniqueCount(UQ_STATE); i++) {\r
-      state[i] = S_IDLE;\r
-    }\r
-    return SUCCESS;\r
-  }\r
-  \r
-  \r
-  /***************** State Commands ****************/  \r
-  /**\r
-   * This will allow a state change so long as the current\r
-   * state is S_IDLE.\r
-   * @return SUCCESS if the state is change, FAIL if it isn't\r
-   */\r
-  async command error_t State.requestState[uint8_t id](uint8_t reqState) {\r
-    error_t returnVal = FAIL;\r
-    atomic {\r
-      if(reqState == S_IDLE || state[id] == S_IDLE) {\r
-        state[id] = reqState;\r
-        returnVal = SUCCESS;\r
-      }\r
-    }\r
-    return returnVal;\r
-  }\r
-  \r
-  /**\r
-   * Force the state machine to go into a certain state,\r
-   * regardless of the current state it's in.\r
-   */\r
-  async command void State.forceState[uint8_t id](uint8_t reqState) {\r
-    state[id] = reqState;\r
-  }\r
-    \r
-  /**\r
-   * Set the current state back to S_IDLE\r
-   */\r
-  async command void State.toIdle[uint8_t id]() {\r
-    state[id] = S_IDLE;\r
-  }\r
-  \r
-    \r
-  /**\r
-   * @return TRUE if the state machine is in S_IDLE\r
-   */\r
-  async command bool State.isIdle[uint8_t id]() {\r
-    return state[id] == S_IDLE;\r
-  }\r
-  \r
-  /**\r
-   * Get the current state\r
-   */\r
-  async command uint8_t State.getState[uint8_t id]() {\r
-    return state[id];\r
-  }\r
-  \r
-}\r
-\r
+/*
+ * 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 Rincon Research 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
+ * RINCON RESEARCH 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 */
+  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) {
+    atomic state[id] = reqState;
+  }
+    
+  /**
+   * Set the current state back to S_IDLE
+   */
+  async command void State.toIdle[uint8_t id]() {
+    atomic state[id] = S_IDLE;
+  }
+  
+    
+  /**
+   * @return TRUE if the state machine is in S_IDLE
+   */
+  async command bool State.isIdle[uint8_t id]() {
+    return call State.isState[id](S_IDLE);
+  }
+  
+  /**
+   * @return TRUE if the state machine is in the given state
+   */
+  async command bool State.isState[uint8_t id](uint8_t myState) {
+    bool isState;
+    atomic isState = (state[id] == myState);
+    return isState;
+  }
+  
+  
+  /**
+   * Get the current state
+   */
+  async command uint8_t State.getState[uint8_t id]() {
+    uint8_t theState;
+    atomic theState = state[id];
+    return theState;
+  }
+  
+}
+