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 /**************************************************************************//** 00002 * @file ButtonController.cpp 00003 * @brief Base class for wrapping the interface with the GPIO Extender. 00004 * @version: V1.0 00005 * @date: 9/17/2019 00006 00007 * 00008 * @note 00009 * Copyright (C) 2019 E3 Design. All rights reserved. 00010 * 00011 * @par 00012 * E3 Designers LLC is supplying this software for use with Cortex-M3 LPC1768 00013 * processor based microcontroller for the ESCM 2000 Monitor and Display. 00014 * * 00015 * @par 00016 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED 00017 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF 00018 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. 00019 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR 00020 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. 00021 * 00022 ******************************************************************************/ 00023 #include "ButtonController.h" 00024 00025 00026 /******************************************************************************/ 00027 ButtonController::ButtonController() 00028 { 00029 00030 spi_io_exp = new mcp23s08 (p5, p6, p7, p26, 0x20); 00031 00032 // --------------------------------------- 00033 // set pin modes 00034 // --------------------------------------- 00035 spi_io_exp->gpioPinMode(0,0); 00036 spi_io_exp->gpioPinMode(1,0); 00037 spi_io_exp->gpioPinMode(2,0); 00038 spi_io_exp->gpioPinMode(3,0); 00039 spi_io_exp->gpioPinMode(4,0); 00040 spi_io_exp->gpioPinMode(5,1); 00041 spi_io_exp->gpioPinMode(6,1); 00042 spi_io_exp->gpioPinMode(7,1); 00043 00044 // --------------------------------------- 00045 // enable the audio amplifier 00046 // --------------------------------------- 00047 spi_io_exp->gpioPinMode(5,1); 00048 spi_io_exp->gpioDigitalWrite(5,1); 00049 spi_io_exp->gpioDigitalWrite(6,0); 00050 spi_io_exp->gpioDigitalWrite(7,0); 00051 00052 } 00053 00054 /******************************************************************************/ 00055 ButtonController::~ButtonController() 00056 { 00057 00058 } 00059 00060 /******************************************************************************/ 00061 void ButtonController::init(void) 00062 { 00063 00064 } 00065 00066 /******************************************************************************/ 00067 void ButtonController::processCmdQueue(Menu * activeMenu) 00068 { 00069 while (!cmd_queue.empty()) { 00070 00071 uint8_t e; 00072 00073 cmd_queue.pop(e); 00074 00075 printf("\n<%02x>", e); 00076 00077 switch(e) { 00078 case 0x01://up 00079 activeMenu->pressUp(); 00080 break; 00081 00082 case 0x02://down 00083 activeMenu->pressDown(); 00084 break; 00085 00086 case 0x04://clear 00087 activeMenu->pressClear(); 00088 break; 00089 00090 case 0x08://mode 00091 activeMenu->pressMode(); 00092 break; 00093 00094 case 0x10://set 00095 activeMenu->pressSet(); 00096 break; 00097 default: 00098 break; 00099 } 00100 } 00101 } 00102 00103 00104 /******************************************************************************/ 00105 uint8_t ButtonController::getCurrentState() 00106 { 00107 currentValue = spi_io_exp->readGpioPort(); 00108 00109 return currentValue; 00110 } 00111 00112 00113 /******************************************************************************/ 00114 void ButtonController::update(void) 00115 { 00116 00117 int trigger_action = 0; 00118 00119 currentValue = spi_io_exp->readGpioPort() ; 00120 currentValue = (~currentValue & 0x1F); // clear bit is stuck 00121 00122 // if (raising edge | falling edge ) 00123 if (currentValue != prevValue ) { 00124 prevValue = currentValue; 00125 countsSinceChange = 0; 00126 trigger_action = 1; 00127 00128 } 00129 else 00130 { //TODO: play with time for what is short or long hold 00131 countsSinceChange++; 00132 if ( currentValue != NO_BUTTON && countsSinceChange>=10000) 00133 { 00134 if (isHeld != 2) printf("Button Long Held:%d\n\r",currentValue); 00135 isHeld = 2; 00136 trigger_action = 1; 00137 countsSinceChange = 0; 00138 } 00139 else if (currentValue != NO_BUTTON && countsSinceChange>=5000) 00140 { 00141 if (isHeld != 1) printf("Button Short Held:%d\n\r",currentValue); 00142 isHeld = 1; 00143 trigger_action = 1; 00144 countsSinceChange = 0; 00145 } 00146 else 00147 { 00148 isHeld =0; 00149 } 00150 } 00151 00152 00153 if (trigger_action) 00154 { 00155 if (currentValue && !cmd_queue.full()) { 00156 cmd_queue.push(currentValue); 00157 } 00158 trigger_action = 0; 00159 00160 } 00161 } 00162 00163 00164 /******************************************************************************/ 00165 void ButtonController::pressButtonUp(void) 00166 { 00167 printf("Up Button Pressed:%d\n\r",currentValue); 00168 } 00169 00170 /******************************************************************************/ 00171 void ButtonController::pressButtonDown(void) 00172 { 00173 printf("Down Button Pressed:%d\n\r",currentValue); 00174 } 00175 00176 /******************************************************************************/ 00177 void ButtonController::pressButtonSet(void) 00178 { 00179 printf("Set Button Pressed:%d\n\r",currentValue); 00180 } 00181 00182 /******************************************************************************/ 00183 void ButtonController::pressButtonMode(void) 00184 { 00185 printf("Mode Button Pressed:%d\n\r",currentValue); 00186 } 00187 00188 /******************************************************************************/ 00189 void ButtonController::pressButtonClear(void) 00190 { 00191 printf("Clear Button Pressed:%d\n\r",currentValue); 00192 } 00193 00194 /******************************************************************************/ 00195 void ButtonController::releaseButton(void) 00196 { 00197 //printf("Button Released:%d\n\r",currentValue); 00198 isHeld = 0; 00199 countsSinceChange = 0; 00200 } 00201 /******************************************************************************/
Generated on Wed Jul 20 2022 06:07:03 by
1.7.2