Библиотека от IARDUINO, что не нравится компилятору?

В библиотеке 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
                        ^~~

И что ему не нравится?

Ну, он же говорит: unused parameter 'ack'. Что непонятно-то?

да это он решил пятницу подогреть)

2 лайка

ща же скажешь, что не I2C_SW не I2C_HW не определено и понесется…))

кажись определено:

//	Определяем тип реализации шины I2C:												//
		#define iarduino_I2C_SW														//	Объявляем константу iarduino_I2C_SW					- Возможна программная реализация шины I2C.
#if (!defined(pin_SW_SDA) || !defined(pin_SW_SCL))									//	Если выводы не определены пользователем, то ...
		#undef  iarduino_I2C_SW														//		Отменяем объявление константы iarduino_I2C_SW	- Программная реализация шины I2C не возможна (так как выводы не указаны).
	#if defined(ESP8266) || defined(ESP32)											//	Если используются указанные платы, то ...
		#include <Wire.h>															//		Подключаем библиотеку Wire.
		#define pin_SW_SDA 255														//		№ вывода SDA не определён
		#define pin_SW_SCL 255														//		№ вывода SCL не определён
		#define iarduino_I2C_TW														//		Объявляем константу iarduino_I2C_TW				- Будет использована аппаратная реализация шины I2C под управлением библиотеки Wire.
	#elif defined(TwoWire_h)														//	Проверяем не подключена ли библиотека Wire.
		#define pin_SW_SDA 255														//		№ вывода SDA не определён
		#define pin_SW_SCL 255														//		№ вывода SCL не определён
		#define iarduino_I2C_TW														//		Объявляем константу iarduino_I2C_TW				- Будет использована аппаратная реализация шины I2C под управлением библиотеки Wire.
	#elif (defined(SDA) && defined(SCL))											//	Определяем выводы для шины I2C
		#define pin_SW_SDA SDA														//		№ вывода SDA = SDA
		#define pin_SW_SCL SCL														//		№ вывода SCL = SCL
		#define iarduino_I2C_HW														//		Объявляем константу iarduino_I2C_HW				- Будет использована аппаратная реализация шины I2C.
	#elif (defined(PIN_WIRE_SDA) && defined(PIN_WIRE_SCL))							//	Определяем выводы для шины I2C
		#define pin_SW_SDA PIN_WIRE_SDA												//		№ вывода SDA = PIN_WIRE_SDA
		#define pin_SW_SCL PIN_WIRE_SCL												//		№ вывода SCL = PIN_WIRE_SCL
		#define iarduino_I2C_HW														//		Объявляем константу iarduino_I2C_HW				- Будет использована аппаратная реализация шины I2C.
	#elif (defined(SDA1) && defined(SCL1))											//	Определяем выводы для шины I2C-1
		#define pin_SW_SDA SDA1														//		№ вывода SDA = SDA1
		#define pin_SW_SCL SCL1														//		№ вывода SCL = SCL1
		#define iarduino_I2C_HW_1													//		Объявляем константу iarduino_I2C_HW_1			- Будет использована аппаратная реализация шины I2C-1.
	#else																			//	Если выводы определить не удалось, то ...
		#define pin_SW_SDA 255														//		№ вывода SDA не определён						- Аппаратная  реализация шины I2C не возможна.
		#define pin_SW_SCL 255														//		№ вывода SCL не определён						- Аппаратная  реализация шины I2C не возможна.
	#endif																			//
#endif																				//

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

Я наверно пропустил словосочетание “могут быть”.

Да, не юзабельный он! Он не используется! Если при сборке не определены ни iarduino_I2C_HW, ни iarduino_I2C_SW, то этот параметр никак и нигде не используется.

Поставьте после строки №30 (или после строки №2) строку

   (void)ack;

и будет Вам много счастья!

А вообще, совет: библиотеки от Гивера, просто шедевр программистского искусства по сравнению с библиотеками от iarduino. Если видите в начале названия “iarduino” - немедленно бросьте каку и вымойте руки!

2 лайка

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

Кривые моменты даже у adafruit временами выплывают, так что хочешь сделать хорошо, сделай сам.
ЗЫ: подглядывать за другими временами даже полезно

2 лайка

Но я думаю, что это фишки против угона библиотек и своих находок. Борьба за сохранение своего рабочего места и зарплаты.

ну да в библиотеке TFT точно есть

може всё дело в том, что библиотека не видит определений SDA и SCL, а они о в ядре точно есть, писатель оной забыл что-то указать?

я Вам уже сказал, что

А функция написана так, что при таком раскладе параметр ей не нужен.

Всё. Больше никаких причин нет, не выдумывайте, хватит об этом.

Петрович, я не об этом, почему определения из CORE не видятся в библиотеке и, что надо сделать, чтобы виделись, библиотека просто как пример как не надо делать, хотелось бы знать - как надо

Никаких вопросов (по крайней мере понятных), кроме как

В теме не было.

А прежде чем спрашивать “как надо?”, необходимо объяснить “что надо?”. Этого в теме тоже не было.

Как-то на старом форуме была тема, как сделать так, чтобы дефайны из скетча передавались в библиотеку, поиском не нашёл, а в тот момент я ещё “был в неготовности своей как рак-отшельник”, на сей момент надеюсь, что “лохматость повысилась” )))

Никак.

понятно, подход к написанию библиотеки в принципе не верный

Наколото на правой руке рукоблуда! :wink: :wink: :wink:

А если без моих шуточек, то конечно нет. Иначе придется и в жизни не ходить в кабаки, пить только самогон и домашнее пиво. Это еще норм, и даже портки себе пошить не сложно. Но ведь и ткань придется ткать и горшки лепить и даже ложки люминёвые отливать в двух кирпичах… (кирпичи сперва… ну вы поняли!)
Бред это всё. Конечно нужно обязательно использовать чужие библиотеки, если важно кончить, а не подрочить (это метафора). И да, стоит сперва на их код посмотреть, даже не анализируя каждую строку, программист обычно увидит качество кода по косвенным признакам.

Если бы это было не так, мы бы никогда не увидели даже ДОС. Уже на уровне ДОС невозможно в одно рыло написать программу. И если доходить до маразма, а тут мы таких видали, все помнят “пришествие де Дивана”, то нельзя функциями wiring пользоваться и вообще только голым контроллером. Такие тоже забегали: “…я пишу только в Атмел Студио”. Даже использование С++ и SDK от производителя - и то под вопросом…
Чистый АСМ и ДатаШит на камень. И ни строчки кода, которую ты лично не нацарапал обгрызенным ногтем на глиняной дощечке! Токатак!!!