BlinkingFaceLED.cc

Go to the documentation of this file.
00001 //
00002 // Copyright 2003 Sony Corporation 
00003 //
00004 // Permission to use, copy, modify, and redistribute this software for
00005 // non-commercial use is hereby granted.
00006 //
00007 // This software is provided "as is" without warranty of any kind,
00008 // either expressed or implied, including but not limited to the
00009 // implied warranties of fitness for a particular purpose.
00010 //
00011 
00012 #include <OPENR/OPENRAPI.h>
00013 #include <OPENR/OSyslog.h>
00014 #include <OPENR/core_macro.h>
00015 #include "BlinkingFaceLED.h"
00016 
00017 BlinkingFaceLED::BlinkingFaceLED() : blinkingLEDState(BFLS_IDLE)
00018 {
00019     for (int i = 0; i < NUM_LEDS; i++) ledID[i] = oprimitiveID_UNDEF;
00020     for (int i = 0; i < NUM_COMMAND_VECTOR; i++) region[i] = 0;
00021 }
00022 
00023 OStatus
00024 BlinkingFaceLED::DoInit(const OSystemEvent& event)
00025 {
00026     OSYSDEBUG(("BlinkingFaceLED::DoInit()\n"));
00027 
00028     NEW_ALL_SUBJECT_AND_OBSERVER;
00029     REGISTER_ALL_ENTRY;
00030     SET_ALL_READY_AND_NOTIFY_ENTRY;
00031 
00032     OpenPrimitives();
00033     NewCommandVectorData();
00034     OStatus st = OPENR::SetMotorPower(opowerON);
00035     OSYSDEBUG(("OPENR::SetMotorPower(opowerON) %d\n", st));
00036     
00037     return oSUCCESS;
00038 }
00039 
00040 OStatus
00041 BlinkingFaceLED::DoStart(const OSystemEvent& event)
00042 {
00043     OSYSDEBUG(("BlinkingFaceLED::DoStart()\n"));
00044 
00045     if (subject[sbjBlink]->IsReady() == true) {
00046         blinkingLEDState = BFLS_MODE_A_0to255;
00047         ModeA_0to255();
00048     } else {
00049         blinkingLEDState = BFLS_START;
00050     }
00051 
00052     ENABLE_ALL_SUBJECT;
00053     ASSERT_READY_TO_ALL_OBSERVER;
00054 
00055     return oSUCCESS;
00056 }
00057 
00058 OStatus
00059 BlinkingFaceLED::DoStop(const OSystemEvent& event)
00060 {
00061     OSYSDEBUG(("BlinkingFaceLED::DoStop()\n"));
00062 
00063     blinkingLEDState = BFLS_IDLE;
00064 
00065     DISABLE_ALL_SUBJECT;    
00066     DEASSERT_READY_TO_ALL_OBSERVER;
00067 
00068     return oSUCCESS;
00069 }
00070 
00071 OStatus
00072 BlinkingFaceLED::DoDestroy(const OSystemEvent& event)
00073 {
00074     DELETE_ALL_SUBJECT_AND_OBSERVER;
00075     return oSUCCESS;
00076 }
00077 
00078 void
00079 BlinkingFaceLED::Ready(const OReadyEvent& event)
00080 {
00081     OSYSDEBUG(("BlinkingFaceLED::Ready()\n"));
00082 
00083     if (blinkingLEDState == BFLS_IDLE) {
00084 
00085         OSYSDEBUG(("BFLS_IDLE\n"));
00086         ; // do nothing
00087 
00088     } else if (blinkingLEDState == BFLS_START) {
00089 
00090         OSYSDEBUG(("BFLS_START\n"));
00091         blinkingLEDState = BFLS_MODE_A_0to255;
00092         ModeA_0to255();
00093 
00094     } else if (blinkingLEDState == BFLS_MODE_A_0to255) {
00095 
00096         OSYSDEBUG(("BFLS_MODE_A_0to255\n"));
00097         LED3Result r = ModeA_0to255();
00098         if (r == LED3_FINISH) {
00099             blinkingLEDState = BFLS_MODE_A_255to0;
00100         }
00101 
00102     } else if (blinkingLEDState == BFLS_MODE_A_255to0) {
00103 
00104         OSYSDEBUG(("BFLS_MODE_A_255to0\n"));
00105         LED3Result r = ModeA_255to0();
00106         if (r == LED3_FINISH) {
00107             blinkingLEDState = BFLS_MODE_A_0;
00108         }
00109 
00110     } else if (blinkingLEDState == BFLS_MODE_A_0) {
00111 
00112         OSYSDEBUG(("BFLS_MODE_A_0\n"));
00113         LED3Result r = ModeA_0();
00114         if (r == LED3_FINISH) {
00115             blinkingLEDState = BFLS_MODE_B_0to255;
00116         }
00117         
00118     } else if (blinkingLEDState == BFLS_MODE_B_0to255) {
00119 
00120         OSYSDEBUG(("BFLS_MODE_B_0to255\n"));
00121         LED3Result r = ModeB_0to255();
00122         if (r == LED3_FINISH) {
00123             blinkingLEDState = BFLS_MODE_B_255to0;
00124         }
00125 
00126     } else if (blinkingLEDState == BFLS_MODE_B_255to0) {
00127 
00128         OSYSDEBUG(("BFLS_MODE_B_255to0\n"));
00129         LED3Result r = ModeB_255to0();
00130         if (r == LED3_FINISH) {
00131             blinkingLEDState = BFLS_MODE_B_0;
00132         }
00133 
00134     } else { // blinkingLEDState == BFLS_MODE_B_0
00135 
00136         OSYSDEBUG(("BFLS_MODE_B_0\n"));
00137         LED3Result r = ModeB_0();
00138         if (r == LED3_FINISH) {
00139             blinkingLEDState = BFLS_MODE_A_0to255;
00140         }
00141     }
00142 }
00143 
00144 void
00145 BlinkingFaceLED::OpenPrimitives()
00146 {
00147     for (int i = 0; i < NUM_LEDS; i++) {
00148         OStatus result = OPENR::OpenPrimitive(LED3_LOCATOR[i], &ledID[i]);
00149         if (result != oSUCCESS) {
00150             OSYSLOG1((osyslogERROR, "%s : %s %d",
00151                       "BlinkingFaceLED::OpenPrimitives()",
00152                       "OPENR::OpenPrimitive() FAILED", result));
00153         }
00154     }
00155 }
00156 
00157 void
00158 BlinkingFaceLED::NewCommandVectorData()
00159 {
00160     OStatus result;
00161     MemoryRegionID      cmdVecDataID;
00162     OCommandVectorData* cmdVecData;
00163 
00164     for (int i = 0; i < NUM_COMMAND_VECTOR; i++) {
00165 
00166         result = OPENR::NewCommandVectorData(NUM_LEDS, 
00167                                              &cmdVecDataID, &cmdVecData);
00168         if (result != oSUCCESS) {
00169             OSYSLOG1((osyslogERROR, "%s : %s %d",
00170                       "BlinkingFaceLED::NewCommandVectorData()",
00171                       "OPENR::NewCommandVectorData() FAILED", result));
00172         }
00173 
00174         region[i] = new RCRegion(cmdVecData->vectorInfo.memRegionID,
00175                                  cmdVecData->vectorInfo.offset,
00176                                  (void*)cmdVecData,
00177                                  cmdVecData->vectorInfo.totalSize);
00178 
00179         cmdVecData->SetNumData(NUM_LEDS);
00180 
00181         for (int j = 0; j < NUM_LEDS; j++) {
00182             OCommandInfo* info = cmdVecData->GetInfo(j);
00183             info->Set(odataLED_COMMAND3, ledID[j], ocommandMAX_FRAMES);
00184         }
00185     }
00186 }
00187 
00188 LED3Result
00189 BlinkingFaceLED::ModeA_0to255()
00190 {
00191     static int level = -1;
00192 
00193     if (level == -1) {
00194         level = 0;
00195         RCRegion* rgn = FindFreeRegion();
00196         SetLED3Value(rgn, level, POSITIVE_SLOPE, oled3_MODE_A);
00197         subject[sbjBlink]->SetData(rgn);
00198         level++;
00199     } 
00200 
00201     RCRegion* rgn = FindFreeRegion();
00202     SetLED3Value(rgn, level, POSITIVE_SLOPE, oled3_MODE_A);
00203     subject[sbjBlink]->SetData(rgn);
00204     subject[sbjBlink]->NotifyObservers();
00205     level++;
00206 
00207     if (level > MAX_LEVEL) {
00208         level = 0;
00209         return LED3_FINISH;
00210     } else {
00211         return LED3_CONT;
00212     }
00213 }
00214 
00215 LED3Result
00216 BlinkingFaceLED::ModeA_255to0()
00217 {
00218     static int level = MAX_LEVEL;
00219 
00220     RCRegion* rgn = FindFreeRegion();
00221     SetLED3Value(rgn, level, NEGATIVE_SLOPE, oled3_MODE_A);
00222     subject[sbjBlink]->SetData(rgn);
00223     subject[sbjBlink]->NotifyObservers();
00224     level--;
00225 
00226     if (level < 0) {
00227         level = MAX_LEVEL;
00228         return LED3_FINISH;
00229     } else {
00230         return LED3_CONT;
00231     }
00232 }
00233 
00234 LED3Result
00235 BlinkingFaceLED::ModeA_0()
00236 {
00237     static int level = 0;
00238 
00239     RCRegion* rgn = FindFreeRegion();
00240     SetLED3Value(rgn, 0, oled3_MODE_A);
00241     subject[sbjBlink]->SetData(rgn);
00242     subject[sbjBlink]->NotifyObservers();
00243     level++;
00244 
00245     if (level > MAX_LEVEL) {
00246         level = 0;
00247         return LED3_FINISH;
00248     } else {
00249         return LED3_CONT;
00250     }
00251 }
00252 
00253 LED3Result
00254 BlinkingFaceLED::ModeB_0to255()
00255 {
00256     static int level = 0;
00257     
00258     RCRegion* rgn = FindFreeRegion();
00259     SetLED3Value(rgn, level, POSITIVE_SLOPE, oled3_MODE_B);
00260     subject[sbjBlink]->SetData(rgn);
00261     subject[sbjBlink]->NotifyObservers();
00262     level++;
00263 
00264     if (level > MAX_LEVEL) {
00265         level = 0;
00266         return LED3_FINISH;
00267     } else {
00268         return LED3_CONT;
00269     }
00270 }
00271 
00272 LED3Result
00273 BlinkingFaceLED::ModeB_255to0()
00274 {
00275     static int level = MAX_LEVEL;
00276 
00277     RCRegion* rgn = FindFreeRegion();
00278     SetLED3Value(rgn, level, NEGATIVE_SLOPE, oled3_MODE_B);
00279     subject[sbjBlink]->SetData(rgn);
00280     subject[sbjBlink]->NotifyObservers();
00281     level--;
00282 
00283     if (level < 0) {
00284         level = MAX_LEVEL;
00285         return LED3_FINISH;
00286     } else {
00287         return LED3_CONT;
00288     }
00289 }
00290 
00291 LED3Result
00292 BlinkingFaceLED::ModeB_0()
00293 {
00294     static int level = 0;
00295 
00296     RCRegion* rgn = FindFreeRegion();
00297     SetLED3Value(rgn, 0, oled3_MODE_B);
00298     subject[sbjBlink]->SetData(rgn);
00299     subject[sbjBlink]->NotifyObservers();
00300     level++;
00301 
00302     if (level > MAX_LEVEL) {
00303         level = 0;
00304         return LED3_FINISH;
00305     } else {
00306         return LED3_CONT;
00307     }
00308 }
00309 
00310 void
00311 BlinkingFaceLED::SetLED3Value(RCRegion* rgn, 
00312                               int level, int slope, OLED3Mode mode)
00313 {
00314     OCommandVectorData* cmdVecData = (OCommandVectorData*)rgn->Base();
00315 
00316     for (int i = 0; i < NUM_LEDS; i++) {
00317         OCommandData* data = cmdVecData->GetData(i);
00318         OLEDCommandValue3* val = (OLEDCommandValue3*)data->value;
00319         for (int j = 0; j < ocommandMAX_FRAMES; j++) {
00320             if (slope == POSITIVE_SLOPE) {
00321                 val[j].intensity = 16 * level + j;
00322             } else {
00323                 val[j].intensity = 16 * level + 15 - j;
00324             }
00325             val[j].mode      = mode;
00326             val[j].period    = 1;
00327         }
00328     }
00329 }
00330 
00331 void
00332 BlinkingFaceLED::SetLED3Value(RCRegion* rgn, sword intensity, OLED3Mode mode)
00333 {
00334     OCommandVectorData* cmdVecData = (OCommandVectorData*)rgn->Base();
00335 
00336     for (int i = 0; i < NUM_LEDS; i++) {
00337         OCommandData* data = cmdVecData->GetData(i);
00338         OLEDCommandValue3* val = (OLEDCommandValue3*)data->value;
00339         for (int j = 0; j < ocommandMAX_FRAMES; j++) {
00340             val[j].intensity = intensity;
00341             val[j].mode      = mode;
00342             val[j].period    = 1;
00343         }
00344     }
00345 }
00346 
00347 RCRegion*
00348 BlinkingFaceLED::FindFreeRegion()
00349 {
00350     for (int i = 0; i < NUM_COMMAND_VECTOR; i++) {
00351         if (region[i]->NumberOfReference() == 1) return region[i];
00352     }
00353 
00354     return 0;
00355 }

Generated on Sun Dec 2 23:04:28 2007 for openSDK by  doxygen 1.3.9.1