Baseline for testing

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ButtonController.cpp Source File

ButtonController.cpp

00001 #include "ButtonController.h"
00002 
00003 
00004 ButtonController::ButtonController(Navigator * navigator)
00005 {
00006     
00007     spi_io_exp = new mcp23s08 (p5, p6, p7, p26, 0x20);
00008     
00009     // set pin modes
00010     // ---------------------------------------
00011     spi_io_exp->gpioPinMode(0,0);
00012     spi_io_exp->gpioPinMode(1,0);
00013     spi_io_exp->gpioPinMode(2,0);
00014     spi_io_exp->gpioPinMode(3,0);
00015     spi_io_exp->gpioPinMode(4,0);
00016     spi_io_exp->gpioPinMode(5,1);
00017     spi_io_exp->gpioPinMode(6,1);
00018     spi_io_exp->gpioPinMode(7,1);
00019     
00020     // enable the audio amplifier
00021     // ---------------------------------------
00022     spi_io_exp->gpioPinMode(5,1);
00023     spi_io_exp->gpioDigitalWrite(5,1);
00024     spi_io_exp->gpioDigitalWrite(6,0);
00025     spi_io_exp->gpioDigitalWrite(7,0);
00026     
00027     this->navigator = navigator;
00028 }
00029 
00030 ButtonController::~ButtonController()
00031 {
00032     
00033 }
00034 
00035 void ButtonController::init(void)
00036 {
00037     
00038 }
00039 
00040 void ButtonController::update(int currentValue, Menu * menu)
00041 {
00042     switch(currentValue)
00043     {
00044         case 1:
00045             menu->pressUp();
00046             break;
00047         case 2:
00048             menu->pressDown();
00049             break;
00050         case 3:
00051             menu->pressMode();
00052             break;
00053         case 4:
00054             menu->pressSet();
00055             break;
00056         case 5:
00057             break;
00058         default:
00059             /* no action */
00060             printf("!Button Pressed:%d\n\r",currentValue);
00061             break;
00062     };
00063 }
00064 
00065 void ButtonController::update(Menu * menu)
00066 {
00067     int trigger_action = 0;
00068     currentValue = spi_io_exp->readGpioPort();
00069     
00070     // if (raising edge | falling edge )
00071     if (currentValue != prevValue ) {
00072         prevValue = currentValue;
00073         countsSinceChange = 0;
00074         trigger_action = 1;
00075 
00076     }
00077     else
00078     {   //TODO: play with time for what is short or long hold
00079         countsSinceChange++;
00080         if ( currentValue != NO_BUTTON && countsSinceChange>=10000)
00081         {
00082             if (isHeld != 2) printf("Button Long Held:%d\n\r",currentValue);
00083             isHeld = 2;
00084             trigger_action = 1;
00085         }
00086         else if (currentValue != NO_BUTTON && countsSinceChange>=5000)
00087         {
00088             if (isHeld != 1) printf("Button Short Held:%d\n\r",currentValue);
00089             isHeld = 1;
00090             trigger_action = 1;
00091             countsSinceChange = 0;
00092         }
00093         else
00094         {
00095             isHeld =0;
00096         }
00097     }
00098     
00099     if (trigger_action || isHeld){
00100         switch(currentValue)
00101         {
00102             case BUTTON_UP:
00103                 menu->pressUp();
00104                 break;
00105             case BUTTON_DOWN:
00106                 menu->pressDown();
00107                 break;
00108             case BUTTON_MODE:
00109                 menu->pressMode();
00110                 break;
00111             case BUTTON_SET:
00112                 menu->pressSet();
00113                 break;
00114             case BUTTON_CLEAR:
00115                 break;
00116             case NO_BUTTON:
00117                 break;
00118             default:
00119                 break;
00120         }
00121     }
00122 }
00123 
00124 uint8_t ButtonController::getCurrentState()
00125 {
00126     currentValue = spi_io_exp->readGpioPort();
00127     
00128     return currentValue;
00129 }
00130 
00131 void ButtonController::update(Navigator * navigator)
00132 {
00133     currentValue = spi_io_exp->readGpioPort();
00134     
00135     // if (raising edge | falling edge )
00136     if (currentValue != prevValue ) {
00137         prevValue = currentValue;
00138         countsSinceChange = 0;
00139         switch(currentValue)
00140         {
00141             case BUTTON_UP:
00142                 if(!cmd_queue.full())  cmd_queue.push(1);
00143                 pressButtonUp();
00144                 break;
00145             case BUTTON_DOWN:
00146                 if(!cmd_queue.full())  cmd_queue.push(2);
00147                 pressButtonDown();
00148                 break;
00149             case BUTTON_MODE:
00150                 if(!cmd_queue.full())  cmd_queue.push(3);
00151                 pressButtonMode();
00152                 break;
00153             case BUTTON_SET:
00154                 if(!cmd_queue.full())  cmd_queue.push(4);
00155                 pressButtonSet();
00156                 break;
00157             case BUTTON_CLEAR:
00158                 if(!cmd_queue.full())  cmd_queue.push(5);
00159                 pressButtonClear();
00160                 break;
00161             case NO_BUTTON:
00162                 if(!cmd_queue.full())  cmd_queue.push(0);
00163                 releaseButton();
00164                 break;
00165             default:
00166                 /* no action */
00167                 printf("!!!Button Pressed:%d\n\r",currentValue);
00168                 break;
00169         }
00170     }
00171     else
00172     {   //TODO: play with time for what is short or long hold
00173         countsSinceChange++;
00174         if ( currentValue != NO_BUTTON && countsSinceChange>=100000)
00175         {
00176             if (isHeld != 2) printf("Button Long Held:%d\n\r",currentValue);
00177             isHeld = 2;
00178         }
00179         else if (currentValue != NO_BUTTON && countsSinceChange>=50000)
00180         {
00181             if (isHeld != 1) printf("Button Short Held:%d\n\r",currentValue);
00182             isHeld = 1;
00183         }
00184         else
00185         {
00186             isHeld =0;
00187         }
00188     }
00189      
00190 }
00191 
00192 
00193 
00194 
00195 void ButtonController::update(void)
00196 {        
00197     currentValue = spi_io_exp->readGpioPort() ;
00198     currentValue = (~currentValue & 0x1F); // clear bit is stuck
00199     
00200     // if (raising edge | falling edge )
00201     if (currentValue != prevValue ) {
00202         prevValue = currentValue;
00203         countsSinceChange = 0;
00204         
00205         if (currentValue && !cmd_queue.full())  {
00206             cmd_queue.push(currentValue);
00207             //printf("!!Button Pressed:%d\n\r",currentValue);
00208         }
00209         
00210     }
00211 }
00212 
00213 
00214 void ButtonController::pressButtonUp(void)
00215 {
00216     printf("Up Button Pressed:%d\n\r",currentValue);
00217     if (navigator) 
00218         navigator->moveUp();
00219 }
00220 
00221 void ButtonController::pressButtonDown(void)
00222 {
00223     printf("Down Button Pressed:%d\n\r",currentValue);
00224     if (navigator) 
00225     navigator->moveDown();
00226 }
00227 
00228 void ButtonController::pressButtonSet(void)
00229 {
00230     printf("Set Button Pressed:%d\n\r",currentValue);
00231     if (navigator) 
00232         navigator->selectMenu();
00233 }
00234 
00235 void ButtonController::pressButtonMode(void)
00236 {
00237     printf("Mode Button Pressed:%d\n\r",currentValue);
00238 }
00239 
00240 void ButtonController::pressButtonClear(void)
00241 {
00242     printf("Clear Button Pressed:%d\n\r",currentValue);
00243 }
00244 
00245 void ButtonController::releaseButton(void)
00246 {
00247     //printf("Button Released:%d\n\r",currentValue);
00248     isHeld = 0;
00249     countsSinceChange = 0;
00250 }