GPIO для чайников (часть 6)
-
Не беда.
Все наладится. -
У меня не получилась автозагрузка как предлагает автор. Почему? Разбираться не стал, оставил на потом. Предполагаю, что предложенный автором способ заключается в вызове программы до запуска графической оболочки LXPanel. Я пошел иным путем, а именно включил функцию вызова программы в меню LXPanel и заставил ее выполняться после полной загрузки RPI, тем самым она работает в фоновом режиме и не мешает работе других приложений. Правда кроме звука визуально ничего не говорит о ее присутствии. Т.е. можно применять как чистое радио без клавы, мыши и пр. или полноценно как фоновую среду. На кнопочку отзывается из под любого приложения ну а удалить можно так как предлагает автор из LxTerminala Killall radio. На кнопку q у меня почему-то. хотя думаю понятно почему, не срабатывает, да это и к лучшему, не будет мешать другим приложениям.
Коротко:- В /usr/bin создал скрипт или исполняемый файл, не знаю как корректно выразиться, radio c содержимым
#! /bin/sh cd /home/pi/ sudo ./radio
- В /usr/share/applications/ , /home/pi/desktop , /home/pi/config/autostart создал файл radio.desktop c содержимым:
[Desktop Entry] Name=internet-radio Encoding=UTF-8 Comment=Amateur radio weak signal communications Exec=/usr/bin/radio TryExec=radio Terminal=true Type=Application Categories=AudioVideo;Audio;Player;GTK; Icon=radiotray
Может в какой из указанных папок и не нужно было вставлять его (radio.desktop). но у меня так получилось,
Теперь в главном меню в пункте Sound&Video появился пункт internet-radio и его при желании можно запускать непосредственно из главного меню. Категорию и иконку я взял от Radiotray, т.к. это ближе к теме, но можно указать любую другую или создать собственную указав в Categories=, хотя если честно, то я не пробовал. Икону также взял готовую от radiotray, свою создавать не пробовал.
Для того, чтобы программа не загружалась автоматически необходимо удалить radio.desktop из папки /home/pi/config/autostart.
Все. -
Надеюсь последний на сегодня мой комментарий.
При работе этой программы получаем 100% загрузку процессора и если пользуем ее в фоновом режиме, то это не очень хорошо, поэтому предлагаю лобовое решение по снижению загрузки проца до 15-20% без заметной потери функциональности. Просто несколько увеличилось время нажатия кнопки и все. Дискомфорта у мня такое решение не вызвало. Итак модифицируем одну строку:
while(bcm2835_gpio_lev(PIN_IN)){delay(1000);} // Просто ждём, пока не будет нажата кнопка управления
т.е. добавлен delay(1000);
Все. -
Несовсем верный вывод. Это в Виндусе, если показывается 100% загрузка процессора, значит компьютер задохнулся от возложенных на него задач и находится на грани зависания. В Линуксе на вашем RPi индикатор загрузки процессора показывает не его реальную загрузку, а скорее процент загрузки свободного времени. Если вы запустите ещё какое-либо приложение, оно спокойно запустится и будет работать. Просто на опрос кнопки процессор будет выделять меньше своего свободного времени. Задачи же имеющие более высокий приоритет, чем наша программа, сами прекрасно отберут себе ресурсов столько, сколько им нужно. Опрос состояния кнопки не является ресурсоёмкой задачей, поэтому и не представляет для процессора сколь-либо заметной нагрузки. Но раз у процессора куча свободного времени и делать ему больше нечего, он с удовольствием отдаёт всё своё свободное время процессу опроса кнопочки. Разумеется, если мы запусти несколько десятков тысяч процессов опроса кнопки, то они уже реально смогут загрузить процессор.
И ещё, если вы продолжаете использовать RPi как десктоп, то в репозитариях есть масса уже готовых интрнет-приёмников с графической оболочкой и тысячами радиостанций в плей-листе. Так что в вашем случае лучше выбрать одну из таких программ. (просто вбейте в поиск репозитария слово radio и выбирайте любую). -
Спасибо за разъяснение работы индикатора загрузки. Я не заядлый любитель линукс, но чисто визуально мне показалось, что при индикации полной загрузки процессора другие приложения прихрамывают, но это видимо отдельная тема.
Что касается второго вопроса о графической оболочке, то Вы видимо меня не совсем поняли. Я предложил иной способ загрузки прогаммы интернет радио в отличии от Вашего, т.к. Ваша методика у меня не сработала. Т.е. при описанном мною способе программа так же как и Вас загружается при включении RPI без клавы, мыши и пр.. Включил и получил радио, управляемое кнопкой. Ну так у меня получилось и не надо меня ругать. Это работает. Просто я имел в виду, что при таком способе сохраняется возможность полноценно применять графическую оболочки, при условии, что это необходимо. Еще раз повторюсь, что окна программы не видно. но кнопка работает. Может изложил сумбурно, но все это работает именно так как описано в Ваших техусловиях. -
Еще раз про загрузку программ из графической оболочки.
Как я понял есть программы, которые необходимо запускать именно при работаещей графике. Я столкнулся с этим при экспериментах с радиолюбительской программой WSPR. Все попытки загрузить эту прогу без графической оболочки у меня провалились. Это видимо от незнания и непонимания, но тем не менее результат был достигнут и прога стала загружаться автономно, т.е. при включении питания RPI. И я не вижу ничего зазорного при таком подходе. Может кому и пригодится. -
Ну дак а я вас и не ругаю. Способ, который описал я, является стандартным способом автозапуска приложений в Линуксе. Это не моё изобретение. Почему он у вас не сработал, я ничего сказать не могу, т.к. тоже в Линуксе чайник и сам с ним разбираюсь потихоньку.
-
Х-сервер (который запускается при старте графической оболочки LXDE, либо другой) требуют программы, которые для отображения графики используют его API. Грубо говоря, если интерфейс этих программ выглядит в виде типичного окна со стандартными кнопочками, то разумеется, просто в терминале такая программа не заработает. Есть программы, которые с графикой работают напрямую. Им LXDE тоже ненужен. В основном это либо игрушки, либо всякие демки с красивыми визуальными эффектами. А есть программы с псевдографическим интерфейсом, это когда графика рисуется в терминале печатными символами. Им тоже LXDE без надобности.
-
ОК!
Будем работать над ошибками.
Мой респект Вам! -
Куда уж подробнее. И так всё разжёвано
-
Здравствуйте!
А не могли бы рассмотреть работу RPI и датчика температуры DS18B20? -
У меня нет такого датчика. Создайте тему в форуме. Не я, так кто-нить другой подскажет.
-
Привет всем!
По поводу кода возник следующий вопрос:
В какое место кода добавить write(); чтобы передать работающему дочернему процессу кнопку ENTER сразу после открытия станции? и как правильно передать нажатие этой кнопки? в ascii?
Пробую с другими плеерами ибо omx не установился на archlinux. -
в случае с mocp плеером можно запустить один раз в начале сервер
execlp("mocp", "mocp", "-S", NULL);
а затем каждую радиостанцию скармливать ему с параметром -l
вот только после запуска сервера программа завершает свою работу.
что тут можно придумать? -
У меня вылазят ошибки при компиляции
radio.c:32:1: warning: excess elements in scalar initializer [enabled by default] radio.c:32:1: warning: (near initialization for ‘station1’) [enabled by default] radio.c:33:1: warning: excess elements in scalar initializer [enabled by default] radio.c:33:1: warning: (near initialization for ‘station2’) [enabled by default] radio.c:34:1: warning: excess elements in scalar initializer [enabled by default] radio.c:34:1: warning: (near initialization for ‘station3’) [enabled by default] radio.c:35:1: warning: excess elements in scalar initializer [enabled by default] radio.c:35:1: warning: (near initialization for ‘station4’) [enabled by default] radio.c: In function ‘play_station’: radio.c:91:17: warning: passing argument 1 of ‘do_child’ from incompatible pointer type [enabled by default] radio.c:43:6: note: expected ‘char **’ but argument is of type ‘char *’ radio.c:92:17: warning: passing argument 1 of ‘do_child’ from incompatible pointer type [enabled by default] radio.c:43:6: note: expected ‘char **’ but argument is of type ‘char *’ radio.c:93:17: warning: passing argument 1 of ‘do_child’ from incompatible pointer type [enabled by default] radio.c:43:6: note: expected ‘char **’ but argument is of type ‘char *’ radio.c:94:17: warning: passing argument 1 of ‘do_child’ from incompatible pointer type [enabled by default] radio.c:43:6: note: expected ‘char **’ but argument is of type ‘char *’
в чем причина?
-
Спасибо за интересную и полезную статью! Хорошая статья и ее реализация! Только вот у меня не компилируется кнопка, а об этой программе вообще нет смысла говорить... надо разобраться с работой кнопки...
-
Код копирую - вставляю... и десяток ошибок при компиляции... ничего не пойму... как так может быть... что не так...
radio.c:32:1: warning: excess elements in scalar initializer [enabled by default] radio.c:32:1: warning: (near initialization for ‘station1’) [enabled by default] radio.c:33:1: warning: excess elements in scalar initializer [enabled by default] radio.c:33:1: warning: (near initialization for ‘station2’) [enabled by default] radio.c:34:1: warning: excess elements in scalar initializer [enabled by default] radio.c:34:1: warning: (near initialization for ‘station3’) [enabled by default] radio.c:35:1: warning: excess elements in scalar initializer [enabled by default] radio.c:35:1: warning: (near initialization for ‘station4’) [enabled by default] radio.c: In function ‘play_station’: radio.c:91:17: warning: passing argument 1 of ‘do_child’ from incompatible pointer type [enabled by default] radio.c:43:6: note: expected ‘char **’ but argument is of type ‘char *’ radio.c:92:17: warning: passing argument 1 of ‘do_child’ from incompatible pointer type [enabled by default] radio.c:43:6: note: expected ‘char **’ but argument is of type ‘char *’ radio.c:93:17: warning: passing argument 1 of ‘do_child’ from incompatible pointer type [enabled by default] radio.c:43:6: note: expected ‘char **’ but argument is of type ‘char *’ radio.c:94:17: warning: passing argument 1 of ‘do_child’ from incompatible pointer type [enabled by default] radio.c:43:6: note: expected ‘char **’ but argument is of type ‘char *’ /tmp/ccbV3SwR.o: In function `main': radio.c:(.text+0x1fc): undefined reference to `forkpty' /usr/local/lib/libbcm2835.a(bcm2835.o): In function `bcm2835_delayMicroseconds': /home/pi/myprog/bcm2835-1.17/src/bcm2835.c:364: undefined reference to `clock_gettime' /home/pi/myprog/bcm2835-1.17/src/bcm2835.c:374: undefined reference to `clock_gettime' collect2: ld returned 1 exit status
(((((((((((((((((((((
-
Здравствуйте все! Автор - ты лучший)) Сейчас пытаюсь добавить кнопок для работы omxplayer. Но выходит не очень. Проблемы с кнопкой "p" (то бишь, пауза). Срабатывает только один раз (а хотелось бы n раз), а включение опроса второй кнопки в цикл, само собой, не позволяет пройти основной программе (для работы "q"). Помогите, пожалуйста.
Может, нужно для опроса этой кнопки создать ещё один параллельный процесс? Как он тогда будет выглядить? -
После долгих изысканий я понял, что за ошибки выдает при компиляции. Строки
char *station1={"http://listen2.myradio24.com:9000/8304", NULL}; char *station2={"http://89.208.99.16:8088/zvezda_128", NULL}; char *station3={"http://imgradio.pro/MegaRadio", NULL}; char *station4={"http://imgradio.pro/RusHit", NULL};
Надо писать так
char *station1[]={"http://listen2.myradio24.com:9000/8304", NULL}; char *station2[]={"http://89.208.99.16:8088/zvezda_128", NULL}; char *station3[]={"http://imgradio.pro/MegaRadio", NULL}; char *station4[]={"http://imgradio.pro/RusHit", NULL};
Теперь процитирую автора: "Прячем наш RPI в изящную коробочку, выводим на панель нашу кнопочку, подключаем колонки и ставим на холодильник готовое устройство, наслаждаемся проделанной работой под музычку, играемую нашим RPI-интернет-радио."
-
Однако сделать так, чтобы программа автозапускалась у меня не получилось никаким образом. Скрипт написал (sudo /home/pi/Myprog/./radio) он рабочий и руками спокойно запускается. Поместил его в /etc/init.d. Сделал ссылку на него в /etc/rc.2 и так далее rc.5. Сделать так как написал блоггер под ником "rn6ljk" тоже не получилось. Прошу помощи. Дайте совет чайнику.