С++ Переменная не была объявлена ​​в этой области в расширении макроса

Уважаемые Stackoverflowers,

Я пытаюсь добавить поддержку esp32 в 3,5-дюймовый TFT-дисплей HX8357D от Adafruit (ссылка). Я сделал форк библиотеки от Adafruit (ссылка), которая обрабатывает 8-битный параллельный интерфейс и добавила ветку esp32. Я выяснил большинство необходимых компонентов, но у меня возникли проблемы с компиляцией кода. Может ли кто-нибудь помочь мне заставить его работать?

Я сделал скетч Arduino с кодом, который нужно внедрить в библиотеку:

//Not used in this sketch, but these are the 5 control pins for the TFT display
#define LCD_CS 27
#define LCD_CD 26
#define LCD_WR 25
#define LCD_RD 14
#define LCD_RESET 13

//8 data pins (random, but made sure they are all ardressable with one register)
#define DATA_PIN0 3
#define DATA_PIN1 18
#define DATA_PIN2 5
#define DATA_PIN3 17
#define DATA_PIN4 16
#define DATA_PIN5 4
#define DATA_PIN6 2
#define DATA_PIN7 15

#define DELAY     200

gpio_config_t io_conf;

//Some random data to write to the gpio pins, creates a pattern to the LED's that I connected
uint32_t data[] {
  0b00000000000000001000000000001000,
  0b00000000000001000000000000000100,
  0b00000000000000000000000000110000,
  0b00000000000000110000000000000000,
  0b00000000000000000000000000000000,
  0b00000000000000110000000000000000,
  0b00000000000000000000000000110000,
  0b00000000000001000000000000000100,
  0b00000000000000001000000000001000
};

void setup() {
  Serial.begin(115200);
  setReadDir();
  print32Bits(GPIO.in);
  setWriteDir();
}

void loop() {
  for (int i = 0; i < 9; i++) {
    GPIO.out_w1tc = 0xFFFFFFFF;
    GPIO.out_w1ts = data[i];
    delay(DELAY);
  }
}

//Set 8 data pins to OUTPUT
void setWriteDir() {
  io_conf.intr_type = GPIO_INTR_DISABLE;
  io_conf.mode = GPIO_MODE_OUTPUT;
  io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
  io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
  io_conf.pin_bit_mask =  ((1ULL << DATA_PIN0 ) | (1ULL << DATA_PIN1) | (1ULL << DATA_PIN2) | (1ULL << DATA_PIN3) | (1ULL << DATA_PIN4) | (1ULL << DATA_PIN5) | (1ULL << DATA_PIN6) | (1ULL << DATA_PIN7)); // of course, do like this all the pins
  gpio_config(&io_conf);
}

//Set 8 data pins to INPUT
void setReadDir() {
  io_conf.intr_type = GPIO_INTR_DISABLE;
  io_conf.mode = GPIO_MODE_INPUT;
  io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
  io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
  io_conf.pin_bit_mask =  ((1ULL << LCD_CS ) | (1ULL << LCD_CD) | (1ULL << LCD_WR) | (1ULL << LCD_RD) | (1ULL << LCD_RESET)); // of course, do like this all the pins
  gpio_config(&io_conf);
}

//Function to print 32 bit interger to Serial, just for convenience
void print32Bits(uint32_t myByte) {
  for (uint32_t mask = 0x80000000; mask; mask >>= 1) {
    if (mask  & myByte) {
      Serial.print('1');
    } else {
      Serial.print('0');
    }
  }
  Serial.println();
}

Я добавил нужный код в ADAFRUIT_TFTLCD.h, ADAFRUIT_TFTLCD.cpp и pin_magic.h

Функции в pin_magic.h (write8inlin и read8inlin) еще не полностью выполнены. Я попытался скомпилировать код, чтобы проверить, правильно ли компилируется то, что я сделал до сих пор, но я получаю много ошибок ....was not declared in this scope.

В pin_magic.h у меня есть:

#define RD_ACTIVE  GPIO.out_w1tc |=  rdPinset
#define RD_IDLE    GPIO.out_w1ts |=  rdPinSet
#define WR_ACTIVE  GPIO.out_w1tc |=  wrPinset
#define WR_IDLE    GPIO.out_w1ts |=  wrPinSet
#define CD_COMMAND GPIO.out_w1tc |=  cdPinset
#define CD_DATA    GPIO.out_w1ts |=  cdPinSet
#define CS_ACTIVE  GPIO.out_w1tc |=  csPinset
#define CS_IDLE    GPIO.out_w1ts |=  csPinSet

Первая часть ошибки, которую я получаю:

D:\ProgramData\Arduino\libraries\TFTLCD-Library\pin_magic.h:389:42: error: 'csPinset' was not declared in this scope

     #define CS_ACTIVE  GPIO.out_w1tc |=  csPinset

                                          ^

D:\ProgramData\Arduino\libraries\TFTLCD-Library\Adafruit_TFTLCD.cpp:268:5: note: in expansion of macro 'CS_ACTIVE'

     CS_ACTIVE;

     ^

Если бы кто-то с большим опытом работы с C/C++ мог взглянуть на это, я был бы очень благодарен.


person Daan van Driel    schedule 17.09.2018    source источник
comment
опубликуйте точные сообщения об ошибках и минимально воспроизводимый пример   -  person Alan Birtles    schedule 17.09.2018
comment
Serial, setReadDir, print32Bits и многие другие нигде не определены. Может быть, вы забыли некоторые #include (упомянутые вами заголовки) в начале?   -  person CristiFati    schedule 17.09.2018
comment
Извините за неконкретность вопроса, я постарался как можно лучше обрисовать ошибку. Я добавил именно те строки кода, которые неверны с точки зрения компилятора. @CristiFati Пример кода представляет собой всего лишь эскиз Arduino, функции не являются частью библиотеки, а просто проверяют, как управлять контактами gpio esp32.   -  person Daan van Driel    schedule 17.09.2018
comment
csPinSet != csPinset - если это намеренно, то это очень плохая идея.   -  person 500 - Internal Server Error    schedule 17.09.2018


Ответы (1)


Я посмотрел на ваш код, вы компилируете его на своем ПК? Похоже, что компилятор игнорирует объявление csPinset и т. д. из-за вашего блока #ifdef -

Я не знаком со средой AVR, но я рекомендую скомпилировать ваш код с помощью правильного компилятора (например, совместимого с AVR) в предполагаемой среде. Кроме того, вы также можете определить __ AVR __ во время компиляции, используя параметр -D:

g++ ‹ имя_файла.cpp › -D__AVR__

РЕДАКТИРОВАТЬ

Чтобы убедиться, что нужные вам переменные объявлены для всей среды, вы можете изменить файл заголовка на что-то вроде этого:

#ifndef USE_ADAFRUIT_SHIELD_PINOUT
  
    #ifdef AVR
        // "Variable declaration for AVR goes here"

    #elif defined SAM
       //"Variable declaration for SAM goes here"

    /*else block, in case ESP32 is not the correct macro name*/
    #else
      //"General Variables for everything else other than SAM or AVR."
    #endif
  
//in case the ADA SHIELD PINOUT is defined
#else
//"General Variables for when USE_ADAFRUIT_SHIELD_PINOUT is defined."

#endif

Это должно исправить переменную, не объявленную ошибку. Вы можете узнать или спросить на https://arduino.stackexchange.com, как правильно настроить этот заголовок для среды ESP32.

person Malloc    schedule 17.09.2018
comment
Для компиляции кода я использую Arduino IDE с ядром esp32 Arduino. Я не уверен, как называется компилятор, но он поставляется с ядром esp32 Arduino, и я думаю, что он такой же, как тот, который используется с esp-idf. Если я выберу плату AVR, например Arduino в среде IDE, все будет нормально компилироваться. - person Daan van Driel; 17.09.2018
comment
Ах! Поэтому я считаю, что компиляция будет работать только для AVR и SAM3X8E. ваш исходный код использует эти переменные для всех архитектур — AVR, ESP32, SAM3X8E и т. д. Но путем определения их в блоке #ifdef AVR & SAM3X8E , вы ограничиваете определение переменной только аркой AVR и SAM. Добавьте общий блок else, определяющий переменные, если архитектура отличается от AVR или SAM3X8E в Adafruit_TFTLCD.h. Это должно решить вашу проблему - person Malloc; 17.09.2018
comment
Это именно то, что я пытаюсь сделать ;). Если вы посмотрите на файлы в ссылка, вы увидите, что я добавил похожие #ifdef заявления для ESP32. Проблема в том, что компилятор почему-то выдает мне ошибки как в примере: 'csPinset' was not declared in this scope. Я попытался сделать часть ESP32 такой же, как AVR и SAM3X8E, но что-то пошло не так. - person Daan van Driel; 18.09.2018
comment
Я отредактировал свой ответ. Это гарантирует, что переменные объявлены, несмотря ни на что! Если вы по-прежнему получаете ту же ошибку даже после внесения предложенных изменений, виновником является порядок включения файла заголовка. stackoverflow .com/questions/865785/ - person Malloc; 18.09.2018