#define LaserOn SetSensorLight(S1); SetSensorType(S1, SENSOR_TYPE_LIGHT_ACTIVE); #define LaserOff SetSensorLight(S1); SetSensorType(S1, SENSOR_TYPE_LIGHT_INACTIVE); #define ScanMot OUT_A #define RotMot OUT_B #define LowSpeedInitial 20 #define HighSpeed 100 #define RotAngle 45 #define RotSpeed 30 #define LongPress 1000 #define repos 0 #define run 1 #define released 2 #define repressed 3 task main () { int LowSpeed = LowSpeedInitial; int btn, oldbtn=0; TextOut(0, LCD_LINE2, " Scan Speed"); TextOut(0, LCD_LINE8, "DN OK UP"); do { TextOut(0, LCD_LINE3, " "); NumOut(5*6, LCD_LINE3, LowSpeed); btn=0; if( ButtonPressed(BTNCENTER, false)) btn=BTNCENTER; if( ButtonPressed(BTNLEFT, false)) btn=BTNLEFT; if( ButtonPressed(BTNRIGHT, false)) btn=BTNRIGHT; if(btn != oldbtn) { oldbtn=btn; if(btn != 0) PlayToneEx(1000, 10, 2, false); switch (btn) { case BTNLEFT : LowSpeed -= 5; if(LowSpeed<5) LowSpeed = 5; break; case BTNRIGHT : LowSpeed += 5; if(LowSpeed>100) LowSpeed = 100; break; case BTNCENTER : break; default: } } } while (btn != BTNCENTER); while(ButtonPressed(BTNCENTER, false)); ClearScreen(); while(true) { oldbtn=0; long myTick; int mode=repos; do { TextOut(0, LCD_LINE8, "DN rot UP"); Coast(RotMot); LaserOn; btn=0; if( ButtonPressed(BTNCENTER, false)) btn=BTNCENTER; if( ButtonPressed(BTNLEFT, false)) btn=BTNLEFT; if( ButtonPressed(BTNRIGHT, false)) btn=BTNRIGHT; if(btn != oldbtn) { oldbtn=btn; if(btn != 0) PlayToneEx(1000, 10, 2, false); myTick=CurrentTick(); } switch (mode) { case repos : switch (btn) { case BTNLEFT : if((CurrentTick()-myTick) > LongPress) OnFwd(ScanMot, HighSpeed); else OnFwd(ScanMot, LowSpeed); mode = run; break; case BTNRIGHT : if((CurrentTick()-myTick) > LongPress) OnRev(ScanMot, HighSpeed); else OnRev(ScanMot, LowSpeed); mode = run; break; default: } break; case run : switch (btn) { case BTNLEFT : if((CurrentTick()-myTick) > LongPress) OnFwd(ScanMot, HighSpeed); else OnFwd(ScanMot, LowSpeed); break; case BTNRIGHT : if((CurrentTick()-myTick) > LongPress) OnRev(ScanMot, HighSpeed); else OnRev(ScanMot, LowSpeed); break; case BTNCENTER : break; default: mode = released; } break; case released : switch (btn) { case BTNLEFT : case BTNRIGHT : Off(ScanMot); mode = repressed; break; case BTNCENTER : break; default: } break; case repressed : switch (btn) { case 0 : mode = repos; break; default: } break; default : } } while (btn != BTNCENTER); Off(ScanMot); LaserOff; while(ButtonPressed(BTNCENTER, false)); do { TextOut(0, LCD_LINE8, "< scan >"); btn=0; if( ButtonPressed(BTNCENTER, false)) btn=BTNCENTER; if( ButtonPressed(BTNLEFT, false)) btn=BTNLEFT; if( ButtonPressed(BTNRIGHT, false)) btn=BTNRIGHT; if(btn != oldbtn) { oldbtn=btn; if(btn != 0) PlayToneEx(1000, 10, 2, false); } switch (btn) { case BTNLEFT : RotateMotorPID(RotMot, RotSpeed, RotAngle, 50, 40, 20); break; case BTNRIGHT : RotateMotorPID(RotMot, -RotSpeed, RotAngle, 50, 40, 20); break; case BTNCENTER : break; default: } } while (btn != BTNCENTER); while(ButtonPressed(BTNCENTER, false)); } }