123
Dependencies: WS2812 PixelArray DebounceIn
main.cpp
- Committer:
- turumputum
- Date:
- 2020-07-02
- Revision:
- 1:af17c65e86dc
- Parent:
- 0:ea88f8c194d2
File content as of revision 1:af17c65e86dc:
#include "mbed.h" #include "main.h" //#include "PixelArray.h" //#include "WS2812.h" //_____________Parametrs_______________ #define dogIdleCount 20000 #define verbose 1 #define LED_ON_BRIGHT 50 #define LED_BLINK_PERIOD 100 #define LedWaitK 0 #define LedOnK 50 #define blinkBright 50 //_____________Variebles_______________ uint8_t gameState; int report; int gameDog=0; int plasedSum = 0;//количество правильно положенных элементов int k; bool GameComplete=0; float tS,tM,tI; int sleepMode; int color_set(uint8_t red,uint8_t green, uint8_t blue) { return ((red<<16) + (green<<8) + blue); } //_________________________CLASSES___________________ LedGroupInside::LedGroupInside(PinName pin, int placeInTable, int size): __pa(size), __leds(pin, size, T0H, T0L, T1H, T1L) { __placeInTable = placeInTable; __size = size; //PixelArray __pa(size); //WS2812 __leds(pin, __size, T0H, T0L, T1H, T1L); } void LedGroupInside::light(int mode) { int R,G,B; switch (mode) { case LedWait: if(tableState[3][__placeInTable]!=LedWaitK) { if(tableState[3][__placeInTable]<LedWaitK) { tableState[3][__placeInTable]++; } else if (tableState[3][__placeInTable]>LedWaitK) { tableState[3][__placeInTable]--; } __pa.SetAll(color_set(0,0,0)); __leds.write(__pa.getBuf()); } break; case LedOn: if((tableState[3][__placeInTable]!=LedOnK)||(sleepMode==1)) { if(tableState[3][__placeInTable]<LedOnK) { tableState[3][__placeInTable]++; } else if (tableState[3][__placeInTable]>LedOnK) { tableState[3][__placeInTable]--; } int Bright = tableState[3][__placeInTable]; R=0; G=LED_ON_BRIGHT*Bright/100; B=0; if(sleepMode==0) { __pa.SetAll(color_set(R,G,B)); __leds.write(__pa.getBuf()); } else { __pa.SetAll(color_set(0,0,0)); __leds.write(__pa.getBuf()); } } break; case LedOff: __pa.SetAll(color_set(0,0,0)); __leds.write(__pa.getBuf()); break; case LedBlink: if((tableState[3][__placeInTable]!=LedOnK)||(sleepMode==1)) { if(tableState[3][__placeInTable]<LedOnK) { tableState[3][__placeInTable]++; } else if (tableState[3][__placeInTable]>LedOnK) { tableState[3][__placeInTable]--; } int Bright = tableState[3][__placeInTable]; R=LED_ON_BRIGHT*Bright/100; G=0; B=0; if(sleepMode==0) { __pa.SetAll(color_set(R,G,B)); __leds.write(__pa.getBuf()); } else { __pa.SetAll(color_set(0,0,0)); __leds.write(__pa.getBuf()); } } break; case LedRun: if(gameState!=idle) { if(tableState[3][__placeInTable]<LED_BLINK_PERIOD) { tableState[3][__placeInTable]++; } else { tableState[3][__placeInTable]=0; } float blinkVal=0; blinkVal =0.5 + sin((6.28/LED_BLINK_PERIOD)*tableState[3][__placeInTable])/2; //pc.printf("blinkVal %f \n", blinkVal); if(sleepMode==0) { __pa.SetAll(color_set(0,blinkBright*blinkVal,0)); __leds.write(__pa.getBuf()); } else { __pa.SetAll(color_set(0,0,0)); __leds.write(__pa.getBuf()); } } break; } } LedGroupStenka::LedGroupStenka(int placeInTable,int type, int sp1, int size1, int sp2, int size2) { __type=type; __sp1=sp1; __size1=size1; __sp2=sp2; __size2=size2; __placeInTable = placeInTable; //PixelArray __pa(size); //WS2812 __leds(pin, __size, T0H, T0L, T1H, T1L); } //______________________________________ void LedGroupStenka::light(int mode) { int R,G,B; switch (mode) { case LedWait://_______________________________________________________________________________________________________________________________ if(tableState[3][__placeInTable]!=LedWaitK) { if(tableState[3][__placeInTable]<LedWaitK) { tableState[3][__placeInTable]+=1; } else if (tableState[3][__placeInTable]>LedWaitK) { tableState[3][__placeInTable]-=1; } writeLed(__type,0,0,0); } break; case LedOn://_______________________________________________________________________________________________________________________________ if((tableState[3][__placeInTable]!=LedOnK)||(sleepMode==1)) { if(tableState[3][__placeInTable]<LedOnK) { tableState[3][__placeInTable]+=2; } else if (tableState[3][__placeInTable]>LedOnK) { tableState[3][__placeInTable]-=2; } int Bright = tableState[3][__placeInTable]; R=0; G=LED_ON_BRIGHT*Bright/100; B=0; if(sleepMode==0) { writeLed(__type,R,G,B); } else { writeLed(__type,0,0,0); } } break; case LedOff: writeLed(__type,0,0,0); break; case LedBlink://_____________________________________________________________________________________________________________ if((tableState[3][__placeInTable]!=LedOnK)||(sleepMode==1)) { if(tableState[3][__placeInTable]<LedOnK) { tableState[3][__placeInTable]+=2; } else if (tableState[3][__placeInTable]>LedOnK) { tableState[3][__placeInTable]-=2; } int Bright = tableState[3][__placeInTable]; R=LED_ON_BRIGHT*Bright/100; G=0; B=0; if(sleepMode==0) { writeLed(__type,R,G,B); } else { writeLed(__type,0,0,0); } } break; case LedRun://________________________________________________________________________________________________________________________________________ if(gameState!=idle) { if(tableState[3][__placeInTable]<LED_BLINK_PERIOD) { tableState[3][__placeInTable]++; } else { tableState[3][__placeInTable]=0; } float blinkVal=0; blinkVal = 0.5 + sin((6.28/LED_BLINK_PERIOD)*tableState[3][__placeInTable])/2; if(sleepMode==0) { writeLed(__type,0,blinkBright*blinkVal,0); } else { writeLed(__type,0,0,0); } //setStaticValToLed(__type,__sp1, __size1, __sp2, __size2, blinkBright*blinkVal,0,0); } break; } } void LedGroupStenka::writeLed(int type, uint8_t r, uint8_t g, uint8_t b) { //pc.printf("type: %d R %d G %d B %d \n",type,r,g,b); //pc.printf("__sp1: %d __size1 %d __sp2: %d __size2 %d \n",__sp1,__size1,__sp2, __size2); if(type==0) { //нормальная мембрана for(int t=__sp2; t<(__sp2+__size2); t++) { pa_stenkaLed_2.Set(numOfLed_stenkaLed_2-t-1,color_set(r,g,b)); } for(int t=__sp1; t<(__sp1+__size1); t++) { pa_stenkaLed_3.Set(t,color_set(r,g,b)); } //stenkaLed_2.write(pa_stenkaLed_2.getBuf()); //stenkaLed_3.write(pa_stenkaLed_3.getBuf()); } else if(type==1) { //нормальная стенка //if(gameState!=bio) { for(int t=__sp2; t<(__sp2+__size2); t++) { pa_stenkaLed_2.Set(numOfLed_stenkaLed_2-t-1,color_set(r,g,b)); } //stenkaLed_2.write(pa_stenkaLed_2.getBuf()); //} for(int t=__sp1; t<(__sp1+__size1); t++) { pa_stenkaLed_1.Set(numOfLed_stenkaLed_1-t-1,color_set(r,g,b)); } //stenkaLed_1.write(pa_stenkaLed_1.getBuf()); } else if(type==2) { //нулевой угол мембраны for(int t=__sp2; t<(__sp2+__size2); t++) { if(t>8) { pa_stenkaLed_2.Set(t-9,color_set(r,g,b)); } else { pa_stenkaLed_2.Set(numOfLed_stenkaLed_2-t-1,color_set(r,g,b)); } } //stenkaLed_2.write(pa_stenkaLed_2.getBuf()); for(int t=__sp1; t<(__sp1+__size1); t++) { if(t>8) { pa_stenkaLed_3.Set(t-8+124,color_set(r,g,b)); } else { pa_stenkaLed_3.Set(t,color_set(r,g,b)); } } //stenkaLed_3.write(pa_stenkaLed_3.getBuf()); } else if(type==3) { if(gameState!=bio) { //нулевой угол стенки for(int t=__sp2; t<(__sp2+__size2); t++) { if(t>8) { pa_stenkaLed_2.Set(t-9,color_set(r,g,b)); } else { pa_stenkaLed_2.Set(numOfLed_stenkaLed_2-t-1,color_set(r,g,b)); } } //stenkaLed_2.write(pa_stenkaLed_2.getBuf()); } for(int t=__sp1; t<(__sp1+__size1); t++) { if(t>8) { pa_stenkaLed_1.Set(t-9-1,color_set(r,g,b)); } else { pa_stenkaLed_1.Set(numOfLed_stenkaLed_1-t-1,color_set(r,g,b)); } } //stenkaLed_1.write(pa_stenkaLed_1.getBuf()); } } //________________________REPORT_______________________ void stateReport() { int i; pc.printf("\n"); pc.printf("tableState: \n"); pc.printf("Game mode: %d\n", gameState); pc.printf("WatchDog ticker: %d\n",gameDog); pc.printf("GameCimplete: %d , PlasedSum: %d To complete: %d\n", GameComplete,plasedSum, gameRule[gameState][33]); pc.printf("Time in led light tS: %f tM: %f tI: %f \n", tS,tM,tI); pc.printf(" num of pos:\t"); i=0; for(int b=0; b<30; b++) { pc.printf("%d,\t",tableState[i][b]); } pc.printf("\n"); pc.printf(" sensor state:\t"); i=1; for(int b=0; b<30; b++) { pc.printf("%d,\t",tableState[i][b]); } pc.printf("\n"); pc.printf(" led effect:\t"); i=2; for(int b=0; b<30; b++) { pc.printf("%d,\t",tableState[i][b]); } pc.printf("\n"); pc.printf("effect progress:\t"); i=3; for(int b=0; b<30; b++) { pc.printf("%d,\t",tableState[i][b]); } pc.printf("\n"); } //______________________BUTTON_______________________ void workButton() { if (gameState==idle) { gameDog=0; if(Button_4) { gameState=rasta; if(verbose) { pc.printf("Game mode chenged to: rasta\n"); } setLedRule(gameState); buttonLight(0,0,1); } if(Button_2) { gameState=bio; if(verbose) { pc.printf("Game mode chenged to: bio\n"); } setLedRule(gameState); buttonLight(1,0,0); } if(Button_3) { gameState=bacterium; if(verbose) { pc.printf("Game mode chenged to: bacterium\n"); } setLedRule(gameState); buttonLight(0,1,0); } } else if (((gameState==rasta)||(gameState==bio)||(gameState==bacterium))&&(plasedSum==0)) { if((Button_1)) { gameState=idle; if(verbose) { pc.printf("Game mode chenged to: idle gameDog: %d \n", gameDog); } setLedRule(gameState); buttonLight(1,1,1); //stateReport(); gameDog=0; } } if(gameDog>dogIdleCount) { sleepMode=1; } else { if(sleepMode==1) { sleepMode=0; setLedRule(gameState); } } if(plasedSum==0) { int R=(gameRule[idle][30] ); int G=(gameRule[idle][31]); int B=(gameRule[idle][32]); pa_ButtonLed_1.SetAll(color_set(R,G,B)); ButtonLed_1.write(pa_ButtonLed_1.getBuf()); } else { pa_ButtonLed_1.SetAll(color_set(0,0,0)); ButtonLed_1.write(pa_ButtonLed_1.getBuf()); } } void buttonLight(int b2, int b3, int b4) { int R=(gameRule[bio][30])*b2; int G=(gameRule[bio][31])*b2; int B=(gameRule[bio][32])*b2; pa_ButtonLed_2.SetAll(color_set(R,G,B)); ButtonLed_2.write(pa_ButtonLed_2.getBuf()); R=(gameRule[bacterium][30])*b3; G=(gameRule[bacterium][31])*b3; B=(gameRule[bacterium][32])*b3; pa_ButtonLed_3.SetAll(color_set(R,G,B)); ButtonLed_3.write(pa_ButtonLed_3.getBuf()); R=(gameRule[rasta][30])*b4; G=(gameRule[rasta][31])*b4; B=(gameRule[rasta][32])*b4; pa_ButtonLed_4.SetAll(color_set(R,G,B)); ButtonLed_4.write(pa_ButtonLed_4.getBuf()); } void chekRules() { plasedSum = 0; for(int r=0; r<30; r++) { if (tableState[1][r]==1) { //элемент на месте if(gameRule[gameState][r]==1) { //проверяем должен ли он там лежать по правилам plasedSum++; if(GameComplete) { //элемент на месте должен там быть, и конец игры if(tableState[2][r]!=LedRun) { tableState[2][r]=LedRun; tableState[3][r]=0; gameDog=0; } } else if(tableState[2][r]!=LedOn) { //элемент на месте должен там быть, но еще не все собрали tableState[2][r]=LedOn; tableState[3][r]=0; gameDog=0; } } else { //элемент на месте но его там не должно быть plasedSum--; if((tableState[2][r]!=LedBlink)&&(tableState[2][r]!=LedRun)) { tableState[2][r]=LedBlink; tableState[3][r]=0; gameDog=0; } } } else if((gameRule[gameState][r]==1) && (tableState[1][r]!=1)) { //если элемента нет но должен tableState[2][r]=LedWait; //plasedSum--; } else { tableState[2][r]=LedWait; if(GameComplete) { //элемент нет на месте и не должен там быть, и конец игры tableState[2][r]=LedOff; //выкл tableState[3][r]=0; } } } if(gameState==idle) { for(int r=0; r<30; r++) { tableState[2][r]=LedOff; tableState[3][r]=0; } } if(gameRule[gameState][33]==plasedSum) { //проверяем конец игры GameComplete=1; // перводим все диоды в бегущий режим gameDog+=20; } else { GameComplete=0; } } //________________________MAIN__________________________ int main() { pc.baud(115200); pc.printf("Hello \n"); if (verbose) { pc.printf("Verbose mode \n"); } else { pc.printf("nonVerbose mode \n"); } Button_1.mode(PullDown); Button_2.mode(PullDown); Button_3.mode(PullDown); Button_4.mode(PullDown); if (verbose) { pc.printf("Button configured \n"); } //startUp_Led(); gameState=idle; buttonLight(1,1,1); setLedRule(gameState); Ticker t; t.attach(&stateReport,1); while (true) { workButton(); chekRules(); lightLeds(); gameDog++; //wait(0.1); } } //_____________________LED___Functions__________________________ void setLedRule(int mode) { for(int r=0; r<30; r++) { // перводим все диоды в соответвующий режим режим //if (gameRule[mode][r]==1) { tableState[2][r]=LedWait; //tableState[3][r]=0; /*} else { tableState[2][r]=LedOff; tableState[3][r]=0; } */ } } void lightLeds() { //Timer t; //t.start(); stenkaLed_y1.light(tableState[2][0]); stenkaLed_s2.light(tableState[2][1]); stenkaLed_s3.light(tableState[2][2]); stenkaLed_y4.light(tableState[2][3]); stenkaLed_s5.light(tableState[2][4]); stenkaLed_y6.light(tableState[2][5]); stenkaLed_s7.light(tableState[2][6]); stenkaLed_s8.light(tableState[2][7]); stenkaLed_y9.light(tableState[2][8]); stenkaLed_s10.light(tableState[2][9]); membLed_y1.light(tableState[2][10]); membLed_s2.light(tableState[2][11]); membLed_s3.light(tableState[2][12]); membLed_y4.light(tableState[2][13]); membLed_s5.light(tableState[2][14]); membLed_y6.light(tableState[2][15]); membLed_s7.light(tableState[2][16]); membLed_s8.light(tableState[2][17]); membLed_y9.light(tableState[2][18]); membLed_s10.light(tableState[2][19]); //if(gameState!=bio) { stenkaLed_1.write(pa_stenkaLed_1.getBuf()); //} stenkaLed_2.write(pa_stenkaLed_2.getBuf()); stenkaLed_3.write(pa_stenkaLed_3.getBuf()); yadroLed.light(tableState[2][20]); mitohondriyaLed.light(tableState[2][21]); endoplazmaLed.light(tableState[2][22]); plastidaLed.light(tableState[2][23]); vacuolLed.light(tableState[2][24]); lizosomaLed.light(tableState[2][25]); goldgiLed.light(tableState[2][26]); centorLed.light(tableState[2][27]); ribosomaLed.light(tableState[2][28]); nucleoidLed.light(tableState[2][29]); //tI=t.read(); //t.stop(); } void fadeEffect() { for(int t=0; t<100; t++) { yadroLed.light(LedOff); mitohondriyaLed.light(LedOff); endoplazmaLed.light(LedOff); plastidaLed.light(LedOff); vacuolLed.light(LedOff); lizosomaLed.light(LedOff); goldgiLed.light(LedOff); centorLed.light(LedOff); ribosomaLed.light(LedOff); nucleoidLed.light(LedOff); } } void writeStenksLeds() { stenkaLed_1.write(pa_stenkaLed_1.getBuf()); stenkaLed_2.write(pa_stenkaLed_2.getBuf()); stenkaLed_3.write(pa_stenkaLed_3.getBuf()); } void startUp_Led() { int tt=50; gameState=bio; for(int q=0; q<tt; q++) { stenkaLed_y1.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { membLed_y1.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { stenkaLed_s2.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { membLed_s2.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { stenkaLed_s3.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { membLed_s3.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { stenkaLed_y4.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { membLed_y4.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { stenkaLed_s5.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { membLed_s5.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { stenkaLed_y6.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { membLed_y6.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { stenkaLed_s7.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { membLed_s7.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { stenkaLed_s8.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { membLed_s8.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { stenkaLed_y9.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { membLed_y9.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { stenkaLed_s10.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { membLed_s10.light(LedBlink); writeStenksLeds(); } for(int q=0; q<tt; q++) { yadroLed.light(LedBlink); } for(int q=0; q<tt; q++) { mitohondriyaLed.light(LedBlink); } for(int q=0; q<tt; q++) { endoplazmaLed.light(LedBlink); } for(int q=0; q<tt; q++) { plastidaLed.light(LedBlink); } for(int q=0; q<tt; q++) { vacuolLed.light(LedBlink); } for(int q=0; q<tt; q++) { lizosomaLed.light(LedBlink); } for(int q=0; q<tt; q++) { goldgiLed.light(LedBlink); } for(int q=0; q<tt; q++) { centorLed.light(LedBlink); } for(int q=0; q<tt; q++) { ribosomaLed.light(LedBlink); } for(int q=0; q<tt; q++) { nucleoidLed.light(LedBlink); } }