Официальный сайт компании Arduino по адресу arduino.cc
Arduino VNC - нужна помощь в адаптации библиотеки
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ср, 20/05/2020 - 21:15
Здравствуйте! Нужна помощь в адаптации библиотеки arduinoVNC. Сам уже запутался, но постараюсь изложить суть проблемы наиболее детально. Есть такая библиотека arduinoVNC - реализующая VNC клиент с отображением удаленного рабочего стола на миниатюрном дисплее на контроллере ILI9341. Библиотека поддерживает старшие платы семейства Arduino, а также ESP8266 и ESP32. Я уже давно протестировал работу библиотеки на ESP8266 и более её не использовал. Не так давно мне в руки попала платформа TTGO T-WATCH, по сути представляющая собой ESP32 с дисплеем на контроллере ST7789, аккумулятором, менеджером питания, гироскопом и пр. Я хотел запустить VNC клиент на данной платформе, но я не знал, как добавить поддержку контроллера дисплея ST7789 и даже не пытался этого сделать. Совсем недавно мне попался на глаза пример работы VNC на платформе M5STICK, которая по сути похожа на TTGO T-WATCH. Автор добавил в оригинальную библиотеку файлы "VNC_M5STICKC.h" и "VNC_M5STICKC.cpp" для поддержки M5STICK. Я решил использовать его наработки и создал на основе его исходников соответственно файлы "VNC_TWATCH.h" и "VNC_TWATCH.cpp" для TTGO T-WATCH. И вот тут возникает первая проблема: при попытке компиляции примера получаю ошибку, что файл M5STCKC.h, который иклюдится в VNC_M5STICK.h не найден. Но дело в том, что у меня нигде не включены файлы "VNC_M5STICK.h" и "VNC_M5STICK.cpp". Я избавился от проблемы просто удалив VNC_M5STICK.h и VNC_M5STICK.cpp, но это не решение проблемы.
Проблема вторая. Я обновил все используемые библиотеки, теперь скетч компилируется под ESP32, но не компилируется под ESP8266. Во-первых, сначала соответственно ругается на созданные мной файлы "VNC_TWATCH.h" и "VNC_TWATCH.cpp", которые естественно нигде не подключены. После их удаления получаю сообщение об ошибке следующего содержания:
Arduino: 1.8.1 (Windows 7), Плата:"LOLIN(WEMOS) D1 R2 & mini, 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 4MB (FS:2MB OTA:~1019KB), v2 Lower Memory, Disabled, None, Only Sketch, 921600"
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_ILI9341.cpp: In member function 'virtual void ILI9341VNC::draw_area(uint32_t, uint32_t, uint32_t, uint32_t, uint8_t*)':
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_ILI9341.cpp:56:5: error: 'area_update_start' is not a member of 'Adafruit_ILI9341'
Adafruit_ILI9341::area_update_start(x, y, w, h);
^
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_ILI9341.cpp:57:5: error: 'area_update_data' is not a member of 'Adafruit_ILI9341'
Adafruit_ILI9341::area_update_data(data, (w*h));
^
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_ILI9341.cpp:58:5: error: 'area_update_end' is not a member of 'Adafruit_ILI9341'
Adafruit_ILI9341::area_update_end();
^
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_ILI9341.cpp: In member function 'virtual void ILI9341VNC::area_update_start(uint32_t, uint32_t, uint32_t, uint32_t)':
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_ILI9341.cpp:73:5: error: 'area_update_start' is not a member of 'Adafruit_ILI9341'
Adafruit_ILI9341::area_update_start(x, y, w, h);
^
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_ILI9341.cpp: In member function 'virtual void ILI9341VNC::area_update_data(char*, uint32_t)':
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_ILI9341.cpp:84:5: error: 'area_update_data' is not a member of 'Adafruit_ILI9341'
Adafruit_ILI9341::area_update_data((uint8_t *)data, pixel);
^
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_ILI9341.cpp: In member function 'virtual void ILI9341VNC::area_update_end()':
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_ILI9341.cpp:92:5: error: 'area_update_end' is not a member of 'Adafruit_ILI9341'
Adafruit_ILI9341::area_update_end();
^
exit status 1
Ошибка компиляции для платы LOLIN(WEMOS) D1 R2 & mini.
Суть ошибки заключается в том, что якобы в библиотеке "Adafruit_ILI9341" нет вызываемых методов, но во-первых эти методы в библиотеке есть, а во-вторых если заглянуть внутрь файла библиотеки "VNC_ILI9341.cpp" можно увидеть, что часть строк, которые вызывают ошибку, используются только при компилировании под ESP32 (и проблем при этом не вызывают). Например:
void ILI9341VNC::area_update_data(char *data, uint32_t pixel){ #ifndef ESP32 Adafruit_ILI9341::area_update_data((uint8_t *)data, pixel); #else Adafruit_ILI9341::drawRGBBitmap(area_x, area_y, (uint16_t*)data, area_w, area_h); #endif }
Наконец третья проблема - при попытке компиляции примера непосредственно для целевой платформы TTGO T-Watch получаю следующее сообщение об ошибке:
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_TWATCH.cpp: In member function 'virtual void TWATCHVNC::draw_rect(uint32_t, uint32_t, uint32_t, uint32_t, uint16_t)':
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_TWATCH.cpp:54:5: error: 'ttgo' was not declared in this scope
ttgo->eTFT->fillRect(x, y, w, h, ((((color) & 0xff) << 8) | (((color) >> 8))));
^
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_TWATCH.cpp: In member function 'virtual void TWATCHVNC::area_update_data(char*, uint32_t)':
C:\Users\Gamer\Documents\Arduino\libraries\arduinoVNC\src\VNC_TWATCH.cpp:69:4: error: 'ttgo' was not declared in this scope
ttgo->eTFT->drawBitmap(area_x, area_y, area_w, area_h, (uint16_t*)data);
^
exit status 1
Ошибка компиляции для платы LOLIN D32.
Суть его в следующем: для T-Watch создана библиотека-обертка, в скетче создается и инициализируется объект 'ttgo'
TTGOClass *ttgo; ttgo = TTGOClass::getWatch();
Далее соответственно при обращении, например, к дисплею используется конструктор ttgo->eTFT->
Именно так я прописал в VNC_TWATCH.cpp. по аналогии исходником для M5STICK, где к дисплею обращаются через M5.Lcd и проблем это похоже не вызывало. То есть было:
M5.Lcd.fillRect(x, y, w, h, ((((color) & 0xff) << 8) | (((color) >> 8))));
При этом объект "M5" нигде выше не объявлялся, только в Setup в самом скетче.
Спасибо всем, кто дочитал до конца и попробовал разобраться в изложенном!
Если коротко изложить, вопросы такие:
-
Почему компилятор ругается на файлы, которые нигде не подключены, а просто находятся в папке с библиотекой?
-
Почему компилятор ругается на якобы отсутствующие методы в библиотеке, хотя они есть.
2 .1 Почему компилятор ругается на строки, которые не должны компилироваться для данной платформы?
3. Как в скетче объявить объект 'ttgo', чтобы при обращении к нему внутри библиотеки не возникало ошибки 'ttgo' was not declared in this scope?
А можно вопрос не в тему - зачем VNC на таком маленьком дисплее и МК?
А можно вопрос не в тему - зачем VNC на таком маленьком дисплее и МК?
Да, это просто баловство, конечно. Но кому-то может будет полезно. Это во-первых. А во-вторых я хотел добавить вместо дисплея поддержку больших светодиодных матриц. Хотя, это тоже баловство, только немного другое)
Нестор, судя по задаваемым вопросам, опыт в программировании у вас небольшой. Иначе вы бы не ожидали, например, что переменная, обьявленная в скетче, будет доступна в библиотеке (вопрос номер 3 из заглавного поста).
Чтобы разобраться в ваших проблемах, короткие ответы вам не помогут, вам надо серьезно изучать язык.
Другой вариант - разместить заказ на доработку библиотеки в платном разделе, но судя по количеству ошибок, что вы наворотили - это будет недешево
Да вы правы и с получением опыта проблемы.
Да, я не до конца понимаю механизм работы библиотеки. В моем представлении библиотека - это набор функций и вызываю я их после того, как проинициализировал объект (в моем случае 'ttgo') и могу использовать его в этих вызовах. А что скажете по поводу 1 вопроса, я правильно понимаю, что если соответствующие файлы не подключены, они не должны вызывать ошибку или нет? Заранее спасибо за ответ.
Вот так и учусь. Я не встречал уроков, которые бы помогли мне постичь программирование. Все, что мне попадались не дают понимания многих моментов.
Это не тот проект, ради которого стоит платить. И мне нужен скорее не конечный результат, а именно его достижение (или постижение). Интерес у меня скорее академический, нежели практический. Но не соглашусь, что я там что-то особого наворотил. Буду копать дальше.
Да, я не до конца понимаю механизм работы библиотеки. В моем представлении библиотека - это набор функций и вызываю я их после того, как проинициализировал объект (в моем случае 'ttgo') и могу использовать его в этих вызовах. А что скажете по поводу 1 вопроса, я правильно понимаю, что если соответствующие файлы не подключены, они не должны вызывать ошибку или нет? Заранее спасибо за ответ.
Библиотекой здесь называют любой внешний файл. А что там - функция или класс надо смотреть в подключаемом файле. Как и функции создаваемого объекта. Обычно к библиотекам идут примеры. В крайнем случае можно открыть сами файлы библиотеки.
Если файлы не подключены - они не вызывают ошибку, но если они отсутствуют, а подключенной библиотеке они нужны - то будет ошибка.