Игра “Шарики в колбах”

Да ну, не. Я помню в каком то дисплее была возможность одной командой ворочать. Просто в st7789 Алиса дала список там всяких, отключи, включи дисплей, переведи в эконом и т.д. , а про поворот при выводе данных нет. Конечно это не проблема, но математику к изображениям (буквы, картинки) лень применять :slight_smile: Напишу, если найду куда , авторам, дисплей редкий, библиотека должна быть хорошая, а не халтура.
… вот кстати функция инверсии цвета:

void ERGFX::invertDisplay(boolean i) {
  // Do nothing, must be subclassed if supported
}

Я понимаю, что могу сделать вне библиотеки, но всё же.

А у дисплея интерфейс SPI или i2c?
В принципе взять datasheet и нарисовать свою библиотеку.
Если с математикой дружен то думаю проблем не возникнет.

SPI интерфейс.

Это не функция поворота, это функция установки ориентации дисплея, что следует из названия (повернтуть - to rotate, но никак не setRotation).
Да и написана, честно говоря, кривовато…

void ERGFX::setRotation(uint8_t x) {
  if(x&1) {
    _width  = HEIGHT;
    _height = WIDTH;
  } else {
    _width  = WIDTH;
    _height = HEIGHT;
  }
}

Ни разу не видел у цветных дисплеев интерфейс I2C. Вы хоть представляете, насколько медленно в этом случае там все будет шевелиться?
Обычно у цветных дисплеев выбор между SPI и параллельным.

Наверное, потому что изображение никак не реагирует на неё.

а что, не срабатывает? вроде должно:

void Adafruit_ST7789::init(uint16_t width, uint16_t height) {
  commonInit(NULL);

  _colstart = ST7789_240x240_XSTART;
  _rowstart = ST7789_240x240_YSTART;
  _height   = 240;
  _width    = 240;

  displayInit(cmd_240x240);

  setRotation(0);

Я другое ПО использую, дисплей 76Х284. Если запускать как 240Х240 некорректно работает, а как корректно сделать пока лень думать.

init(uint16_t width, uint16_t height) 
init(76,284);

Не знаю, я пробовал в других ходовых библиотеках, срали они на init(76,284); .
Всё также как на 240х240. Я так понимаю все пиксели смещены по осям на некоторые позиции и инвертированы цвета. Из-за этого видимо писатели не мучаются с поворотом, а без него неудобно пользоваться дисплеем.

Может тут как махоньким оледом у вас, типа отсчет не с нуля и не до конца(чё там было уже не помню)

если есть работающая уже библиотека можно добавить дисплей в TFT_eSPI, я для себя так сделал, там ротация работает

Да, похоже с учётом строки в функции:

 x0+=0x52; x1+=0x52;   y0+=0x12; y1+=0x12;
void ST7789::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1,
 uint16_t y1) {
 x0+=0x52; x1+=0x52;   y0+=0x12; y1+=0x12;
  writecommand(ST7789_CASET); // Column addr set
  writedata(x0 >> 8);
  writedata(x0);     // XSTART 
  writedata(x1 >> 8);
  writedata(x1);     // XEND

  writecommand(ST7789_PASET); // Row addr set
  writedata(y0>>8);
  writedata(y0);     // YSTART
  writedata(y1>>8);
  writedata(y1);     // YEND

  writecommand(ST7789_RAMWR); // write to RAM
}

Вот именно.
А на функцию поворота должно было бы реагировать.

Переменная rotation член класса, ее тоже надо запомнить (венгерская нотация наше все, да кто ж ее чтит…)
Маскируется, видимо, чтобы не установить невалидные значения. Так-то предохраняемся assert-ами, но в МК такое не прокатывает.

Точно?! А мужики-то и не знали :frowning:

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

Я что-то не так делаю?
Или … может, Вы их “готовить не умеете”?

1 лайк

Вы правы. Наверное в этой экосистеме я ими еще не умею пользоваться. Пока сложность моих алгоритмов не требует необходимости ассерты расставлять.

Привычная реакция на сработавший ассерт - это аварийный останов программы с выводом в консоль аварийного условия. При запуске под отладчиком - точка останова на условии.

Как это выглядит на ардуинке? В консоли терминалки появится? А дальше висит или ребут? И сборка дебаг-релиз тоже управляемо прямо в “оболочке для блондинок”?

А как напишете, так и будет. Надо, чтобы останавливалось - будет останавливаться, надо, чтобы продолжало работу - будет работать дальше

2 лайка

Возможны любые варианты. Просто мёртво висит, что-то делает (выводит в консоль или на экран, если есть, зажигает светодиоды, сохраняет несохраненные данные в еепром или на сд-карту), “а после виснет” или “а после продолжает работу”. Как напишете, так и будет работать.

Если в #define или в опциях компилятора определить макрос NDEBUG, то всё отключится, assert превратится в пустышку void(0).

Кстати, static_assert тоже отлично работает, я его тоже постоянно использую.

1 лайк

Приятно, все как у взрослых 8)))

Я-то уж совсем поначалу смирился с детскостью оболочки. Даже попыток не делал, хватало “играть в шахматы в уме”, благо не сложный код пока (ну для меня).