Мужики, во попёрло!
Давеча тут Дарт Вейдер звонил, говорит, что затеяли они писать новую прошивку для истребителя TIE Fighter, но выяснилось, что компания-производитель (Sienar Fleet Systems), своими идиотскими мерами по экономии фонда оплаты труда, разогнала всех программистов и новую версию прошивки писать некому! Решили нанять меня! Обещали целый мешок вупиупи или полмешка имперских кредитов на мой выбор!
Ну, чё, посмотрел я ТЗ, начал писать. Там типа при включении питания можно заранее нажать кнопку, чтобы система включилась нормальном рабочем режиме (а если не зажимать, то включается в сервисном режиме). Стало быть, сразу после включения нужно проверять нажатость кнопки и начинать работать в выбранном режиме.
В нормальном режиме она должна приветствовать пилота фразой “Да прибудет с тобою Сила!”, а в сервисном – вывести температуру обоих ионных двигателей (датчик внешний, всё делает сам, нам надо только вывести считанные “попугаи”).
Ну, с этого решил и начать. Написал
вот такой код
////////////////////////////////////////////////////////
//
// TIE fighter's electronic control unit 2.0
//
// Заказчик: Sienar Fleet Systems, Галактическая Империя
// Контактное лицо: Darth Vader
//
////////////////////////////////////////////////////////
//
// Назначение пинов
//
static constexpr uint8_t pinModeButton = 4;
static constexpr uint8_t pinEngine1Temp = A0;
static constexpr uint8_t pinEngine2Temp = A1;
//
// Стартовое сообщение (в зависимости от режима работы)
// Cообщение о сервисном режиме должно быть НЕ ДЛИННЕЕ стандартного!
//
char * welcomeMessage = (char *) "TIE Fighter ECU standard mode!\r\n";
char * serviceMessage = (char *) "TIE Fighter ECU service mode\r\n";
//
// Функция проверяет в каком режиме запущен ECU
// Если кнопка на pinModeButton НЕ нажата, то это сервисный режим (возвращается false)
// Если кнопка на pinModeButton нажата, то это стандартный режим (возвращается true)
// Также, в случае сервисного режима, заменяет приветсвенное сообщение
// welcomeMessage на serviceMessage. Последнее короче (не длиннее),
// так что выхода за границы не будет.
//
static inline bool defineOperationalMode(void) {
pinMode(pinModeButton, INPUT_PULLUP);
const bool result = digitalRead(pinModeButton) == LOW; // true, если нажата (стандартный режим)
if (! result) strcpy(welcomeMessage, serviceMessage);
return result;
}
void setup (void) {
Serial.begin(9600);
const bool isModeStandard = defineOperationalMode(); // если false, то сервисный режим
Serial.println(welcomeMessage);
if (isModeStandard) { // Основной режим
Serial.println("TIE fighter is ready, sir!");
Serial.println("May the Force be with you!");
} else { // Сервисный режим
Serial.println("On-board sensor readings:");
Serial.print("Ion engine #1 temperature: ");
Serial.print(analogRead(pinEngine1Temp) + 32.0);
Serial.println("F");
Serial.print("Ion engine #2 temperature: ");
Serial.print(analogRead(pinEngine2Temp) + 32.0);
Serial.println("F");
}
}
void loop(void) {}
Запускаю с нажатой кнопкой (в обычном режиме). Смотрю.
вроде, всё красиво
TIE Fighter ECU standard mode!
TIE fighter is ready, sir!
May the Force be with you!
Запускаю с отпущенной кнопкой (в сервисном режиме)
и вижу такую хрень
TIE Fighter ECU service mode
On-board sensor readings:Ion engine #1 temperature: 479.00FIon engine #2 temperature: 430.00F
Не понял! Этошоза…? У меня же в коде при выводе буквы F
явно прописано Serial.println
(строки №52 и №55)! Да и в строке №49 – тоже должна новая строчка при печати начаться! С каких это, простите, пор println
перестал переводить строки? И как его заставить это делать?
В общем и так я и эдак, уже и дополнительные Serial.println();
ставил и даже по нескольку штук – не работает – слипаются все строки в одну и хучь ты сдохни.
В общем, правильно мне говорили – не связывайся с этим лживым, грязным IDE, пиши на чистом и кошерном (а ещё лучше на волшебном асме, где само всё правильно пишется!), так нет же …
Выручайте, а не то – плакали мои вупиупи.
P.S.
Примеры запускались на IDE 2.2.1 и 2.3.2. Работать, в принципе, будет на любой версии GCC, но на какой-то может потребоваться дополнительное смещение или перестановка местами строк.