00001
00002
00003
00004
00005
00006
00007
00008
00009
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 ;
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 {
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 }