Baseline for testing

Committer:
foxbrianr
Date:
Thu Jul 25 00:43:08 2019 +0000
Revision:
0:b6d729ae4f27
Baseline for testing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
foxbrianr 0:b6d729ae4f27 1 #include "ButtonController.h"
foxbrianr 0:b6d729ae4f27 2
foxbrianr 0:b6d729ae4f27 3
foxbrianr 0:b6d729ae4f27 4 ButtonController::ButtonController(Navigator * navigator)
foxbrianr 0:b6d729ae4f27 5 {
foxbrianr 0:b6d729ae4f27 6
foxbrianr 0:b6d729ae4f27 7 spi_io_exp = new mcp23s08 (p5, p6, p7, p26, 0x20);
foxbrianr 0:b6d729ae4f27 8
foxbrianr 0:b6d729ae4f27 9 // set pin modes
foxbrianr 0:b6d729ae4f27 10 // ---------------------------------------
foxbrianr 0:b6d729ae4f27 11 spi_io_exp->gpioPinMode(0,0);
foxbrianr 0:b6d729ae4f27 12 spi_io_exp->gpioPinMode(1,0);
foxbrianr 0:b6d729ae4f27 13 spi_io_exp->gpioPinMode(2,0);
foxbrianr 0:b6d729ae4f27 14 spi_io_exp->gpioPinMode(3,0);
foxbrianr 0:b6d729ae4f27 15 spi_io_exp->gpioPinMode(4,0);
foxbrianr 0:b6d729ae4f27 16 spi_io_exp->gpioPinMode(5,1);
foxbrianr 0:b6d729ae4f27 17 spi_io_exp->gpioPinMode(6,1);
foxbrianr 0:b6d729ae4f27 18 spi_io_exp->gpioPinMode(7,1);
foxbrianr 0:b6d729ae4f27 19
foxbrianr 0:b6d729ae4f27 20 // enable the audio amplifier
foxbrianr 0:b6d729ae4f27 21 // ---------------------------------------
foxbrianr 0:b6d729ae4f27 22 spi_io_exp->gpioPinMode(5,1);
foxbrianr 0:b6d729ae4f27 23 spi_io_exp->gpioDigitalWrite(5,1);
foxbrianr 0:b6d729ae4f27 24 spi_io_exp->gpioDigitalWrite(6,0);
foxbrianr 0:b6d729ae4f27 25 spi_io_exp->gpioDigitalWrite(7,0);
foxbrianr 0:b6d729ae4f27 26
foxbrianr 0:b6d729ae4f27 27 this->navigator = navigator;
foxbrianr 0:b6d729ae4f27 28 }
foxbrianr 0:b6d729ae4f27 29
foxbrianr 0:b6d729ae4f27 30 ButtonController::~ButtonController()
foxbrianr 0:b6d729ae4f27 31 {
foxbrianr 0:b6d729ae4f27 32
foxbrianr 0:b6d729ae4f27 33 }
foxbrianr 0:b6d729ae4f27 34
foxbrianr 0:b6d729ae4f27 35 void ButtonController::init(void)
foxbrianr 0:b6d729ae4f27 36 {
foxbrianr 0:b6d729ae4f27 37
foxbrianr 0:b6d729ae4f27 38 }
foxbrianr 0:b6d729ae4f27 39
foxbrianr 0:b6d729ae4f27 40 void ButtonController::update(int currentValue, Menu * menu)
foxbrianr 0:b6d729ae4f27 41 {
foxbrianr 0:b6d729ae4f27 42 switch(currentValue)
foxbrianr 0:b6d729ae4f27 43 {
foxbrianr 0:b6d729ae4f27 44 case 1:
foxbrianr 0:b6d729ae4f27 45 menu->pressUp();
foxbrianr 0:b6d729ae4f27 46 break;
foxbrianr 0:b6d729ae4f27 47 case 2:
foxbrianr 0:b6d729ae4f27 48 menu->pressDown();
foxbrianr 0:b6d729ae4f27 49 break;
foxbrianr 0:b6d729ae4f27 50 case 3:
foxbrianr 0:b6d729ae4f27 51 menu->pressMode();
foxbrianr 0:b6d729ae4f27 52 break;
foxbrianr 0:b6d729ae4f27 53 case 4:
foxbrianr 0:b6d729ae4f27 54 menu->pressSet();
foxbrianr 0:b6d729ae4f27 55 break;
foxbrianr 0:b6d729ae4f27 56 case 5:
foxbrianr 0:b6d729ae4f27 57 break;
foxbrianr 0:b6d729ae4f27 58 default:
foxbrianr 0:b6d729ae4f27 59 /* no action */
foxbrianr 0:b6d729ae4f27 60 printf("!Button Pressed:%d\n\r",currentValue);
foxbrianr 0:b6d729ae4f27 61 break;
foxbrianr 0:b6d729ae4f27 62 };
foxbrianr 0:b6d729ae4f27 63 }
foxbrianr 0:b6d729ae4f27 64
foxbrianr 0:b6d729ae4f27 65 void ButtonController::update(Menu * menu)
foxbrianr 0:b6d729ae4f27 66 {
foxbrianr 0:b6d729ae4f27 67 int trigger_action = 0;
foxbrianr 0:b6d729ae4f27 68 currentValue = spi_io_exp->readGpioPort();
foxbrianr 0:b6d729ae4f27 69
foxbrianr 0:b6d729ae4f27 70 // if (raising edge | falling edge )
foxbrianr 0:b6d729ae4f27 71 if (currentValue != prevValue ) {
foxbrianr 0:b6d729ae4f27 72 prevValue = currentValue;
foxbrianr 0:b6d729ae4f27 73 countsSinceChange = 0;
foxbrianr 0:b6d729ae4f27 74 trigger_action = 1;
foxbrianr 0:b6d729ae4f27 75
foxbrianr 0:b6d729ae4f27 76 }
foxbrianr 0:b6d729ae4f27 77 else
foxbrianr 0:b6d729ae4f27 78 { //TODO: play with time for what is short or long hold
foxbrianr 0:b6d729ae4f27 79 countsSinceChange++;
foxbrianr 0:b6d729ae4f27 80 if ( currentValue != NO_BUTTON && countsSinceChange>=10000)
foxbrianr 0:b6d729ae4f27 81 {
foxbrianr 0:b6d729ae4f27 82 if (isHeld != 2) printf("Button Long Held:%d\n\r",currentValue);
foxbrianr 0:b6d729ae4f27 83 isHeld = 2;
foxbrianr 0:b6d729ae4f27 84 trigger_action = 1;
foxbrianr 0:b6d729ae4f27 85 }
foxbrianr 0:b6d729ae4f27 86 else if (currentValue != NO_BUTTON && countsSinceChange>=5000)
foxbrianr 0:b6d729ae4f27 87 {
foxbrianr 0:b6d729ae4f27 88 if (isHeld != 1) printf("Button Short Held:%d\n\r",currentValue);
foxbrianr 0:b6d729ae4f27 89 isHeld = 1;
foxbrianr 0:b6d729ae4f27 90 trigger_action = 1;
foxbrianr 0:b6d729ae4f27 91 countsSinceChange = 0;
foxbrianr 0:b6d729ae4f27 92 }
foxbrianr 0:b6d729ae4f27 93 else
foxbrianr 0:b6d729ae4f27 94 {
foxbrianr 0:b6d729ae4f27 95 isHeld =0;
foxbrianr 0:b6d729ae4f27 96 }
foxbrianr 0:b6d729ae4f27 97 }
foxbrianr 0:b6d729ae4f27 98
foxbrianr 0:b6d729ae4f27 99 if (trigger_action || isHeld){
foxbrianr 0:b6d729ae4f27 100 switch(currentValue)
foxbrianr 0:b6d729ae4f27 101 {
foxbrianr 0:b6d729ae4f27 102 case BUTTON_UP:
foxbrianr 0:b6d729ae4f27 103 menu->pressUp();
foxbrianr 0:b6d729ae4f27 104 break;
foxbrianr 0:b6d729ae4f27 105 case BUTTON_DOWN:
foxbrianr 0:b6d729ae4f27 106 menu->pressDown();
foxbrianr 0:b6d729ae4f27 107 break;
foxbrianr 0:b6d729ae4f27 108 case BUTTON_MODE:
foxbrianr 0:b6d729ae4f27 109 menu->pressMode();
foxbrianr 0:b6d729ae4f27 110 break;
foxbrianr 0:b6d729ae4f27 111 case BUTTON_SET:
foxbrianr 0:b6d729ae4f27 112 menu->pressSet();
foxbrianr 0:b6d729ae4f27 113 break;
foxbrianr 0:b6d729ae4f27 114 case BUTTON_CLEAR:
foxbrianr 0:b6d729ae4f27 115 break;
foxbrianr 0:b6d729ae4f27 116 case NO_BUTTON:
foxbrianr 0:b6d729ae4f27 117 break;
foxbrianr 0:b6d729ae4f27 118 default:
foxbrianr 0:b6d729ae4f27 119 break;
foxbrianr 0:b6d729ae4f27 120 }
foxbrianr 0:b6d729ae4f27 121 }
foxbrianr 0:b6d729ae4f27 122 }
foxbrianr 0:b6d729ae4f27 123
foxbrianr 0:b6d729ae4f27 124 uint8_t ButtonController::getCurrentState()
foxbrianr 0:b6d729ae4f27 125 {
foxbrianr 0:b6d729ae4f27 126 currentValue = spi_io_exp->readGpioPort();
foxbrianr 0:b6d729ae4f27 127
foxbrianr 0:b6d729ae4f27 128 return currentValue;
foxbrianr 0:b6d729ae4f27 129 }
foxbrianr 0:b6d729ae4f27 130
foxbrianr 0:b6d729ae4f27 131 void ButtonController::update(Navigator * navigator)
foxbrianr 0:b6d729ae4f27 132 {
foxbrianr 0:b6d729ae4f27 133 currentValue = spi_io_exp->readGpioPort();
foxbrianr 0:b6d729ae4f27 134
foxbrianr 0:b6d729ae4f27 135 // if (raising edge | falling edge )
foxbrianr 0:b6d729ae4f27 136 if (currentValue != prevValue ) {
foxbrianr 0:b6d729ae4f27 137 prevValue = currentValue;
foxbrianr 0:b6d729ae4f27 138 countsSinceChange = 0;
foxbrianr 0:b6d729ae4f27 139 switch(currentValue)
foxbrianr 0:b6d729ae4f27 140 {
foxbrianr 0:b6d729ae4f27 141 case BUTTON_UP:
foxbrianr 0:b6d729ae4f27 142 if(!cmd_queue.full()) cmd_queue.push(1);
foxbrianr 0:b6d729ae4f27 143 pressButtonUp();
foxbrianr 0:b6d729ae4f27 144 break;
foxbrianr 0:b6d729ae4f27 145 case BUTTON_DOWN:
foxbrianr 0:b6d729ae4f27 146 if(!cmd_queue.full()) cmd_queue.push(2);
foxbrianr 0:b6d729ae4f27 147 pressButtonDown();
foxbrianr 0:b6d729ae4f27 148 break;
foxbrianr 0:b6d729ae4f27 149 case BUTTON_MODE:
foxbrianr 0:b6d729ae4f27 150 if(!cmd_queue.full()) cmd_queue.push(3);
foxbrianr 0:b6d729ae4f27 151 pressButtonMode();
foxbrianr 0:b6d729ae4f27 152 break;
foxbrianr 0:b6d729ae4f27 153 case BUTTON_SET:
foxbrianr 0:b6d729ae4f27 154 if(!cmd_queue.full()) cmd_queue.push(4);
foxbrianr 0:b6d729ae4f27 155 pressButtonSet();
foxbrianr 0:b6d729ae4f27 156 break;
foxbrianr 0:b6d729ae4f27 157 case BUTTON_CLEAR:
foxbrianr 0:b6d729ae4f27 158 if(!cmd_queue.full()) cmd_queue.push(5);
foxbrianr 0:b6d729ae4f27 159 pressButtonClear();
foxbrianr 0:b6d729ae4f27 160 break;
foxbrianr 0:b6d729ae4f27 161 case NO_BUTTON:
foxbrianr 0:b6d729ae4f27 162 if(!cmd_queue.full()) cmd_queue.push(0);
foxbrianr 0:b6d729ae4f27 163 releaseButton();
foxbrianr 0:b6d729ae4f27 164 break;
foxbrianr 0:b6d729ae4f27 165 default:
foxbrianr 0:b6d729ae4f27 166 /* no action */
foxbrianr 0:b6d729ae4f27 167 printf("!!!Button Pressed:%d\n\r",currentValue);
foxbrianr 0:b6d729ae4f27 168 break;
foxbrianr 0:b6d729ae4f27 169 }
foxbrianr 0:b6d729ae4f27 170 }
foxbrianr 0:b6d729ae4f27 171 else
foxbrianr 0:b6d729ae4f27 172 { //TODO: play with time for what is short or long hold
foxbrianr 0:b6d729ae4f27 173 countsSinceChange++;
foxbrianr 0:b6d729ae4f27 174 if ( currentValue != NO_BUTTON && countsSinceChange>=100000)
foxbrianr 0:b6d729ae4f27 175 {
foxbrianr 0:b6d729ae4f27 176 if (isHeld != 2) printf("Button Long Held:%d\n\r",currentValue);
foxbrianr 0:b6d729ae4f27 177 isHeld = 2;
foxbrianr 0:b6d729ae4f27 178 }
foxbrianr 0:b6d729ae4f27 179 else if (currentValue != NO_BUTTON && countsSinceChange>=50000)
foxbrianr 0:b6d729ae4f27 180 {
foxbrianr 0:b6d729ae4f27 181 if (isHeld != 1) printf("Button Short Held:%d\n\r",currentValue);
foxbrianr 0:b6d729ae4f27 182 isHeld = 1;
foxbrianr 0:b6d729ae4f27 183 }
foxbrianr 0:b6d729ae4f27 184 else
foxbrianr 0:b6d729ae4f27 185 {
foxbrianr 0:b6d729ae4f27 186 isHeld =0;
foxbrianr 0:b6d729ae4f27 187 }
foxbrianr 0:b6d729ae4f27 188 }
foxbrianr 0:b6d729ae4f27 189
foxbrianr 0:b6d729ae4f27 190 }
foxbrianr 0:b6d729ae4f27 191
foxbrianr 0:b6d729ae4f27 192
foxbrianr 0:b6d729ae4f27 193
foxbrianr 0:b6d729ae4f27 194
foxbrianr 0:b6d729ae4f27 195 void ButtonController::update(void)
foxbrianr 0:b6d729ae4f27 196 {
foxbrianr 0:b6d729ae4f27 197 currentValue = spi_io_exp->readGpioPort() ;
foxbrianr 0:b6d729ae4f27 198 currentValue = (~currentValue & 0x1F); // clear bit is stuck
foxbrianr 0:b6d729ae4f27 199
foxbrianr 0:b6d729ae4f27 200 // if (raising edge | falling edge )
foxbrianr 0:b6d729ae4f27 201 if (currentValue != prevValue ) {
foxbrianr 0:b6d729ae4f27 202 prevValue = currentValue;
foxbrianr 0:b6d729ae4f27 203 countsSinceChange = 0;
foxbrianr 0:b6d729ae4f27 204
foxbrianr 0:b6d729ae4f27 205 if (currentValue && !cmd_queue.full()) {
foxbrianr 0:b6d729ae4f27 206 cmd_queue.push(currentValue);
foxbrianr 0:b6d729ae4f27 207 //printf("!!Button Pressed:%d\n\r",currentValue);
foxbrianr 0:b6d729ae4f27 208 }
foxbrianr 0:b6d729ae4f27 209
foxbrianr 0:b6d729ae4f27 210 }
foxbrianr 0:b6d729ae4f27 211 }
foxbrianr 0:b6d729ae4f27 212
foxbrianr 0:b6d729ae4f27 213
foxbrianr 0:b6d729ae4f27 214 void ButtonController::pressButtonUp(void)
foxbrianr 0:b6d729ae4f27 215 {
foxbrianr 0:b6d729ae4f27 216 printf("Up Button Pressed:%d\n\r",currentValue);
foxbrianr 0:b6d729ae4f27 217 if (navigator)
foxbrianr 0:b6d729ae4f27 218 navigator->moveUp();
foxbrianr 0:b6d729ae4f27 219 }
foxbrianr 0:b6d729ae4f27 220
foxbrianr 0:b6d729ae4f27 221 void ButtonController::pressButtonDown(void)
foxbrianr 0:b6d729ae4f27 222 {
foxbrianr 0:b6d729ae4f27 223 printf("Down Button Pressed:%d\n\r",currentValue);
foxbrianr 0:b6d729ae4f27 224 if (navigator)
foxbrianr 0:b6d729ae4f27 225 navigator->moveDown();
foxbrianr 0:b6d729ae4f27 226 }
foxbrianr 0:b6d729ae4f27 227
foxbrianr 0:b6d729ae4f27 228 void ButtonController::pressButtonSet(void)
foxbrianr 0:b6d729ae4f27 229 {
foxbrianr 0:b6d729ae4f27 230 printf("Set Button Pressed:%d\n\r",currentValue);
foxbrianr 0:b6d729ae4f27 231 if (navigator)
foxbrianr 0:b6d729ae4f27 232 navigator->selectMenu();
foxbrianr 0:b6d729ae4f27 233 }
foxbrianr 0:b6d729ae4f27 234
foxbrianr 0:b6d729ae4f27 235 void ButtonController::pressButtonMode(void)
foxbrianr 0:b6d729ae4f27 236 {
foxbrianr 0:b6d729ae4f27 237 printf("Mode Button Pressed:%d\n\r",currentValue);
foxbrianr 0:b6d729ae4f27 238 }
foxbrianr 0:b6d729ae4f27 239
foxbrianr 0:b6d729ae4f27 240 void ButtonController::pressButtonClear(void)
foxbrianr 0:b6d729ae4f27 241 {
foxbrianr 0:b6d729ae4f27 242 printf("Clear Button Pressed:%d\n\r",currentValue);
foxbrianr 0:b6d729ae4f27 243 }
foxbrianr 0:b6d729ae4f27 244
foxbrianr 0:b6d729ae4f27 245 void ButtonController::releaseButton(void)
foxbrianr 0:b6d729ae4f27 246 {
foxbrianr 0:b6d729ae4f27 247 //printf("Button Released:%d\n\r",currentValue);
foxbrianr 0:b6d729ae4f27 248 isHeld = 0;
foxbrianr 0:b6d729ae4f27 249 countsSinceChange = 0;
foxbrianr 0:b6d729ae4f27 250 }