Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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