конфликт функции XY из FastLED с GyverMatrixOS

ae485

✩✩✩✩✩✩✩
29 Апр 2022
21
0
набрал несколько интересных эффектов с портала https://editor.soulmatelights.com/,
адаптировал их для GyverOS, в целом работает, но есть один раздражающий момент:

в Gyver для возврата индекса в ленте по координатам используется GetPixelNumber.
на портале же в скетчах используется функция XY, декларированная в colorutils.cpp из FastLED.

и вот здесь затык. если пытаться добавить XY в Gyver (в utility.ino) как копию функции GetPixelNumber или перименовать в коде скетчей XY на GetPixelNumber - вываливаются ошибки: FastLED-master\src/colorutils.cpp:487: undefined reference to `XY(unsigned char, unsigned char)'

Не понимаю в чем здесь дело.

так объявлена XY в FastLED:
C++:
// Forward declaration of the function "XY" which must be provided by
// the application for use in two-dimensional filter functions.
uint16_t XY( uint8_t, uint8_t);// __attribute__ ((weak));
вот такой код в Gyver (дублирование такую же функции с именем XY выдает ошибки).
C++:
uint16_t getPixelNumber(int8_t x, int8_t y) {
  if ((THIS_Y % 2 == 0) || MATRIX_TYPE) {               // если чётная строка
    return (THIS_Y * _WIDTH + THIS_X);
  } else {                                              // если нечётная строка
    return (THIS_Y * _WIDTH + _WIDTH - THIS_X - 1);
  }
}
пока прикрутил кривенький, но рабочий вариант из примеров FastLED, на который не вываливаются ошибки (на 100% не устраивает, т.к. некоторые эффекты перевернуты):
C++:
const bool    kMatrixVertical = false;
uint16_t XY( uint8_t x, uint8_t y)
{
  uint16_t i;
 
    if (kMatrixVertical == false) {
      if( y & 0x01) {
        // Odd rows run backwards
        uint8_t reverseX = (WIDTH - 1) - x;
        i = (y * WIDTH) + reverseX;
      } else {
        // Even rows run forwards
        i = (y * WIDTH) + x;
      }
    } else { // vertical positioning
      if ( x & 0x01) {
        i = HEIGHT * (WIDTH - (x+1))+y;
      } else {
        i = HEIGHT * (WIDTH - x) - (y+1);
      }
    }
  return i;
}