- Main Page
- Related Pages
- Modules
- Data Structures
- Files

- File List
- Globals

# appled.c

Go to the documentation of this file.

    00001 /*********************************************************************************
    00002
    00003  Copyright 2006-2008 MakingThings
    00004
    00005  Licensed under the Apache License,
    00006  Version 2.0 (the "License"); you may not use this file except in compliance
    00007  with the License. You may obtain a copy of the License at
    00008
    00009  http://www.apache.org/licenses/LICENSE-2.0
    00010
    00011  Unless required by applicable law or agreed to in writing, software distributed
    00012  under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
    00013  CONDITIONS OF ANY KIND, either express or implied. See the License for
    00014  the specific language governing permissions and limitations under the License.
    00015
    00016 *********************************************************************************/
    00017
    00018 // MakingThings - Make Controller Kit - 2006
    00019
    00020 /** \file appled.c
    00021   MAKE Application Board LED control.
    00022   Library of functions for the Make Application Board's LED subsystem.
    00023 */
    00024
    00025 #include "io.h"
    00026 #include "appled.h"
    00027 #include "config.h"
    00028
    00029 #include "AT91SAM7X256.h"
    00030
    00031 #define APPLED_COUNT 4
    00032
    00033 #if ( APPBOARD_VERSION == 50 )
    00034   #define APPLED_0_IO IO_PB19
    00035   #define APPLED_1_IO IO_PB20
    00036   #define APPLED_2_IO IO_PB21
    00037   #define APPLED_3_IO IO_PB22
    00038 #endif
    00039 #if ( APPBOARD_VERSION == 90 )
    00040   #define APPLED_0_IO IO_PA10
    00041   #define APPLED_1_IO IO_PA11
    00042   #define APPLED_2_IO IO_PA13
    00043   #define APPLED_3_IO IO_PA15
    00044 #endif
    00045 #if ( APPBOARD_VERSION == 95 || APPBOARD_VERSION == 100 )
    00046   #define APPLED_0_IO IO_PA15
    00047   #define APPLED_1_IO IO_PA13
    00048   #define APPLED_2_IO IO_PA28
    00049   #define APPLED_3_IO IO_PA27
    00050 #endif
    00051
    00052 static int AppLed_GetIo( int index );
    00053 static int AppLed_Start( int index );
    00054 static int AppLed_Stop( int index );
    00055
    00056 static int AppLed_users[ APPLED_COUNT ];
    00057
    00058 /** \defgroup AppLed Application Board LEDs
    00059 * The Application Board LED subsystem controls the 4 LEDs on the Application Board, for status and program feedback.
    00060 * \ingroup Libraries
    00061 * @{
    00062 */
    00063
    00064 /**
    00065   Enable an LED in the AppLed subsystem.
    00066   @param index An integer specifying which LED (0-3).
    00067   @param state An integer specifying locked/active (1) or unlocked/inactive (0).
    00068   @return Zero on success.
    00069
    00070   \b Example
    00071   \code
    00072   // enable LED 0
    00073   AppLed_SetActive(0, 1);
    00074   \endcode
    00075 */
    00076 int AppLed_SetActive( int index, int state )
    00077 {
    00078   if ( index < 0 || index >= APPLED_COUNT )
    00079     return CONTROLLER_ERROR_ILLEGAL_INDEX;
    00080
    00081   if ( state )
    00082     return AppLed_Start( index );
    00083   else
    00084     return AppLed_Stop( index );
    00085 }
    00086
    00087 /**
    00088   Read whether an AppLed is enabled.
    00089   @param index An integer specifying which LED (0-3).
    00090   @return Zero if available, otherwise non-zero.
    00091
    00092   \b Example
    00093   \code
    00094   if(AppLed_GetActive(1))
    00095   {
    00096     // LED 1 is enabled
    00097   }
    00098   else
    00099   {
    00100     // LED 1 is not enabled
    00101   }
    00102   \endcode
    00103 */
    00104 int AppLed_GetActive( int index )
    00105 {
    00106   if ( index < 0 || index >= APPLED_COUNT )
    00107     return false;
    00108   return AppLed_users[ index ] > 0;
    00109 }
    00110
    00111 /**
    00112   Turn an LED on or off.
    00113   Sets whether the specified LED on the Application Board is on or off.
    00114   @param index an integer specifying which LED (0-3).
    00115   @param state an integer specifying on (1) or off (0).
    00116   @return Zero on success, otherwise error code.
    00117
    00118   \b Example
    00119   \code
    00120   // turn on LED 2
    00121   AppLed_SetState( 2, 1 );
    00122   \endcode
    00123 */
    00124 int AppLed_SetState( int index, int state )
    00125 {
    00126   if ( index < 0 || index >= APPLED_COUNT )
    00127     return CONTROLLER_ERROR_ILLEGAL_INDEX;
    00128
    00129   if ( AppLed_users[ index ] < 1 )
    00130   {
    00131     int status = AppLed_Start( index );
    00132     if ( status != CONTROLLER_OK )
    00133       return status;
    00134   }
    00135
    00136   int io = AppLed_GetIo( index );
    00137   // remember the LED's are tied to +3.3, so they're
    00138   // on when the output is off
    00139   if ( state )
    00140     Io_SetValue( io, false );
    00141   else
    00142     Io_SetValue( io, true );
    00143
    00144   return CONTROLLER_OK;
    00145 }
    00146
    00147 /**
    00148   Read whether an LED is on or off.
    00149   @param index An integer specifying which LED (0-3).
    00150   @return the LED state, or zero on error.
    00151
    00152   \b Example
    00153   \code
    00154   if(AppLed_GetState(2))
    00155   {
    00156     // LED 2 is currently on
    00157   }
    00158   else
    00159   {
    00160     // LED 2 is currently off
    00161   }
    00162   \endcode
    00163 */
    00164 int AppLed_GetState( int index )
    00165 {
    00166   if ( index < 0 || index >= APPLED_COUNT )
    00167     return 0;
    00168
    00169   if ( AppLed_users[ index ] < 1 )
    00170   {
    00171     int status = AppLed_Start( index );
    00172     if ( status != CONTROLLER_OK )
    00173       return status;
    00174   }
    00175
    00176   int io = AppLed_GetIo( index );
    00177   return Io_GetValue( io ) ? 0 : 1;
    00178 }
    00179
    00180 /** @}
    00181 */
    00182
    00183 int AppLed_Start( int index )
    00184 {
    00185   int status;
    00186
    00187   if ( AppLed_users[ index ]++ == 0 )
    00188   {
    00189     int io = AppLed_GetIo( index );
    00190
    00191     status = Io_Start( io, true );
    00192     if ( status != CONTROLLER_OK )
    00193     {
    00194       AppLed_users[ index ]--;
    00195       return CONTROLLER_ERROR_CANT_LOCK;
    00196     }
    00197
    00198     // Got it, now set the io up right
    00199     Io_SetPio( io, true );
    00200     Io_SetValue( io, true );
    00201     Io_SetDirection( io, IO_OUTPUT );
    00202   }
    00203
    00204   return CONTROLLER_OK;
    00205 }
    00206
    00207 int AppLed_Stop( int index )
    00208 {
    00209   if ( AppLed_users[ index ] < 1 )
    00210     return CONTROLLER_ERROR_TOO_MANY_STOPS;
    00211
    00212   if ( --AppLed_users[ index ] == 0 )
    00213   {
    00214     int io = AppLed_GetIo( index );
    00215     Io_Stop( io );
    00216   }
    00217   return CONTROLLER_OK;
    00218 }
    00219
    00220 int AppLed_GetIo( int index )
    00221 {
    00222   int io = -1;
    00223   switch ( index )
    00224   {
    00225     case 0:
    00226       io = APPLED_0_IO;
    00227       break;
    00228     case 1:
    00229       io = APPLED_1_IO;
    00230       break;
    00231     case 2:
    00232       io = APPLED_2_IO;
    00233       break;
    00234     case 3:
    00235       io = APPLED_3_IO;
    00236       break;
    00237   }
    00238   return io;
    00239 }
    00240
    00241 #ifdef OSC
    00242
    00243 /** \defgroup AppLEDOSC App LED - OSC
    00244   Control the Application Board's Status LEDs via OSC.
    00245   \ingroup OSC
    00246
    00247   \section devices Devices
    00248   There are 4 LEDs on the Make Application Board, numbered 0 - 3.
    00249
    00250   \section properties Properties
    00251   The LEDs have two properties:
    00252   - state
    00253   - active
    00254
    00255   \par State
    00256   The \b state property corresponds to the on/off state of a given LED.
    00257   For example, to turn on the first LED, send a message like
    00258   \verbatim /appled/0/state 1\endverbatim
    00259   To turn it off, send the message \verbatim /appled/0/state 0\endverbatim
    00260
    00261   \par Active
    00262   The \b active property corresponds to the active state of an LED.
    00263   If an LED is set to be active, no other tasks will be able to
    00264   write to it.  If you're not seeing appropriate
    00265   responses to your messages to the LED, check the whether it's
    00266   locked by sending a message like
    00267   \verbatim /appled/0/active \endverbatim
    00268   \par
    00269   You can set the active flag by sending
    00270   \verbatim /appled/0/active 1 \endverbatim
    00271 */
    00272
    00273 #include "osc.h"
    00274 #include "string.h"
    00275 #include "stdio.h"
    00276
    00277 // Need a list of property names
    00278 // MUST end in zero
    00279 static char* AppLedOsc_Name = "appled";
    00280 static char* AppLedOsc_PropertyNames[] = { "active", "state", 0 }; // must have a trailing 0
    00281
    00282 int AppLedOsc_PropertySet( int index, int property, int value );
    00283 int AppLedOsc_PropertyGet( int index, int property );
    00284
    00285 // Returns the name of the subsystem
    00286 const char* AppLedOsc_GetName( )
    00287 {
    00288   return AppLedOsc_Name;
    00289 }
    00290
    00291 // Now getting a message.  This is actually a part message, with the first
    00292 // part (the subsystem) already parsed off.
    00293 int AppLedOsc_ReceiveMessage( int channel, char* message, int length )
    00294 {
    00295   int status = Osc_IndexIntReceiverHelper( channel, message, length,
    00296                                            APPLED_COUNT, AppLedOsc_Name,
    00297                                            AppLedOsc_PropertySet, AppLedOsc_PropertyGet,
    00298                                            AppLedOsc_PropertyNames );
    00299
    00300   if ( status != CONTROLLER_OK )
    00301     return Osc_SendError( channel, AppLedOsc_Name, status );
    00302   return CONTROLLER_OK;
    00303 }
    00304
    00305 // Set the index LED, property with the value
    00306 int AppLedOsc_PropertySet( int index, int property, int value )
    00307 {
    00308   switch ( property )
    00309   {
    00310     case 0:
    00311       AppLed_SetActive( index, value );
    00312       break;
    00313     case 1:
    00314       AppLed_SetState( index, value );
    00315       break;
    00316   }
    00317   return CONTROLLER_OK;
    00318 }
    00319
    00320 // Get the index LED, property
    00321 int AppLedOsc_PropertyGet( int index, int property )
    00322 {
    00323   int value = 0;
    00324   switch ( property )
    00325   {
    00326     case 0:
    00327       value = AppLed_GetActive( index );
    00328       break;
    00329     case 1:
    00330       value = AppLed_GetState( index );
    00331       break;
    00332   }
    00333
    00334   return value;
    00335 }
    00336
    00337 #endif

The Make Controller Kit is an open source project maintained by MakingThings.
MakingThings code is released under the Apache 2.0 license.
Bug tracker, development wiki and status can be found at http://dev.makingthings.com.
This document was last updated on 18 May 2009.