Baseline for testing
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Tue Jul 12 2022 17:43:27 by 1.7.2