В библиотеке iarduino_I2C_Relay_I2C.h есть такая виртуальная функция на которую ругается компилятор:
// Функция нижнего уровня - получение одного байта данных: // Определяем функцию получения одного байта (в любом месте между байтом адреса с битом RW=1 и сигналом STOP).
uint8_t getByte(bool ack){ // Аргумент: бит подтверждения ACK/NACK
// 1 2 3 4 5 6 7 8 9 //
// SCL: _ _ _ _____/\_/\_/\_/\_/\_/\_/\_/\__/\_____ _ _ _ //
// __ // Получение 1 байта, каждый бит читается мастером по фронту тактирубщих импульсов. На 9 тактирубщем импульсе мастер отвечает ACK («0» - «давай еще»), или NACK («1» - «хватит»)
// SDA: _ _ _ ___/----------DATA-----------<__\____ _ _ _ //
// вход выход //
#if defined(iarduino_I2C_HW) //
// Если используется аппаратная шина I2C: //
uint16_t i=60000L; // Определяем счётчик указывая максимальное количество циклов для ожидания.
TWCR = _BV(TWINT) | _BV(TWEN) | ack<<TWEA; // Определяем значение регистра управления TWCR: устанавливаем биты TWINT (флаг прерывания) и TWEN (бит разрешения работы шины), а бит TWEA (бит разрешения подтверждения) устанавливаем только если мы собираемся отправить ведомому бит подтверждения получения данных ACK.
while((!(TWCR & _BV(TWINT))) && i){i--;} // Ждём сброса флага прерывания TWINT в регистре управления TWCR, но не дольше чем i циклов
if((TWSR & 0xF8)==0x50 && ack){return TWDR;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0x50, значит данные приняты и сохранены в регистре TWDR, а ведомому отправлен бит ACK.
if((TWSR & 0xF8)==0x58 && !ack){return TWDR;} // Проверяем значение регистра статуса TWSR: если его значение с маской 0xF8 равно 0x58, значит данные приняты и сохранены в регистре TWDR, а ведомому отправлен бит NACK.
return 0; // Если предыдущая строка не вернула принятый байт из регистра данных TWDR, значит мы не приняли байт, возвращаем 0.
#elif defined(iarduino_I2C_SW) //
// Если используется программная шина I2C: //
bool i=true; // Определяем флаг возвращаемый данной функцией.
uint8_t j=8; // Определяем счётчик количества полученных битов байта.
uint8_t k=0; // Объявляем переменную для хранения прочитанного байта данных.
setSDA(1); // Переводим вывод SDA в режим входа с подтяжкой к Vcc
while(j){ j--; // Получаем 8 бит байта в цикле
if(!setSCL(1) ) {i=false;} // Устанавливаем «1» на линии SCL (Фронт тактирующего импульса). Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false.
if( getSDA( ) ) { k |= (1<<j); } // Заполняем биты байта k в соотсетствии с уровнем на линии SDA
setSCL(0); // Устанавливаем «0» на линии SCL (Спад тактирубщего импульса)
} setSDA(!ack); // Устанавливаем бит «ACK/NACK» на линии SDA (ACK-прижимаем, NACK-отпускаем)
if(!setSCL(1) ) {i=false;} // Устанавливаем «1» на линии SCL (Фронт тактирующего импульса). Если ведомый удерживает линию SCL прижатой, то функция ждёт освобождения линии и, если не дождётся, то возвращает false.
setSCL(0); // Устанавливаем «0» на линии SCL (Спад тактирубщего импульса)
return i?k:0; // Если во время ожидания поднятия логического уровня на линии SCL, cчётчик i не дошел до 0, то функция вернёт байт из переменной k.
#else //
// Если тип шины I2C не поддерживается или не определён: //
return 0; // Возвращаем false
#endif //
} //
Ругается так:
c:\ARDUINO\libraries\iarduino_I2C_Relay\src/iarduino_I2C_Relay_I2C.h: In member function 'virtual uint8_t iarduino_I2C::getByte(bool)':
c:\ARDUINO\libraries\iarduino_I2C_Relay\src/iarduino_I2C_Relay_I2C.h:395:24: warning: unused parameter 'ack' [-Wunused-parameter]
uint8_t getByte(bool ack){ // Аргумент: бит подтверждения ACK/NACK
^~~
Да, не юзабельный он! Он не используется! Если при сборке не определены ни iarduino_I2C_HW, ни iarduino_I2C_SW, то этот параметр никак и нигде не используется.
Поставьте после строки №30 (или после строки №2) строку
(void)ack;
и будет Вам много счастья!
А вообще, совет: библиотеки от Гивера, просто шедевр программистского искусства по сравнению с библиотеками от iarduino. Если видите в начале названия “iarduino” - немедленно бросьте каку и вымойте руки!
у них есть достоинство, они красиво смотрятся в нотепаде и каждая строка прокомментирована, а работать никто и не обещал, даже на сайте написано что консультируют только по продажам товара )))
Петрович, я не об этом, почему определения из CORE не видятся в библиотеке и, что надо сделать, чтобы виделись, библиотека просто как пример как не надо делать, хотелось бы знать - как надо
Как-то на старом форуме была тема, как сделать так, чтобы дефайны из скетча передавались в библиотеку, поиском не нашёл, а в тот момент я ещё “был в неготовности своей как рак-отшельник”, на сей момент надеюсь, что “лохматость повысилась” )))
А если без моих шуточек, то конечно нет. Иначе придется и в жизни не ходить в кабаки, пить только самогон и домашнее пиво. Это еще норм, и даже портки себе пошить не сложно. Но ведь и ткань придется ткать и горшки лепить и даже ложки люминёвые отливать в двух кирпичах… (кирпичи сперва… ну вы поняли!)
Бред это всё. Конечно нужно обязательно использовать чужие библиотеки, если важно кончить, а не подрочить (это метафора). И да, стоит сперва на их код посмотреть, даже не анализируя каждую строку, программист обычно увидит качество кода по косвенным признакам.
Если бы это было не так, мы бы никогда не увидели даже ДОС. Уже на уровне ДОС невозможно в одно рыло написать программу. И если доходить до маразма, а тут мы таких видали, все помнят “пришествие де Дивана”, то нельзя функциями wiring пользоваться и вообще только голым контроллером. Такие тоже забегали: “…я пишу только в Атмел Студио”. Даже использование С++ и SDK от производителя - и то под вопросом…
Чистый АСМ и ДатаШит на камень. И ни строчки кода, которую ты лично не нацарапал обгрызенным ногтем на глиняной дощечке! Токатак!!!