From 7bad66db1c1caddeeea5a1eb3c25730cf7abf706 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 11 Oct 2019 19:44:06 +0200 Subject: [PATCH] Latest libopenui updates --- radio/src/gui/colorlcd/draw_functions.cpp | 21 +- radio/src/gui/colorlcd/draw_functions.h | 9 +- radio/src/gui/colorlcd/model_gvars.cpp | 29 +- radio/src/gui/colorlcd/model_gvars.h | 2 +- radio/src/gui/colorlcd/radio_version.cpp | 4 +- radio/src/gui/colorlcd/special_functions.cpp | 2 +- radio/src/gui/colorlcd/themes/flysky.cpp | 5 +- radio/src/gui/gui_common.h | 10 - radio/src/simu.cpp | 26 +- radio/src/stubs.cpp | 5 - radio/src/targets/nv14/touch_driver.cpp | 549 +++++++++---------- radio/src/thirdparty/libopenui | 2 +- radio/src/touch.h | 24 +- 13 files changed, 331 insertions(+), 357 deletions(-) diff --git a/radio/src/gui/colorlcd/draw_functions.cpp b/radio/src/gui/colorlcd/draw_functions.cpp index 45c542dbb..060a4496a 100644 --- a/radio/src/gui/colorlcd/draw_functions.cpp +++ b/radio/src/gui/colorlcd/draw_functions.cpp @@ -20,19 +20,22 @@ #include "opentx.h" +coord_t drawStringWithIndex(BitmapBuffer * dc, coord_t x, coord_t y, const char * str, int idx, LcdFlags flags, const char * prefix, const char * suffix) +{ + char s[64]; + char * tmp = (prefix ? strAppend(s, prefix) : s); + tmp = strAppend(tmp, str); + tmp = strAppendUnsigned(tmp, abs(idx)); + if (suffix) + strAppend(tmp, suffix); + return dc->drawText(x, y, s, flags); +} + void drawStatusText(BitmapBuffer * dc, const char * text) { dc->drawText(MENUS_MARGIN_LEFT, MENU_FOOTER_TOP, text, TEXT_STATUSBAR_COLOR); } -void drawColumnHeader(BitmapBuffer * dc, const char * const * headers, const char * const * descriptions, uint8_t index) -{ - dc->drawText(LCD_W-MENUS_MARGIN_LEFT, MENU_TITLE_TOP + 2, headers[index], RIGHT | SMLSIZE | MENU_COLOR); - if (descriptions) { - drawStatusText(dc, descriptions[index]); - } -} - void drawVerticalScrollbar(BitmapBuffer * dc, coord_t x, coord_t y, coord_t h, uint16_t offset, uint16_t count, uint8_t visible) { if (visible < count) { @@ -277,7 +280,7 @@ void drawModelName(BitmapBuffer * dc, coord_t x, coord_t y, char * name, uint8_t uint8_t len = sizeof(g_model.header.name); while (len>0 && !name[len-1]) --len; if (len==0) { - drawStringWithIndex(x, y, STR_MODEL, id+1, att|LEADING0); + drawStringWithIndex(dc, x, y, STR_MODEL, id+1, att|LEADING0); } else { dc->drawSizedText(x, y, name, sizeof(g_model.header.name), att); diff --git a/radio/src/gui/colorlcd/draw_functions.h b/radio/src/gui/colorlcd/draw_functions.h index 2c71ab2cb..fc1eaa236 100644 --- a/radio/src/gui/colorlcd/draw_functions.h +++ b/radio/src/gui/colorlcd/draw_functions.h @@ -40,25 +40,20 @@ #define OPTION_SLIDER_NUMBER_BUTTON 0x100 #define OPTION_SLIDER_SQUARE_BUTTON 0x200 -//void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags, const char * prefix, const char * suffix); -//void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att); -//int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags attr, event_t event, IsValueAvailable isValueAvailable=nullptr); -//uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, LcdFlags attr, event_t event); -//swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event); +coord_t drawStringWithIndex(BitmapBuffer * dc, coord_t x, coord_t y, const char * str, int idx, LcdFlags flags = 0, const char * prefix = nullptr, const char * suffix = nullptr); void drawFatalErrorScreen(const char * message); void runFatalErrorScreen(const char * message); void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att); -//void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags); void drawSource(BitmapBuffer * dc, coord_t x, coord_t y, mixsrc_t idx, LcdFlags flags=0); void drawSwitch(BitmapBuffer * dc, coord_t x, coord_t y, int32_t idx, LcdFlags flags=0); void drawTrimMode(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags flags = 0); +void drawCurveRef(BitmapBuffer * dc, coord_t x, coord_t y, const CurveRef & curve, LcdFlags flags = 0); #if defined(FLIGHT_MODES) void drawFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att); #endif void drawStatusText(BitmapBuffer * dc, const char * text); -void drawColumnHeader(BitmapBuffer * dc, const char * const * headers, const char * const * descriptions, uint8_t index); void drawVerticalScrollbar(BitmapBuffer * dc, coord_t x, coord_t y, coord_t h, uint16_t offset, uint16_t count, uint8_t visible); void drawProgressScreen(BitmapBuffer * dc, const char * title, const char * message, int num, int den); void drawTrimSquare(BitmapBuffer * dc, coord_t x, coord_t y); diff --git a/radio/src/gui/colorlcd/model_gvars.cpp b/radio/src/gui/colorlcd/model_gvars.cpp index b9f149851..9cc8cb04e 100644 --- a/radio/src/gui/colorlcd/model_gvars.cpp +++ b/radio/src/gui/colorlcd/model_gvars.cpp @@ -131,16 +131,17 @@ void GVarRenderer::paint(BitmapBuffer * dc) lastFlightMode = getFlightMode(); FlightModeData * fmData = &g_model.flightModeData[lastFlightMode]; lastGVar = fmData->gvars[index]; - drawStringWithIndex(0, FIELD_PADDING_TOP, TR_GV, index + 1, MENU_COLOR); + coord_t x = drawStringWithIndex(dc, 0, FIELD_PADDING_TOP, STR_GV, index + 1, MENU_COLOR, nullptr, "="); if (lastGVar > GVAR_MAX) { uint8_t fm = lastGVar - GVAR_MAX - 1; - if (fm >= lastFlightMode) fm++; + if (fm >= lastFlightMode) + fm++; char label[16]; getFlightModeString(label, fm + 1); - dc->drawSizedText(GVAR_NAME_SIZE, FIELD_PADDING_TOP, label, strlen(label), MENU_COLOR); + dc->drawSizedText(x, FIELD_PADDING_TOP, label, strlen(label), MENU_COLOR); } else { - drawGVarValue(dc, GVAR_NAME_SIZE, FIELD_PADDING_TOP, index, lastGVar, MENU_COLOR); + drawGVarValue(dc, x, FIELD_PADDING_TOP, index, lastGVar, MENU_COLOR); } } @@ -206,8 +207,10 @@ void GVarEditWindow::setProperties(int onlyForFlightMode) } FlightModeData * fmData; for (int fm = 0; fm < MAX_FLIGHT_MODES; fm++) { - if (onlyForFlightMode >= 0 && fm != onlyForFlightMode) continue; - if (!values[fm]) continue; + if (onlyForFlightMode >= 0 && fm != onlyForFlightMode) + continue; + if (!values[fm]) + continue; fmData = &g_model.flightModeData[fm]; // custom value @@ -221,10 +224,11 @@ void GVarEditWindow::setProperties(int onlyForFlightMode) values[fm]->setMax(GVAR_MAX + MAX_FLIGHT_MODES - 1); values[fm]->setDisplayHandler([=](BitmapBuffer * dc, LcdFlags flags, int32_t value) { uint8_t targetFlightMode = value - GVAR_MAX - 1; - if (targetFlightMode >= fm) targetFlightMode++; + if (targetFlightMode >= fm) + targetFlightMode++; char label[16]; getFlightModeString(label, targetFlightMode + 1); - dc->drawSizedText(2, 2, label, strlen(label), flags); + dc->drawSizedText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, label, strlen(label), flags); }); } @@ -304,13 +308,14 @@ void GVarEditWindow::buildBody(FormWindow * window) } new StaticText(window, grid.getLabelSlot(), flightModeName); if (flightMode > 0) { - CheckBox * cb = new CheckBox(window, grid.getFieldSlot(2, 0), - [=] { return fmData->gvars[index] <= GVAR_MAX; }, [=](uint8_t checked) { - if (!values[flightMode]) return; + auto cb = new CheckBox(window, grid.getFieldSlot(2, 0), + [=] { return fmData->gvars[index] <= GVAR_MAX; }, [=](uint8_t checked) { + if (!values[flightMode]) + return; fmData->gvars[index] = checked ? 0 : GVAR_MAX + 1; setProperties(flightMode); }); - //TODO cb->setLabel(STR_OWN); + cb->setLabel(STR_OWN); } values[flightMode] = new NumberEdit(window, grid.getFieldSlot(2, 1), GVAR_MIN + gvar->min, GVAR_MAX + MAX_FLIGHT_MODES - 1, GET_SET_DEFAULT(fmData->gvars[index])); diff --git a/radio/src/gui/colorlcd/model_gvars.h b/radio/src/gui/colorlcd/model_gvars.h index 13f12a622..484c765a6 100644 --- a/radio/src/gui/colorlcd/model_gvars.h +++ b/radio/src/gui/colorlcd/model_gvars.h @@ -48,7 +48,7 @@ class ModelGVarsPage : public PageTab { class GVarRenderer : public Window { public: - GVarRenderer(Window* window, rect_t rect, uint8_t gvarIndex) : + GVarRenderer(Window * window, rect_t rect, uint8_t gvarIndex) : Window(window, rect), index(gvarIndex) { diff --git a/radio/src/gui/colorlcd/radio_version.cpp b/radio/src/gui/colorlcd/radio_version.cpp index f44c3b2f0..642e2a322 100644 --- a/radio/src/gui/colorlcd/radio_version.cpp +++ b/radio/src/gui/colorlcd/radio_version.cpp @@ -39,7 +39,7 @@ class OptionsText : public StaticText { } }; - virtual void paint(BitmapBuffer * dc) override + void paint(BitmapBuffer * dc) override { coord_t y = 0; lcdNextPos = 0; @@ -47,7 +47,7 @@ class OptionsText : public StaticText { const char * option = options[i]; coord_t optionWidth = getTextWidth(option); - if((lcdNextPos + 5 + optionWidth) > width()) { + if (lcdNextPos + 5 + optionWidth > width()) { dc->drawText(lcdNextPos, y, ","); lcdNextPos = 0; y += FH; diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 843a71769..47637aee0 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -338,7 +338,7 @@ class SpecialFunctionButton : public Button { break; case FUNC_SET_TIMER: - drawStringWithIndex(col1, line2, STR_TIMER, CFN_TIMER_INDEX(cfn) + 1, 0); + drawStringWithIndex(dc, col1, line2, STR_TIMER, CFN_TIMER_INDEX(cfn) + 1, 0); break; case FUNC_SET_FAILSAFE: diff --git a/radio/src/gui/colorlcd/themes/flysky.cpp b/radio/src/gui/colorlcd/themes/flysky.cpp index 754c06ae6..5dca10aec 100644 --- a/radio/src/gui/colorlcd/themes/flysky.cpp +++ b/radio/src/gui/colorlcd/themes/flysky.cpp @@ -46,8 +46,8 @@ class FlyskyTheme: public ThemeBase lcdColorTable[FOCUS_BGCOLOR_INDEX] = RED; lcdColorTable[TEXT_STATUSBAR_COLOR_INDEX] = WHITE; lcdColorTable[LINE_COLOR_INDEX] = GREY; - lcdColorTable[CHECKBOX_COLOR_INDEX] = RED; - lcdColorTable[MENU_BGCOLOR_INDEX] = DARKGREY; + lcdColorTable[CHECKBOX_COLOR_INDEX] = RGB(0, 71, 157); + lcdColorTable[MENU_BGCOLOR_INDEX] = DARKBLUE; lcdColorTable[MENU_COLOR_INDEX] = WHITE; lcdColorTable[MENU_TITLE_DISABLE_COLOR_INDEX] = RGB(GET_RED(RED)>>1, GET_GREEN(RED)>>1, GET_BLUE(RED)>>1); lcdColorTable[HEADER_COLOR_INDEX] = DARKGREY; @@ -63,7 +63,6 @@ class FlyskyTheme: public ThemeBase lcdColorTable[MAINVIEW_PANES_COLOR_INDEX] = WHITE; lcdColorTable[MAINVIEW_GRAPHICS_COLOR_INDEX] = RED; - // The menu header (top bar) lcdColorTable[HEADER_BGCOLOR_INDEX] = DARKBLUE; lcdColorTable[HEADER_ICON_BGCOLOR_INDEX] = RGB(0, 71, 157); diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 1ed1cb1ad..5b99a5dc8 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -123,16 +123,6 @@ void drawSourceValue(coord_t x, coord_t y, source_t channel, LcdFlags flags=0); void drawCurve(coord_t offset=0); -#if defined(COLORLCD) -void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags=0, const char * prefix=nullptr, const char * suffix=nullptr); -void drawCurveRef(BitmapBuffer * dc, coord_t x, coord_t y, const CurveRef & curve, LcdFlags flags=0); -int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags flags, event_t event); -uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, LcdFlags flags, event_t event); -swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags flags, event_t event); -void drawFatalErrorScreen(const char * message); -void runFatalErrorScreen(const char * message); -#endif - // model_setup Defines that are used in all uis in the same way #define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON((uint8_t)1) #define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((isModuleDSM2(EXTERNAL_MODULE) || isModuleCrossfire(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) || (isModuleMultimodule(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MODULE_SUBTYPE_MULTI_DSM2)) ? (uint8_t)0 : (uint8_t)1) diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index 9200a73ff..84f02f7fa 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -42,8 +42,6 @@ #define W2 LCD_W*LCD_ZOOM #define H2 LCD_H*LCD_ZOOM -extern STRUCT_TOUCH touchState; - class OpenTxSim: public FXMainWindow { FXDECLARE(OpenTxSim) @@ -261,9 +259,9 @@ long OpenTxSim::onMouseDown(FXObject*,FXSelector,void*v) // TRACE("onMouseDown %d %d", evt->win_x, evt->win_y); #if defined(HARDWARE_TOUCH) - touchState.Event = TE_DOWN; - touchState.startX = touchState.lastX = touchState.X = evt->win_x; - touchState.startY = touchState.lastY = touchState.Y = evt->win_y; + touchState.event = TE_DOWN; + touchState.startX = touchState.lastX = touchState.x = evt->win_x; + touchState.startY = touchState.lastY = touchState.y = evt->win_y; #endif return 0; @@ -277,13 +275,13 @@ long OpenTxSim::onMouseUp(FXObject*,FXSelector,void*v) // TRACE("onMouseUp %d %d", evt->win_x, evt->win_y); #if defined(HARDWARE_TOUCH) - if (touchState.Event == TE_DOWN) { - touchState.Event = TE_UP; - touchState.X = evt->win_x; - touchState.Y = evt->win_y; + if (touchState.event == TE_DOWN) { + touchState.event = TE_UP; + touchState.x = evt->win_x; + touchState.y = evt->win_y; } else { - touchState.Event = TE_NONE; + touchState.event = TE_NONE; } #endif @@ -296,10 +294,10 @@ long OpenTxSim::onMouseMove(FXObject*,FXSelector,void*v) UNUSED(evt); #if defined(HARDWARE_TOUCH) - if (evt->state & LEFTBUTTONMASK && (touchState.Event == TE_SLIDE || abs(evt->win_x - touchState.X) > 5 || abs(evt->win_y - touchState.Y) > 5)) { - touchState.Event = TE_SLIDE; - touchState.X = evt->win_x; - touchState.Y = evt->win_y; + if (evt->state & LEFTBUTTONMASK && (touchState.event == TE_SLIDE || abs(evt->win_x - touchState.x) > 5 || abs(evt->win_y - touchState.y) > 5)) { + touchState.event = TE_SLIDE; + touchState.x = evt->win_x; + touchState.y = evt->win_y; } #endif diff --git a/radio/src/stubs.cpp b/radio/src/stubs.cpp index 49c094090..999e32954 100644 --- a/radio/src/stubs.cpp +++ b/radio/src/stubs.cpp @@ -44,11 +44,6 @@ void drawAlertBox(const char * title, const char * text, const char * action) uint8_t menuLevel; int menuVerticalOffset; -void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags, const char * prefix, const char * suffix) -{ - -} - void runFatalErrorScreen(char const*) { diff --git a/radio/src/targets/nv14/touch_driver.cpp b/radio/src/targets/nv14/touch_driver.cpp index a57eb16bc..11c129157 100644 --- a/radio/src/targets/nv14/touch_driver.cpp +++ b/radio/src/targets/nv14/touch_driver.cpp @@ -17,29 +17,25 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ + #include "opentx.h" +#include "touch_driver.h" enum ENUM_TOUCH_STATE { - TOUCH_NONE, - TOUCH_SLIDE, - TOUCH_CLICK + TOUCH_NONE, + TOUCH_SLIDE, + TOUCH_CLICK }; -signed int x; -signed int y; + +int x; +int y; uint32_t TouchEvent; unsigned short Tx; unsigned short Ty; -extern STRUCT_TOUCH touchState; //definition in mainwindow.cpp -static unsigned char TouchState = TOUCH_NONE; +static unsigned char TouchState = TOUCH_NONE; static unsigned short Txold; static unsigned short Tyold; -static unsigned short TouchStartX; -static unsigned short TouchStartY; - - -#include "board.h" -#include "touch_driver.h" #define FT6x06_MAX_INSTANCE 1 @@ -57,61 +53,63 @@ static unsigned short TouchStartY; #define TOUCH_FT6236_I2C_ADDRESS (0x70>>1) -uint8_t ft6x06[FT6x06_MAX_INSTANCE] = { 0 }; -static ft6x06_handle_TypeDef ft6x06_handle = { FT6206_I2C_NOT_INITIALIZED, 0, 0}; +uint8_t ft6x06[FT6x06_MAX_INSTANCE] = {0}; +static ft6x06_handle_TypeDef ft6x06_handle = {FT6206_I2C_NOT_INITIALIZED, 0, 0}; -static void I2C_FreeBus(void) { - GPIO_InitTypeDef GPIO_InitStructure; - // reset i2c bus by setting clk as output and sending manual clock pulses - GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SCL_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure); +void I2C_FreeBus() +{ + GPIO_InitTypeDef GPIO_InitStructure; + // reset i2c bus by setting clk as output and sending manual clock pulses + GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SCL_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure); - GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SDA_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SDA_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure); - //send 100khz clock train for some 100ms - tmr10ms_t until = get_tmr10ms() + 11; - while(get_tmr10ms() < until){ - if (GPIO_ReadInputDataBit(I2C_TOUCH_GPIO, I2C_TOUCH_SDA_GPIO_PIN) == 1){ - TRACE("touch: i2c free again\n"); - break; - } - TRACE("FREEEEE"); - I2C_TOUCH_GPIO->BSRRH = I2C_TOUCH_SCL_GPIO_PIN; //BSRRL - delay_us(10); - I2C_TOUCH_GPIO->BSRRL = I2C_TOUCH_SCL_GPIO_PIN; - delay_us(10); + //send 100khz clock train for some 100ms + tmr10ms_t until = get_tmr10ms() + 11; + while (get_tmr10ms() < until) { + if (GPIO_ReadInputDataBit(I2C_TOUCH_GPIO, I2C_TOUCH_SDA_GPIO_PIN) == 1) { + TRACE("touch: i2c free again\n"); + break; } + TRACE("FREEEEE"); + I2C_TOUCH_GPIO->BSRRH = I2C_TOUCH_SCL_GPIO_PIN; //BSRRL + delay_us(10); + I2C_TOUCH_GPIO->BSRRL = I2C_TOUCH_SCL_GPIO_PIN; + delay_us(10); + } - //send stop condition: - GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SDA_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure); + //send stop condition: + GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SDA_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure); - //clock is low - I2C_TOUCH_GPIO->BSRRH = I2C_TOUCH_SCL_GPIO_PIN; - delay_us(10); - //sda = lo - I2C_TOUCH_GPIO->BSRRL = I2C_TOUCH_SDA_GPIO_PIN; - delay_us(10); - //clock goes high - I2C_TOUCH_GPIO->BSRRH = I2C_TOUCH_SCL_GPIO_PIN; - delay_us(10); - //sda = hi - I2C_TOUCH_GPIO->BSRRL = I2C_TOUCH_SDA_GPIO_PIN; - delay_us(10); - TRACE("FREE BUS"); + //clock is low + I2C_TOUCH_GPIO->BSRRH = I2C_TOUCH_SCL_GPIO_PIN; + delay_us(10); + //sda = lo + I2C_TOUCH_GPIO->BSRRL = I2C_TOUCH_SDA_GPIO_PIN; + delay_us(10); + //clock goes high + I2C_TOUCH_GPIO->BSRRH = I2C_TOUCH_SCL_GPIO_PIN; + delay_us(10); + //sda = hi + I2C_TOUCH_GPIO->BSRRL = I2C_TOUCH_SDA_GPIO_PIN; + delay_us(10); + TRACE("FREE BUS"); } -static void Touch_DeInit(void) + +void Touch_DeInit() { I2C_DeInit(I2C_TOUCH); (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C1RST)); @@ -119,80 +117,81 @@ static void Touch_DeInit(void) (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C1RST)); } -static void I2C_Init(void) +void I2C_Init() { - Touch_DeInit(); + Touch_DeInit(); - GPIO_InitTypeDef GPIO_InitStructure; - EXTI_InitTypeDef EXTI_InitStructure; - NVIC_InitTypeDef NVIC_InitStructure; - I2C_InitTypeDef I2C_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + EXTI_InitTypeDef EXTI_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + I2C_InitTypeDef I2C_InitStructure; - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); - RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE); - RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE); + RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE); - I2C_FreeBus(); + I2C_FreeBus(); - GPIO_PinAFConfig(I2C_TOUCH_GPIO, GPIO_PinSource7, GPIO_AF_I2C1); - GPIO_PinAFConfig(I2C_TOUCH_GPIO, GPIO_PinSource8, GPIO_AF_I2C1); + GPIO_PinAFConfig(I2C_TOUCH_GPIO, GPIO_PinSource7, GPIO_AF_I2C1); + GPIO_PinAFConfig(I2C_TOUCH_GPIO, GPIO_PinSource8, GPIO_AF_I2C1); - GPIO_StructInit(&GPIO_InitStructure); - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SCL_GPIO_PIN | I2C_TOUCH_SDA_GPIO_PIN; - GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure); + GPIO_StructInit(&GPIO_InitStructure); + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SCL_GPIO_PIN | I2C_TOUCH_SDA_GPIO_PIN; + GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure); - GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_RESET_GPIO_PIN; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL; // - GPIO_Init(I2C_TOUCH_RESET_GPIO, &GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_RESET_GPIO_PIN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL; // + GPIO_Init(I2C_TOUCH_RESET_GPIO, &GPIO_InitStructure); - //https://community.st.com/s/question/0D50X00009XkZ9FSAV/stm32f4-i2c-issues-solved - RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); - I2C_StructInit(&I2C_InitStructure); - I2C_InitStructure.I2C_ClockSpeed = 400000; - I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; - I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; - I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; - I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; - I2C_Init(I2C_TOUCH, &I2C_InitStructure); + //https://community.st.com/s/question/0D50X00009XkZ9FSAV/stm32f4-i2c-issues-solved + RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); + I2C_StructInit(&I2C_InitStructure); + I2C_InitStructure.I2C_ClockSpeed = 400000; + I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; + I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; + I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; + I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; + I2C_Init(I2C_TOUCH, &I2C_InitStructure); - I2C_Init(I2C_TOUCH, &I2C_InitStructure); - //I2C_StretchClockCmd(I2C_TOUCH, ENABLE); - I2C_Cmd(I2C_TOUCH, ENABLE); + I2C_Init(I2C_TOUCH, &I2C_InitStructure); + //I2C_StretchClockCmd(I2C_TOUCH, ENABLE); + I2C_Cmd(I2C_TOUCH, ENABLE); - //ext interupt - GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_INT_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(I2C_TOUCH_INT_GPIO, &GPIO_InitStructure); + //ext interupt + GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_INT_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(I2C_TOUCH_INT_GPIO, &GPIO_InitStructure); - SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource9); - EXTI_InitStructure.EXTI_Line = EXTI_Line9; - EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; - EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; - EXTI_InitStructure.EXTI_LineCmd = ENABLE; - EXTI_Init(&EXTI_InitStructure); + SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource9); + EXTI_InitStructure.EXTI_Line = EXTI_Line9; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); - NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); + NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); } #define I2C_TIMEOUT_MAX 1000 + bool I2C_WaitEvent(uint32_t event) { uint32_t timeout = I2C_TIMEOUT_MAX; @@ -211,23 +210,26 @@ bool I2C_WaitEventCleared(uint32_t event) return true; } -bool I2C_Send7BitAddress(uint8_t address, uint16_t direction){ +bool I2C_Send7BitAddress(uint8_t address, uint16_t direction) +{ I2C_SendData(I2C_TOUCH, (address << 1) | ((direction == I2C_Direction_Receiver) ? 1 : 0)); // check if slave acknowledged his address within timeout - if(!I2C_WaitEvent(direction == I2C_Direction_Transmitter ? I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) return false; + if (!I2C_WaitEvent(direction == I2C_Direction_Transmitter ? I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) + return false; return true; } -bool touch_i2c_read(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len){ +bool touch_i2c_read(uint8_t addr, uint8_t reg, uint8_t * data, uint8_t len) +{ if (!I2C_WaitEventCleared(I2C_FLAG_BUSY)) return false; I2C_GenerateSTART(I2C_TOUCH, ENABLE); if (!I2C_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) return false; - if(!I2C_Send7BitAddress(addr, I2C_Direction_Transmitter)) return false; + if (!I2C_Send7BitAddress(addr, I2C_Direction_Transmitter)) return false; I2C_SendData(I2C_TOUCH, reg); if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)) return false; I2C_GenerateSTART(I2C_TOUCH, ENABLE); if (!I2C_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) return false; - if(!I2C_Send7BitAddress(addr, I2C_Direction_Receiver)) return false; + if (!I2C_Send7BitAddress(addr, I2C_Direction_Receiver)) return false; if (len > 1) I2C_AcknowledgeConfig(I2C_TOUCH, ENABLE); @@ -241,16 +243,16 @@ bool touch_i2c_read(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len){ return true; } -static bool touch_i2c_write(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len) +static bool touch_i2c_write(uint8_t addr, uint8_t reg, uint8_t * data, uint8_t len) { if (!I2C_WaitEventCleared(I2C_FLAG_BUSY)) return false; I2C_GenerateSTART(I2C_TOUCH, ENABLE); if (!I2C_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) return false; - if(!I2C_Send7BitAddress(addr, I2C_Direction_Transmitter)) return false; - I2C_SendData(I2C_TOUCH, (uint8_t)((reg & 0xFF00) >> 8)); + if (!I2C_Send7BitAddress(addr, I2C_Direction_Transmitter)) return false; + I2C_SendData(I2C_TOUCH, (uint8_t) ((reg & 0xFF00) >> 8)); if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) return false; - I2C_SendData(I2C_TOUCH, (uint8_t)(reg & 0x00FF)); + I2C_SendData(I2C_TOUCH, (uint8_t) (reg & 0x00FF)); if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) return false; while (len--) { I2C_SendData(I2C_TOUCH, *data); @@ -266,9 +268,9 @@ static bool touch_i2c_write(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t le static void TS_IO_Write(uint8_t addr, uint8_t reg, uint8_t data) { uint8_t tryCount = 3; - while(!touch_i2c_write(addr, reg, &data, 1)) { - if(--tryCount == 0) break; - I2C_Init(); + while (!touch_i2c_write(addr, reg, &data, 1)) { + if (--tryCount == 0) break; + I2C_Init(); } } @@ -276,36 +278,38 @@ static uint8_t TS_IO_Read(uint8_t addr, uint8_t reg) { uint8_t retult; uint8_t tryCount = 3; - while(!touch_i2c_read(addr, reg, &retult, 1)) { - if(--tryCount == 0) break; + while (!touch_i2c_read(addr, reg, &retult, 1)) { + if (--tryCount == 0) break; I2C_Init(); } return retult; } -static uint16_t TS_IO_ReadMultiple(uint8_t addr, uint8_t reg, uint8_t *buffer, uint16_t length) +static uint16_t TS_IO_ReadMultiple(uint8_t addr, uint8_t reg, uint8_t * buffer, uint16_t length) { uint8_t tryCount = 3; - while(!touch_i2c_read(addr, reg, buffer, length)) { - if(--tryCount == 0) break; + while (!touch_i2c_read(addr, reg, buffer, length)) { + if (--tryCount == 0) break; I2C_Init(); } return 1; } -static uint8_t TS_IO_Read(uint8_t reg) { +static uint8_t TS_IO_Read(uint8_t reg) +{ return TS_IO_Read(TOUCH_FT6236_I2C_ADDRESS, reg); } -static void touch_ft6236_debug_info(void) { +static void touch_ft6236_debug_info(void) +{ #if defined(DEBUG) - TRACE("ft6x36: thrhld = %d", TS_IO_Read(TOUCH_FT6236_REG_TH_GROUP) * 4); - TRACE("ft6x36: rep rate=", TS_IO_Read(TOUCH_FT6236_REG_PERIODACTIVE) * 10); - TRACE("ft6x36: fw lib 0x%02X %02X", TS_IO_Read(TOUCH_FT6236_REG_LIB_VER_H), TS_IO_Read(TOUCH_FT6236_REG_LIB_VER_L)); - TRACE("ft6x36: fw v 0x%02X", TS_IO_Read(TOUCH_FT6236_REG_FIRMID)); - TRACE("ft6x36: CHIP ID 0x%02X", TS_IO_Read(TOUCH_FT6236_REG_CIPHER)); - TRACE("ft6x36: CTPM ID 0x%02X", TS_IO_Read(TOUCH_FT6236_REG_FOCALTECH_ID)); - TRACE("ft6x36: rel code 0x%02X", TS_IO_Read(TOUCH_FT6236_REG_RELEASE_CODE_ID)); + TRACE("ft6x36: thrhld = %d", TS_IO_Read(TOUCH_FT6236_REG_TH_GROUP) * 4); + TRACE("ft6x36: rep rate=", TS_IO_Read(TOUCH_FT6236_REG_PERIODACTIVE) * 10); + TRACE("ft6x36: fw lib 0x%02X %02X", TS_IO_Read(TOUCH_FT6236_REG_LIB_VER_H), TS_IO_Read(TOUCH_FT6236_REG_LIB_VER_L)); + TRACE("ft6x36: fw v 0x%02X", TS_IO_Read(TOUCH_FT6236_REG_FIRMID)); + TRACE("ft6x36: CHIP ID 0x%02X", TS_IO_Read(TOUCH_FT6236_REG_CIPHER)); + TRACE("ft6x36: CTPM ID 0x%02X", TS_IO_Read(TOUCH_FT6236_REG_FOCALTECH_ID)); + TRACE("ft6x36: rel code 0x%02X", TS_IO_Read(TOUCH_FT6236_REG_RELEASE_CODE_ID)); #endif } @@ -318,22 +322,21 @@ static void touch_ft6236_debug_info(void) { */ static uint8_t ft6x06_TS_DetectTouch(uint16_t DeviceAddr) { - volatile uint8_t nbTouch = 0; + volatile uint8_t nbTouch = 0; - /* Read register FT6206_TD_STAT_REG to check number of touches detection */ - nbTouch = TS_IO_Read(DeviceAddr, FT6206_TD_STAT_REG); - nbTouch &= FT6206_TD_STAT_MASK; - if(nbTouch > FT6206_MAX_DETECTABLE_TOUCH) - { - /* If invalid number of touch detected, set it to zero */ - nbTouch = 0; - } - /* Update ft6x06 driver internal global : current number of active touches */ - ft6x06_handle.currActiveTouchNb = nbTouch; + /* Read register FT6206_TD_STAT_REG to check number of touches detection */ + nbTouch = TS_IO_Read(DeviceAddr, FT6206_TD_STAT_REG); + nbTouch &= FT6206_TD_STAT_MASK; + if (nbTouch > FT6206_MAX_DETECTABLE_TOUCH) { + /* If invalid number of touch detected, set it to zero */ + nbTouch = 0; + } + /* Update ft6x06 driver internal global : current number of active touches */ + ft6x06_handle.currActiveTouchNb = nbTouch; - /* Reset current active touch index on which to work on */ - ft6x06_handle.currActiveTouchIdx = 0; - return(nbTouch); + /* Reset current active touch index on which to work on */ + ft6x06_handle.currActiveTouchIdx = 0; + return (nbTouch); } /** @@ -351,43 +354,41 @@ static uint8_t ft6x06_TS_DetectTouch(uint16_t DeviceAddr) * @retval None. */ -static void ft6x06_TS_GetTouchInfo(uint16_t DeviceAddr, - uint32_t touchIdx, - uint32_t * pWeight, - uint32_t * pArea, - uint32_t * pEvent) +static void ft6x06_TS_GetTouchInfo(uint16_t DeviceAddr, + uint32_t touchIdx, + uint32_t * pWeight, + uint32_t * pArea, + uint32_t * pEvent) { - uint8_t regAddress = 0; - uint8_t dataxy[3]; + uint8_t regAddress = 0; + uint8_t dataxy[3]; - if(touchIdx < ft6x06_handle.currActiveTouchNb) - { - switch(touchIdx) - { - case 0 : - regAddress = FT6206_P1_WEIGHT_REG; - break; + if (touchIdx < ft6x06_handle.currActiveTouchNb) { + switch (touchIdx) { + case 0 : + regAddress = FT6206_P1_WEIGHT_REG; + break; - case 1 : - regAddress = FT6206_P2_WEIGHT_REG; - break; + case 1 : + regAddress = FT6206_P2_WEIGHT_REG; + break; - default : - break; + default : + break; - } /* end switch(touchIdx) */ + } /* end switch(touchIdx) */ - /* Read weight, area and Event Id of touch index */ - TS_IO_ReadMultiple(DeviceAddr, regAddress, dataxy, sizeof(dataxy)); + /* Read weight, area and Event Id of touch index */ + TS_IO_ReadMultiple(DeviceAddr, regAddress, dataxy, sizeof(dataxy)); - /* Return weight of touch index */ - * pWeight = (dataxy[0] & FT6206_TOUCH_WEIGHT_MASK) >> FT6206_TOUCH_WEIGHT_SHIFT; - /* Return area of touch index */ - * pArea = (dataxy[1] & FT6206_TOUCH_AREA_MASK) >> FT6206_TOUCH_AREA_SHIFT; - /* Return Event Id of touch index */ - * pEvent = (dataxy[2] & FT6206_TOUCH_EVT_FLAG_MASK) >> FT6206_TOUCH_EVT_FLAG_SHIFT; + /* Return weight of touch index */ + *pWeight = (dataxy[0] & FT6206_TOUCH_WEIGHT_MASK) >> FT6206_TOUCH_WEIGHT_SHIFT; + /* Return area of touch index */ + *pArea = (dataxy[1] & FT6206_TOUCH_AREA_MASK) >> FT6206_TOUCH_AREA_SHIFT; + /* Return Event Id of touch index */ + *pEvent = (dataxy[2] & FT6206_TOUCH_EVT_FLAG_MASK) >> FT6206_TOUCH_EVT_FLAG_SHIFT; - } /* of if(touchIdx < ft6x06_handle.currActiveTouchNb) */ + } /* of if(touchIdx < ft6x06_handle.currActiveTouchNb) */ } @@ -400,56 +401,56 @@ static void ft6x06_TS_GetTouchInfo(uint16_t DeviceAddr, * @param Y: Pointer to Y position value * @retval None. */ -static void ft6x06_TS_GetXY(uint16_t DeviceAddr, uint16_t *X, uint16_t *Y, uint32_t *event) +static void ft6x06_TS_GetXY(uint16_t DeviceAddr, uint16_t * X, uint16_t * Y, uint32_t * event) { - uint8_t regAddress = 0; - uint8_t dataxy[4]; + uint8_t regAddress = 0; + uint8_t dataxy[4]; - if(ft6x06_handle.currActiveTouchIdx < ft6x06_handle.currActiveTouchNb) - { - switch(ft6x06_handle.currActiveTouchIdx) - { - case 0 : - regAddress = FT6206_P1_XH_REG; - break; - case 1 : - regAddress = FT6206_P2_XH_REG; - break; + if (ft6x06_handle.currActiveTouchIdx < ft6x06_handle.currActiveTouchNb) { + switch (ft6x06_handle.currActiveTouchIdx) { + case 0 : + regAddress = FT6206_P1_XH_REG; + break; + case 1 : + regAddress = FT6206_P2_XH_REG; + break; - default : - break; - } - - /* Read X and Y positions */ - TS_IO_ReadMultiple(DeviceAddr, regAddress, dataxy, sizeof(dataxy)); - /* Send back ready X position to caller */ - *X = ((dataxy[0] & FT6206_MSB_MASK) << 8) | (dataxy[1] & FT6206_LSB_MASK); - /* Send back ready Y position to caller */ - *Y = ((dataxy[2] & FT6206_MSB_MASK) << 8) | (dataxy[3] & FT6206_LSB_MASK); - - *event = (dataxy[0] & FT6206_TOUCH_EVT_FLAG_MASK) >> FT6206_TOUCH_EVT_FLAG_SHIFT; - /* - uint32_t weight; - uint32_t area; - ft6x06_TS_GetTouchInfo(DeviceAddr, ft6x06_handle.currActiveTouchIdx, &weight, &area, event); - */ - ft6x06_handle.currActiveTouchIdx++; + default : + break; } + + /* Read X and Y positions */ + TS_IO_ReadMultiple(DeviceAddr, regAddress, dataxy, sizeof(dataxy)); + /* Send back ready X position to caller */ + *X = ((dataxy[0] & FT6206_MSB_MASK) << 8) | (dataxy[1] & FT6206_LSB_MASK); + /* Send back ready Y position to caller */ + *Y = ((dataxy[2] & FT6206_MSB_MASK) << 8) | (dataxy[3] & FT6206_LSB_MASK); + + *event = (dataxy[0] & FT6206_TOUCH_EVT_FLAG_MASK) >> FT6206_TOUCH_EVT_FLAG_SHIFT; + /* + uint32_t weight; + uint32_t area; + ft6x06_TS_GetTouchInfo(DeviceAddr, ft6x06_handle.currActiveTouchIdx, &weight, &area, event); + */ + ft6x06_handle.currActiveTouchIdx++; + } } static void ft6x06_TS_GetGestureID(uint16_t DeviceAddr, uint32_t * pGestureId) { - *pGestureId = TS_IO_Read(DeviceAddr, FT6206_GEST_ID_REG); + *pGestureId = TS_IO_Read(DeviceAddr, FT6206_GEST_ID_REG); } -void TouchReset(){ +void TouchReset() +{ GPIO_ResetBits(I2C_TOUCH_RESET_GPIO, I2C_TOUCH_RESET_GPIO_PIN); delay_ms(20); GPIO_SetBits(I2C_TOUCH_RESET_GPIO, I2C_TOUCH_RESET_GPIO_PIN); delay_ms(300); } -void TouchInit( void ) + +void TouchInit(void) { I2C_Init(); TouchReset(); @@ -488,68 +489,57 @@ void handleTouch() ft6x06_TS_GetXY(TOUCH_FT6236_I2C_ADDRESS, &Tx, &Ty, &TouchEvent); uint32_t gesture; ft6x06_TS_GetGestureID(TOUCH_FT6236_I2C_ADDRESS, &gesture); -#if defined( LCD_DIRECTION ) && ( LCD_DIRECTION == LCD_VERTICAL ) - Tx=LCD_WIDTH-Tx; - Ty=LCD_HEIGHT-Ty; +#if defined( LCD_DIRECTION ) && (LCD_DIRECTION == LCD_VERTICAL) + Tx = LCD_WIDTH - Tx; + Ty = LCD_HEIGHT - Ty; #else x = ( LCD_WIDTH - 1 ) - Ty; Ty = Tx; Tx = x; #endif - if(TouchEvent == FT6206_TOUCH_EVT_FLAG_CONTACT) - { - touchState.X = Tx; - touchState.Y = Ty; + if (TouchEvent == FT6206_TOUCH_EVT_FLAG_CONTACT) { + touchState.x = Tx; + touchState.y = Ty; - if( TOUCH_NONE == TouchState ) - { - touchState.Event = TE_NONE; - TouchState = TOUCH_CLICK; + if (TOUCH_NONE == TouchState) { + touchState.event = TE_NONE; + TouchState = TOUCH_CLICK; + if (g_eeGeneral.backlightMode & e_backlight_mode_keys) + backlightOn(); // TODO is that the best place ? + } + else { + if (TOUCH_CLICK == TouchState) { + x = Tx - Txold; + y = Ty - Tyold; - TouchStartX = Tx; - TouchStartY = Ty; - - if (g_eeGeneral.backlightMode & e_backlight_mode_keys) - backlightOn(); // TODO is that the best place ? + if ((x >= SLIDE_RANGE) || (x <= -SLIDE_RANGE) || (y >= SLIDE_RANGE) || (y <= -SLIDE_RANGE)) { + TouchState = TOUCH_SLIDE; + touchState.event = TE_SLIDE; + } + else { + touchState.event = TE_DOWN; + touchState.startX = touchState.lastX = touchState.x; + touchState.startY = touchState.lastY = touchState.y; + } } - else - { - if ( TOUCH_CLICK == TouchState ) - { - x = Tx - Txold; - y = Ty - Tyold; - - if( ( x >= SLIDE_RANGE ) || ( x <= -SLIDE_RANGE ) || ( y >= SLIDE_RANGE ) || ( y <= -SLIDE_RANGE ) ) - { - TouchState = TOUCH_SLIDE; - touchState.Event = TE_SLIDE; - } - else - { - touchState.Event = TE_DOWN; - touchState.startX = touchState.lastX = touchState.X; - touchState.startY = touchState.lastY = touchState.Y; - } - } - else if ( TOUCH_SLIDE == TouchState ) - { - touchState.Event = TE_SLIDE; - } - else - { - TouchState = TOUCH_NONE; - } + else if (TOUCH_SLIDE == TouchState) { + touchState.event = TE_SLIDE; } - Txold = Tx; - Tyold = Ty; + else { + TouchState = TOUCH_NONE; + } + } + Txold = Tx; + Tyold = Ty; } } -extern "C" void EXTI9_5_IRQHandler(void) { +extern "C" void EXTI9_5_IRQHandler(void) +{ - if(EXTI_GetITStatus(EXTI_Line9) != RESET) { + if (EXTI_GetITStatus(EXTI_Line9) != RESET) { - if(ft6x06_TS_DetectTouch(TOUCH_FT6236_I2C_ADDRESS)){ + if (ft6x06_TS_DetectTouch(TOUCH_FT6236_I2C_ADDRESS)) { handleTouch(); /* TRACE("X %d Y %d", x, y); @@ -560,20 +550,17 @@ extern "C" void EXTI9_5_IRQHandler(void) { if(gesture != TOUCH_FT6236_GESTURE_NONE) TRACE("gesture d3 %d", gesture); */ } - else - { - if ( TOUCH_CLICK == TouchState ) - { - touchState.X = Txold; - touchState.Y = Tyold; - touchState.Event = TE_UP; - touchState.Time = get_tmr10ms(); + else { + if (TOUCH_CLICK == TouchState) { + touchState.x = Txold; + touchState.y = Tyold; + touchState.event = TE_UP; + touchState.time = get_tmr10ms(); } - else if (get_tmr10ms() > touchState.Time + 50) - { - touchState.X = LCD_WIDTH; - touchState.Y = LCD_HEIGHT; - touchState.Event = TE_NONE; + else if (get_tmr10ms() > touchState.time + 50) { + touchState.x = LCD_WIDTH; + touchState.y = LCD_HEIGHT; + touchState.event = TE_NONE; } TouchState = TOUCH_NONE; } diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index 5116ccb3f..f9d17e661 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit 5116ccb3f9f9dfb7883d79972111917f5f0cab62 +Subproject commit f9d17e66114087c631699c08470e5b1db7d6afd7 diff --git a/radio/src/touch.h b/radio/src/touch.h index 0b10f0fe4..49698c54f 100644 --- a/radio/src/touch.h +++ b/radio/src/touch.h @@ -18,10 +18,10 @@ * GNU General Public License for more details. */ -#ifndef TOUCH_H -#define TOUCH_H +#ifndef _TOUCH_H_ +#define _TOUCH_H_ -enum ENUM_TOUCH_EVENT +enum TouchEvent { TE_NONE, TE_DOWN, @@ -30,18 +30,20 @@ enum ENUM_TOUCH_EVENT TE_END }; -typedef struct +struct TouchState { - unsigned char Event; - short X; - short Y; + unsigned char event; + short x; + short y; short startX; short startY; short lastX; short lastY; - uint32_t Time; -} STRUCT_TOUCH; + uint32_t time; +}; -#define SLIDE_RANGE ( 6 ) +constexpr uint8_t SLIDE_RANGE = 6; -#endif // TOUCH_H \ No newline at end of file +extern TouchState touchState; + +#endif // _TOUCH_H_ \ No newline at end of file