Неприятный косяк в ИДЕ v1.6.4
- Войдите на сайт для отправки комментариев
Компилял вот такой
#include "arhat.h" #include "tsc.h" #define pinRed pin9 // нога со светодиодом R для плавного управления яркостью #define pinGreen pin4 // нога со светодиодом G для плавного управления яркостью #define pinBlue pin10 // нога со светодиодом B для плавного управления яркостью #define WAIT_STEP 29 // тиков, 30 миллисекунд на 1 шаг изменения яркости #define WAIT_CYCLE 156 // .., 160 миллисекунд паузы между повторением #define WAIT_ON 98 // .., 100 мсек интервал включение контрольного светодиода (pinLed = 13) #define WAIT_OFF 878 // .., 900 мсек интервал выключения контрольного светодиода #define MAX_STEPS 4 #define MAX_HEARTS 3 uint32_t blinkWait; // текущий интервал ожидания. WAIT_ON или WAIT_OFF могут отличаться! uint8_t blinkState; // текущее состояние светодиода. НЕЛЬЗЯ прочитать через digitalRead() !!! uint8_t starts[] = {10,230,20,220,10}; uint8_t steps[] = {20,15,15,10}; // ЭТО ОПРЕДЕЛЕНИЕ ТИПА НЕ РАБОТАЕТ В ИДЕ !!! extern "C" { typedef struct { uint8_t state; uint8_t light; } Hearts_Data; } Hearts_Data heartsData[MAX_HEARTS] = {{ 0, 0}, {0, 0}, {0, 0}}; TSC_Simple hearts[MAX_HEARTS] = { /* start, command, timeout */ { 0, doHeartRed, 0 } ,{ 5000, doHeartGreen, 0 } ,{ 0, 0, 0 } }; void doHeart( Hearts_Data * t) { t++; } /* void doHeart( Hearts_Data * cur ) { uint8_t curMax = starts[cur->state]; uint8_t nextMax = starts[cur->state + 1]; if( nextMax > curMax ){ // яркость - увеличиваем? cur->light += steps[cur->state]; if( cur->light >= nextMax ){ // . дошли до максиума яркости стадии? ++(cur->state); // .. переходим на след. стадию. } } else { cur->light -= steps[cur->state]; if( cur->light <= nextMax ){ // . уменьшаем текущую яркость. Миниум? ++cur->state; // .. переходим на след. стадию. } } if( cur->state >= MAX_STEPS ){ cur->state = 0; // стадии кончились? Всё с начала. }; } */ uint8_t doHeartRed() { doHeart(&heartsData[0]); analogWrite(pinRed, heartsData[0].light); return 0; } uint8_t doHeartGreen() { doHeart(&heartsData[1]); if( ! hearts[2].command ){ hearts[2].command = doHeartBlue; hearts[2].timeout = 3000; hearts[2].started_at = tsc_getTime(); } analogWrite(pinGreen, heartsData[1].light); return 0; } uint8_t doHeartBlue() { doHeart(&heartsData[2]); analogWrite(pinBlue, heartsData[2].light); if( hearts[0].command && heartsData[2].state == 3 ){ hearts[0].command = 0; } else { hearts[0].command = doHeartRed; } return 0; } void setup() { pinMode(pinLed, OUTPUT); // контрольная 13 нога (встроенный светодиод) pwmSet(pinRed); // включаем 4-ю ногу в режим ШИМ (PWM) и на выход pwmSet(pinBlue); // включаем 10-ю ногу в режим ШИМ (PWM) и на выход pwmSet(pinGreen); // включаем 9-ю ногу в режим ШИМ (PWM) и на выход // начальные установки КА: всё в нули, поставят сами при первом вызове blinkWait = blinkState = 0; } void loop() { // пример КА, реализуемый непосредственно внутри вызова макроса: everyOVF(blinkWait, { if( blinkState == 0 ) { blinkState = 1; blinkWait = WAIT_ON; } else { blinkState = 0; blinkWait = WAIT_OFF; } digitalWrite(pinLed, blinkState); }); // Запускаем все КА: for( int i=0; i<MAX_HEARTS; i++) tsc_run( &hearts[i] ); }
скетч и обнаружил косяк, связанный в предобработкой исходного файла в ИДЕ, а именно:
ИДЕ предобрабатывая скетч, выносит в его начало все определения функций из скетча. Вынос производится куда-то в начало, после операторов препроцессора (#define, #include), что приводит к проблеме невозможности вставки определений типов непосредственно в скетч, конкретно в нем - строки 023-029.
В данном случае, функция doHeart() использует определение типа в своем параметре и согласно правилам объявлена после определения типа Hearts_Data .. однако, из-за выноса её объявления в начало скетча и ДО определения типа возникает ошибка компилятора: тип Hearts_Data не определен в скетче... ошибка возникает на строке кода, не имеющей отношения к скетчу, что существенно затрудняет её поиск.
Решение: выносить все определения типов (насчет классов не знаю, не проверял) из скетча в отдельный *.h файл и включать его в скетч типовым образом. Что не есть удобно..
P.S. Может такое поведение где-то и описано, не искал и не встречал .. если нет и это ошибка - отправьте авторам плиз..
P.S. Может такое поведение где-то и описано, не искал и не встречал .. если нет и это ошибка - отправьте авторам плиз..
да - сделайте кто-нибудь что-нибудь, сил нет терпеть, приходится версию arduino-1.6.5-r5 юзать.
А в ней это исправлено, где почитать можно?
А в ней это исправлено, где почитать можно?
да нигде, скорее всего та же песня будет
попробуй сам - скачай в зипе новую версию и расскажи нам.
версия в зипе никуда в реестр не прописывается и ничего тебе не сломает.
Да мне-то нафига? Я ваще ИДЕ не пользую уже. Все как надо работает. Это просто пример к либе, вот и решил проверить как оно в ИДЕ .. 6 часов убил пока доперло.
Я ваще ИДЕ не пользую уже. Все как надо работает.
ну, ок - поделись с народом, чем дуину пользуешь.
kwrite, gedit + bash .. делов-то. :)