Arduino VNC - нужна помощь в адаптации библиотеки

Nestor Mahno
Offline
Зарегистрирован: 03.10.2015
Здравствуйте! Нужна помощь в адаптации библиотеки 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 в самом скетче.

Спасибо всем, кто дочитал до конца и попробовал разобраться в изложенном!
Если коротко изложить, вопросы такие:
  1. Почему компилятор ругается на файлы, которые нигде не подключены, а просто находятся в папке с библиотекой?
  2. Почему компилятор ругается на якобы отсутствующие методы в библиотеке, хотя они есть.
    2 .1 Почему компилятор ругается на строки, которые не должны компилироваться для данной платформы?
3. Как в скетче объявить объект 'ttgo', чтобы при обращении к нему внутри библиотеки не возникало ошибки 'ttgo' was not declared in this scope?
sadman41
Offline
Зарегистрирован: 19.10.2016

А можно вопрос не в тему - зачем VNC на таком маленьком дисплее и МК? 

Nestor Mahno
Offline
Зарегистрирован: 03.10.2015

sadman41 пишет:

А можно вопрос не в тему - зачем VNC на таком маленьком дисплее и МК? 

Да, это просто баловство, конечно. Но кому-то может будет полезно. Это во-первых. А во-вторых я хотел добавить вместо дисплея поддержку больших светодиодных матриц. Хотя, это тоже баловство, только немного другое)

b707
Offline
Зарегистрирован: 26.05.2017

Нестор, судя по задаваемым вопросам, опыт в программировании у вас небольшой. Иначе вы бы не ожидали, например, что переменная, обьявленная в скетче, будет доступна в библиотеке (вопрос номер 3 из заглавного поста).
Чтобы разобраться в ваших проблемах, короткие ответы вам не помогут, вам надо серьезно изучать язык.
Другой вариант - разместить заказ на доработку библиотеки в платном разделе, но судя по количеству ошибок, что вы наворотили - это будет недешево

Nestor Mahno
Offline
Зарегистрирован: 03.10.2015

b707 пишет:
Нестор, судя по задаваемым вопросам, опыт в программировании у вас небольшой.

Да вы правы и с получением опыта проблемы.

b707 пишет:
Иначе вы бы не ожидали, например, что переменная, обьявленная в скетче, будет доступна в библиотеке (вопрос номер 3 из заглавного поста).

Да, я не до конца понимаю механизм работы библиотеки. В моем представлении библиотека - это набор функций и вызываю я их после того, как проинициализировал объект (в моем случае 'ttgo') и могу использовать его в этих вызовах. А что скажете по поводу 1  вопроса, я правильно понимаю, что если соответствующие файлы не подключены, они не должны вызывать ошибку или нет? Заранее спасибо за ответ.   

b707 пишет:
Чтобы разобраться в ваших проблемах, короткие ответы вам не помогут, вам надо серьезно изучать язык.

Вот так и учусь. Я не встречал уроков, которые бы помогли мне постичь программирование. Все, что мне попадались не дают понимания многих моментов.

b707 пишет:
Другой вариант - разместить заказ на доработку библиотеки в платном разделе, но судя по количеству ошибок, что вы наворотили - это будет недешево

Это не тот проект, ради которого стоит платить. И мне нужен скорее не конечный результат, а именно его достижение (или постижение). Интерес у меня скорее академический, нежели практический. Но не соглашусь, что я там что-то особого наворотил. Буду копать дальше. 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Nestor Mahno пишет:

Да, я не до конца понимаю механизм работы библиотеки. В моем представлении библиотека - это набор функций и вызываю я их после того, как проинициализировал объект (в моем случае 'ttgo') и могу использовать его в этих вызовах. А что скажете по поводу 1  вопроса, я правильно понимаю, что если соответствующие файлы не подключены, они не должны вызывать ошибку или нет? Заранее спасибо за ответ.   

Библиотекой здесь называют любой внешний файл. А что там - функция или класс надо смотреть в подключаемом файле. Как и функции создаваемого объекта. Обычно к библиотекам идут примеры. В крайнем случае можно открыть сами файлы библиотеки.

Если файлы не подключены - они не вызывают ошибку, но если они отсутствуют, а подключенной библиотеке они нужны - то будет ошибка.

GarryC
Offline
Зарегистрирован: 08.08.2016
Не вижу всего кода проекта, но попробую ответить из общих соображений:
1. Если файлы находятся в директрии, которая помечена, как директория с исходниками и исключения в make файле не приписаны, по компилятор будет пытаться откомпилировать все файлы в этой директрии с подходящим расширением.
2. Если компилятор ругается на отсутствующие методы, то они действительно отсутствуют. Возможные причины, почему Вам кажется, что метод есть - Вы не учитываете сигнатуру метода, важно не только его имя, но и тип параметров (и возвращаемое значение), либо Вы не учитываете квалификатор (виртуальный метод должен быть виртуальным с точки его возникновения).
2.1 Вроде как не должен, странно.
3. В скетче объявляете как угодно, просто Вы должны передавать методам библиотеки информацию о нем (в виде ссылки либо значения).