a demo of GUI on DISCOF7 consisting of a few buttons and feeders
Dependencies: ADXL345 BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG
Diff: main.cpp
- Revision:
- 3:afd2bb1331a4
- Parent:
- 2:76522cfa03cd
- Child:
- 4:8c94c3ee8a3a
diff -r 76522cfa03cd -r afd2bb1331a4 main.cpp --- a/main.cpp Fri Aug 05 23:49:42 2016 +0000 +++ b/main.cpp Sat Aug 06 02:48:56 2016 +0000 @@ -6,67 +6,157 @@ #include <string> using namespace std; + +#define BUTTON_DEPRESS_TIME_MIN 0.065000f LCD_DISCO_F746NG lcd; TS_DISCO_F746NG ts; TS_StateTypeDef TS_State; + +typedef struct{ + uint16_t x; + uint16_t y; + uint16_t width; + uint16_t height; +}rectData_t; +typedef struct{ + rectData_t rectObj; + uint16_t value; + bool update_flag; +}hFeeder_t; + +typedef struct{ + rectData_t rectObj; + bool isPressed; + bool update_flag; + Timer depressTime; +}button_t; + -bool touch_test_rectangle(uint16_t tx, uint16_t ty, uint16_t x, uint16_t y, uint16_t width, uint16_t height){ +rectData_t but1pos = {48, 68, 96, 60}; +rectData_t but2pos = {192, 68, 96, 60}; +rectData_t but3pos = {338, 68, 96, 60}; +rectData_t hFeed1pos = {48, 152, 384, 30}; +rectData_t hFeed2pos = {48, 212, 384, 30}; +button_t button1 = {but1pos,0,0}; +button_t button2 = {but2pos,0,0}; +button_t button3 = {but3pos,0,0}; +hFeeder_t hFeed1 = {hFeed1pos,0, 0}; +hFeeder_t hFeed2 = {hFeed2pos,0, 0}; + +void button(button_t *buttonObj, TS_StateTypeDef *TS_State){ bool x_is_in =0; - bool y_is_in = 0; + bool y_is_in =0; + + uint16_t dyn_x = TS_State->touchX[0]; + uint16_t dyn_y = TS_State->touchY[0]; + + if( (dyn_x>buttonObj->rectObj.x) && (dyn_x<(buttonObj->rectObj.x+buttonObj->rectObj.width))) x_is_in = 1; + if( (dyn_y>buttonObj->rectObj.y) && (dyn_y<(buttonObj->rectObj.y+buttonObj->rectObj.height))) y_is_in = 1; - if( (tx>x) && (tx<(x+width))) x_is_in = 1; - if( (ty>y) && (ty<(y+height))) y_is_in = 1; + if(x_is_in && y_is_in){ + if(!(buttonObj->isPressed)){ + buttonObj->depressTime.start(); + buttonObj->isPressed = 1; + lcd.SetTextColor(LCD_COLOR_GREEN); + lcd.FillRect(buttonObj->rectObj.x, buttonObj->rectObj.y, buttonObj->rectObj.width, buttonObj->rectObj.height); + } + } + - bool buttest; - buttest = x_is_in & y_is_in; - - return (bool) buttest; + else{ + if(buttonObj->isPressed){ + buttonObj->depressTime.stop(); + buttonObj->isPressed = 0; + if(buttonObj->depressTime.read()>BUTTON_DEPRESS_TIME_MIN){ + buttonObj->update_flag=1; + + } + buttonObj->depressTime.reset(); + lcd.SetTextColor(LCD_COLOR_RED); + lcd.FillRect(buttonObj->rectObj.x, buttonObj->rectObj.y, buttonObj->rectObj.width, buttonObj->rectObj.height); + } + } } -uint16_t h_feeder(uint16_t tx, uint16_t ty,uint16_t x, uint16_t y, uint16_t width, uint16_t height){ - +void h_feeder(hFeeder_t *feederObj, TS_StateTypeDef *TS_State){ bool x_is_in =0; bool y_is_in =0; - if( (tx>x) && (tx<(x+width))) x_is_in = 1; - if( (ty>y) && (ty<(y+height))) y_is_in = 1; + uint16_t dyn_x = TS_State->touchX[0]; + uint16_t dyn_y = TS_State->touchY[0]; - bool buttest; - buttest = x_is_in & y_is_in; + if( (dyn_x>feederObj->rectObj.x) && (dyn_x<(feederObj->rectObj.x+feederObj->rectObj.width))) x_is_in = 1; + if( (dyn_y>feederObj->rectObj.y) && (dyn_y<(feederObj->rectObj.y+feederObj->rectObj.height))) y_is_in = 1; - if(buttest){ - return tx - x; + + if(x_is_in && y_is_in){ + uint16_t newFeedValue; + newFeedValue = dyn_x - feederObj->rectObj.x; + if(newFeedValue != feederObj->value){ + feederObj->update_flag = 1; + feederObj->value = newFeedValue; + + lcd.SetTextColor(LCD_COLOR_RED); + lcd.FillRect(feederObj->rectObj.x, feederObj->rectObj.y, feederObj->rectObj.width, feederObj->rectObj.height); + lcd.SetTextColor(LCD_COLOR_GREEN); + lcd.FillRect(feederObj->rectObj.x, feederObj->rectObj.y, feederObj->value, feederObj->rectObj.height); + } } - - +} + +int b1cnt=0, b2cnt=0,b3cnt=0; + +void button1_callback(){ + b1cnt++; + button1.update_flag = 0; } -bool but1=0,but2=0,but3=0; -uint16_t feed1_dist = 0; -uint16_t feed2_dist = 0; +void button2_callback(){ + b2cnt++; + button2.update_flag = 0; +} + +void button3_callback(){ + b3cnt++; + button3.update_flag = 0; +} -int main2() -{ - - uint16_t x, y; - uint8_t text[30]; - uint8_t status; - uint8_t idx; - uint8_t cleared = 0; - uint8_t prev_nb_touches = 0; +void hFeeder1_callback(){ + //lcd.SetTextColor(LCD_COLOR_RED); + //lcd.FillRect(hFeed1pos.x, hFeed1pos.y, hFeed1pos.width, hFeed1pos.height); + //lcd.SetTextColor(LCD_COLOR_GREEN); + //lcd.FillRect(hFeed1pos.x, hFeed1pos.y, hFeed1.value, hFeed1pos.height); + hFeed1.update_flag = 0; +} - lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN DEMO", CENTER_MODE); - wait(1); +void hFeeder2_callback(){ + //lcd.SetTextColor(LCD_COLOR_RED); + //lcd.FillRect(hFeed2pos.x, hFeed2pos.y, hFeed2pos.width, hFeed2pos.height); + //lcd.SetTextColor(LCD_COLOR_GREEN); + //lcd.FillRect(hFeed2pos.x, hFeed2pos.y, hFeed2.value, hFeed2pos.height); + hFeed2.update_flag = 0; +} +int main(){ + + + + + + uint8_t status; + + lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN DEMO", CENTER_MODE); + wait(1); + status = ts.Init(lcd.GetXSize(), lcd.GetYSize()); if (status != TS_OK) { lcd.Clear(LCD_COLOR_RED); @@ -87,76 +177,44 @@ lcd.SetTextColor(LCD_COLOR_RED); - lcd.FillRect(48, 68, 96, 60); - lcd.FillRect(192, 68, 96, 60); - lcd.FillRect(338, 68, 96, 60); + lcd.FillRect(but1pos.x, but1pos.y, but1pos.width, but1pos.height); + lcd.FillRect(but2pos.x, but2pos.y, but2pos.width, but2pos.height); + lcd.FillRect(but3pos.x, but3pos.y, but3pos.width, but3pos.height); - lcd.FillRect(48, 152, 384, 30); - lcd.FillRect(48, 212, 384, 30); + lcd.FillRect(hFeed1pos.x, hFeed1pos.y, hFeed1pos.width, hFeed1pos.height); + lcd.FillRect(hFeed2pos.x, hFeed2pos.y, hFeed2pos.width, hFeed2pos.height); wait(1); - + while(1){ - but1=0; - but2=0; - but3=0; - + ts.ResetTouchData(&TS_State); ts.GetState(&TS_State); - if (TS_State.touchDetected) { - - feed1_dist = h_feeder(TS_State.touchX[0],TS_State.touchY[0],48, 152, 384, 30); - feed2_dist = h_feeder(TS_State.touchX[0],TS_State.touchY[0],48, 212, 384, 30); - but1 = touch_test_rectangle(TS_State.touchX[0],TS_State.touchY[0], 48, 68, 96, 60); - but2 = touch_test_rectangle(TS_State.touchX[0],TS_State.touchY[0], 192, 68, 96, 60); - but3 = touch_test_rectangle(TS_State.touchX[0],TS_State.touchY[0], 338, 68, 96, 60); + //if (TS_State.touchDetected) + { + h_feeder(&hFeed1, &TS_State); + h_feeder(&hFeed2, &TS_State); + button(&button1, &TS_State); + button(&button2, &TS_State); + button(&button3, &TS_State); - if(feed1_dist>0){ - lcd.SetTextColor(LCD_COLOR_RED); - lcd.FillRect(48, 152, 384, 30); - lcd.SetTextColor(LCD_COLOR_GREEN); - lcd.FillRect(48, 152, feed1_dist, 30); - } - - if(feed2_dist>0){ - lcd.SetTextColor(LCD_COLOR_RED); - lcd.FillRect(48, 212, 384, 30); - lcd.SetTextColor(LCD_COLOR_GREEN); - lcd.FillRect(48, 212, feed2_dist, 30); - } } - if(but1){ - lcd.SetTextColor(LCD_COLOR_GREEN); - lcd.FillRect(48, 68, 96, 60); - } - else{ - lcd.SetTextColor(LCD_COLOR_RED); - lcd.FillRect(48, 68, 96, 60); - } + if(hFeed1.update_flag)hFeeder1_callback(); + if(hFeed2.update_flag)hFeeder2_callback(); + if(button1.update_flag) button1_callback(); + if(button2.update_flag) button2_callback(); + if(button3.update_flag) button3_callback(); - if(but2){ - lcd.SetTextColor(LCD_COLOR_GREEN); - lcd.FillRect(192, 68, 96, 60); - } - else{ - lcd.SetTextColor(LCD_COLOR_RED); - lcd.FillRect(192, 68, 96, 60); - } - if(but3){ - lcd.SetTextColor(LCD_COLOR_GREEN); - lcd.FillRect(338, 68, 96, 60); - } - else{ - lcd.SetTextColor(LCD_COLOR_RED); - lcd.FillRect(338, 68, 96, 60); - } + printf("feeder values are %d,%d,%d %d,%d\r\n", b1cnt, b2cnt,b3cnt,hFeed1.value, hFeed2.value); + //printf("feeder values are (%d,%d) %f,%f,%f %d,%d\r\n", TS_State.touchX[0],TS_State.touchY[0],button1.depressTime.read(), button2.depressTime.read(),button3.depressTime.read(),hFeed1.value, hFeed2.value); } } + ///////////////////////////////////////////////////////////////////// //ACCELEROMETER TEST @@ -165,7 +223,7 @@ ADXL345 accelerometer(D11,D12,D13,D10); Serial pc(USBTX, USBRX); -int main() { +int main2() { int readings[3] = {0, 0, 0};