My project requires 5 options to be selected each time it runs. This was a bit of a nuisance, especially when most of the time the same options were used.
So I rewrote the first part to display all the options at once; if these do not have to be changed then I only have to press the middle key.
To change an option, I turn the motor attached to port B to select the option(s) and the right key to change it. Middle key continues on to the rest of the program. Options are stored on an array as +1 or -1.
I put it here just in case anyone else finds it useful. If someone more competent than me can convert this into a re-usable subroutine then please let me know how.
Code: Select all
// Start global variable & constant definitions ------------------------------
string program = "Program #"; // Store the program name & version
long rotation_end_B; // Final reading of rotation counter Port B
long rotation_B; // For use in parameter selection
int MM_Index = 1; // Current line/ element
int MM_Bool[] = {-1,-1,-1,-1,-1,-1}; // Record of options
string MM_D1 = " "; // Blank for 9v relay
string MM_D2 = " "; // Blank for autofocus on
string MM_D3 = " "; // Blank for mirror lock on
string MM_D4 = " "; // Blank for exposure bracketing on
string MM_D5 = " "; // Blank for limited pano size on
string Pt = "<<"; // Selection marker
// End of global variable and constant declarations ===========================
task main ()
{
// Set basic parameters --------------------------------------------------
ClearScreen ();
PlayTone (3000,500);
Wait (500);
TextOut (1,LCD_LINE2,program);
TextOut (1,LCD_LINE3,"RIGHT KEY CHANGE");
TextOut (1,LCD_LINE4,"CENTRE KEY END");
TextOut (1,LCD_LINE5,"MOTOR B = UP/ DOWN");
TextOut (1,LCD_LINE7,"BATTERY ");
NumOut (64,LCD_LINE7,BatteryLevel());
Wait (1000);
while (ButtonPressed(BTNCENTER,true) == false) {} // End when centre button pressed
PlayTone (1000,500);
Wait (1000);
ResetRotationCount(OUT_B); // Reset counter on Port B
Wait (100); // Give sensor time to update
while (ButtonPressed(BTNCENTER,true) == false) // End when centre button pressed
{
ClearScreen ();
TextOut (1,LCD_LINE1,"< 9v RELAY"); TextOut (72,LCD_LINE1,MM_D1);
TextOut (1,LCD_LINE2,"AUTOFOCUS"); TextOut (72,LCD_LINE2,MM_D2);
TextOut (1,LCD_LINE3,"MIRROR LOCK"); TextOut (72,LCD_LINE3,MM_D3);
TextOut (1,LCD_LINE4,"BRACKETING"); TextOut (72,LCD_LINE4,MM_D4);
TextOut (1,LCD_LINE5,"LIMITED PANO"); TextOut (72,LCD_LINE5,MM_D5);
switch(MM_Index) // Set pointer location
{
case 1: TextOut (84,LCD_LINE1,Pt); break;
case 2: TextOut (84,LCD_LINE2,Pt); break;
case 3: TextOut (84,LCD_LINE3,Pt); break;
case 4: TextOut (84,LCD_LINE4,Pt); break;
case 5: TextOut (84,LCD_LINE5,Pt); break;
default: break;
}
if (ButtonPressed(BTNRIGHT,true) == true) // Right button pressed?
{
PlayTone (1000,500);
Wait (500);
MM_Bool[MM_Index] = MM_Bool[MM_Index] * -1 ; // Change sign
if (MM_Bool[1] < 0) {MM_D1 = " ";} else {MM_D1 = "+";}
if (MM_Bool[2] < 0) {MM_D2 = " ";} else {MM_D2 = "+";}
if (MM_Bool[3] < 0) {MM_D3 = " ";} else {MM_D3 = "+";}
if (MM_Bool[4] < 0) {MM_D4 = " ";} else {MM_D4 = "+";}
if (MM_Bool[5] < 0) {MM_D5 = " ";} else {MM_D5 = "+";}
}
rotation_B = MotorRotationCount(OUT_B); // Current reading Port B
Wait (100); // Give sensor time to update
ResetRotationCount(OUT_B); // Reset counter on Port B
Wait (100); // Give sensor time to update
if (abs(rotation_B) > 10) // Ignore small movements
{
if (rotation_B < 1) {MM_Index = MM_Index - 1;} // Decrement index
else {MM_Index = MM_Index + 1;} // Increment index
if (MM_Index < 1) {MM_Index = 5;} // Wrap to bottom
if (MM_Index > 5) {MM_Index = 1;} // Wrap to top
}
} // End of While loop
} // main task ended =======================================================