Если какой то узел тормозит всю работу, я его вытаскиваю на отдельный МК, например клаву и дисплей, иногда энкодер и тп с передачей данных. Такой подход мне нравится.
Например: Код (C++): // Определение структуры struct button { int x1; int у1; int x2; int у2; }; // Объявление массива структур struct button buttons[9]; // Обращение к сруктуре из массива if (buttons[0].x1 >= 10) . . .
Спасибо за помощь. В выходные уже допетрил сам, что не обязательно двухмерный массив создавать, можно 4 одномерных))) Следующий вопрос. При клике на кнопку по средствам тача я по падаю в функцию в которой отрисовывается меню и далее следует бесконечный цикл, в котором я отлавливаю нажатия тача. Код (C++): void ShowOne(){ отрисовавыем кнопки wile(true){ тут обрабатываем нажатие тача и получаем координаты , что бы понять на какую кнопку меню нажали } } Так вот в loop тач работает, а в моей функции ShowOne() нет
Одномерный, двухмерный или десятимерный понятия условные. На самом деле все массивы одномерные, разница только в способах доступа для программиста. Когда двухмерные удобнее используют их. Например, массив для "превращения" отсканированной клавиатуры в символы кнопок: Код (C++): char keySim[4][3] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Удобнее, чем три или четыре разных массива. Но тут главное не запутаться где вдоль, а где поперек.
Тут функция waitForIt нормально отрабатывает и отлавливает нажатия кнопок Код (C++): void loop() { while (true){ if (myTouch.dataAvailable()) { Serial.println("touch"); myTouch.read(); x=myTouch.getX(); y=myTouch.getY(); for(int i=0; i<countgauges;i++){ if(apx1[i]<=x && apx2[i]>=x && apy1[i]<=y && apy2[i]>=y){ waitForIt(apx1[i], apy1[i], apx2[i], apy2[i], i); } } } } Сама функция waitForIt Код (C++): void waitForIt(int x1, int y1, int x2, int y2, int i) { myGLCD.setColor(255, 160, 15); myGLCD.drawRoundRect (x1, y1, x2, y2); DrawOneGauge(i); } Далее функция DrawOneGauge отрисовывает экран и снова должна отлавливать нажатия Код (C++): void DrawOneGauge(int g){ myGLCD.clrScr(); myGLCD.setBackColor(0, 0, 0); myGLCD.setFont(BigFont); myGLCD.setColor(255, 255, 255); myGLCD.print(GaugeNames[g], 5, 5); int half_h = disp_height/2; int half_w = disp_wide/2; char* bnames[] = {"back","sets","type","next"}; unsigned const char counbuttons = sizeof(bnames)/sizeof(char*); int bpx1[counbuttons]; int bpy1[counbuttons]; int bpx2[counbuttons]; int bpy2[counbuttons]; int b_w = (disp_wide-1)/counbuttons; //навигация прибора myGLCD.setBackColor(13, 163, 221); for(int i=0; i<counbuttons; i++){ int px1 = i*b_w; int py1 = disp_height-30; int px2 = b_w+(i*b_w); int py2 = disp_height-1; bpx1[i] = {px1}; bpy1[i] = {py1}; bpx2[i] = {px2}; bpy2[i] = {py2}; myGLCD.setColor(13, 163, 221); myGLCD.fillRoundRect (px1, py1 ,px2, py2); myGLCD.setColor(41, 95, 152); myGLCD.drawRoundRect (px1, py1 ,px2, py2); myGLCD.setFont(BigFont); myGLCD.setColor(255, 255, 255); myGLCD.print(bnames[i], px1+5, py1+5); } myGLCD.setColor(255, 160, 15); geo.drawArc(half_w,disp_height,210,-40,40,3); for (int i=-40; i<=40; i+=8){ geo.drawArc(half_w,disp_height,205,i,i,10); } while(true){ if (myTouch.dataAvailable()) { Serial.println("touch"); myTouch.read(); int xpos=myTouch.getX(); int ypos=myTouch.getY(); for(int i=0; i<counbuttons;i++){ if(bpx1[i]<=xpos && bpx2[i]>=xpos && bpy1[i]<=ypos && bpy2[i]>=ypos){ if(i==3){ waitForIt(bpx1[i], bpy1[i], bpx2[i], bpy2[i], g++); } if(i==0){ drawGauges(); } } } } } } но на нажатия тач не реагирует, не могу понять почему
Это у Вас по принципу "зачем просто, если можно сложно"? Код (C++): char* bnames[] = {"back","sets","type","next"}; unsigned const char counbuttons = sizeof(bnames)/sizeof(char*); До цикла while в функции DrawOneGauge() программа вообще доходит?
Код (C++): unsigned const char counbuttons = sizeof(bnames)/sizeof(char*); это пример из интернета подсчета размера массива. да все работает. Доходит ли до бесконечного цикла не проверял. Но отрисовывает на экране все как задумано. Для проверки нажатий вывел Код (C++): Serial.println("touch"); но оно не срабатывает.
Зачем вычислять если и так известно сколько у Вас кнопок? Имеет смысл, только если заранее не известно это кол-во. Ну так добавьте отладочный вывод перед while и проверьте. Насколько я понял, у Вас что-то вроде рекурсии - вызов "DrawOneGauge()" из самой себя (через "WaitForIt()") - и выхода из функции (т. е. из рекурсии) не предусмотрено? Могу ошибаться, но в таком случае рано или поздно память может закончиться.
Количество кнопок считается исходя из массива с их названием, это делает код более маштабируемым. Кроме того код пишется для разных разрешений экрана. Другое дело что это конечно отнимает какую то часть процессорного времени. но тут это не критично так как выполняется один раз и далее скрипт должен входить в бесконечный цикл. Там не рекурсия, а вызов следующего датчика если нажать на кнопку. Код (C++): waitForIt(bpx1[i], bpy1[i], bpx2[i], bpy2[i], g++); Вызов GrawOneGauge() через waitForIt это чисто подсветить кнопку которую нажали, что бы была обратная связь. еще ищу способ реализовать отлавливание на экране жестов. что то не нашел примеров пока что.
У Вас в функции GrawOneGauge() организован бесконечный цикл. Существует ли условие, при котором этот бесконечный цикл прерывается и функция GrawOneGauge() завершается?
Да. В бесконечном цикле отслеживается нажатие на кнопки и далее условия Код (C++): if(i==3){ //переход к следующему waitForIt(bpx1[i], bpy1[i], bpx2[i], bpy2[i], g++); } if(i==0){ // возврат на главную drawGauges(); }
взять бумажку, нарисовать экран, нарисовать кнопки. Поделить ширину экрана на количество кнопок. Аналогично с высотой. Вспомнить, что нужно расстояние между кнопками. Перерисовать все заново. Дальше математика из 3-го класса.