...

воскресенье, 13 июля 2014 г.

Музыкальный программируемый школьный звонок «Школьник-3»


Поскольку я сменил платформу для школьного звонка, то выкладываю исходники предыдущего проекта «Школьник-3». Сразу поясняю, что я не планировал распространение исходников где-то кроме России, поэтому практически весь код написан по-русски. Кому-то это может показаться забавным, не судите строго, мне так было проще писать код.



Немного истории




«Школьник-3» — это музыкальный программируемый школьный звонок на базе дешёвого сотового телефона, имеющего поддержку Java. Идея-то мне в общем пришла случайно, когда я думал о замене предыдущей версии школьного звонка «Школьник-2». Он был достаточно примитивен, т.к. был собран на микроконтроллере AVR серии Mega с небольшой обвязкой и двухстрочным дисплеем.

Проблема была в том, что это была самоделка. Поскольку она коммутируется с пожарной системой оповещения, то железо должно иметь сертификат соответствия, т.е. пройти испытания, на что нужно время, средства. Мне хотелось обойти этот момент, но для этого нужно готовое железо, которое подходило бы по функционалу и было дешево. Так вот, возвращаясь однажды домой, я обратил внимания на свой мобильник. А почему нет? Он же содержит всё необходимое как раз именно для такого применения. Мне даже не по себе стало от мысли, что до сих пор никому такая идея в голову не пришла, а ведь я делал обзор и знал на чём построены другие школьные звонковые системы.


Была правда одна проблема, я раньше не сталкивался с Java так плотно и уж тем более, не писал мидлеты. Было не ясно как поведёт себя конкретная реализация java-машины при эксплуатации в непрерывном режиме. Также я так и не решил проблему с подписанием мидлета. Меня вообще удивляет ситуация, что я должен ещё что-то куда-то платить (регулярно), чтобы эксплуатировать мобильник по своему усмотрению.


Отложив пока в сторону проблему с подписанием, я начал искать самый дешёвый и удобный телефон для экспериментов. Надо же было так совпасть, что в это время был в ходу простенький Fly MC150DS. Из всех полезных его свойств главным критерием его выбора стало отсутствие необходимости в подписании мидлета. Это выглядело странно на фоне всех остальных аппаратов других фирм, где народ на форумах чего только не придумывал, чтобы обойти это требование.


Следующим этапом нужно было проверить саму принципиальную возможность использования телефона в качестве автоматизированной системы. Тут меня ждал один «замечательный» сюрприз, который чуть не испортил всю красоту и простоту идеи. Загрузив себе среду разработки, доки и прочее, удалось набросать кое-как работающий движок, который формировал расписание для задач (проигрывание мелодии). Как только мне удалось потестить в течении дня работу движка, я обратился в школу с просьбой опытных испытаний. В отличие от предыдущей версии, теперь можно было проигрывать mp3-файлы и потенциально делать очень многие другие вещи, т.к. телефон по сути — это маленький ПК.


После нескольких дней испытаний обнаружилось очень странное поведение времени. Я не мог поверить в результаты, перепроверяя их сутками — приложение тормозило секунд на 20 каждые сутки. Это выглядело нереально, т.к. я полагал, что часы в телефоне идут точно. Но факт оставался фактом — 20 секунд разницы откуда-то набегало. Это была только половина беды, вторая часть заключалась в том, что из мидлета нельзя исправить время в телефоне. Вы можете его считывать, но корректировать — нет. Это меня поставило в тупик. Самая главная фишка автоматизированной подачи звонков — это точное время их подачи, а у меня какой-то просто неведомый жуткий косяк именно в этом месте.


Когда я отошёл от шока (столько времени потрачено на пустую затею), то заметил, что оказывается время внутри мидлета отличается от времени в телефоне, т.е. на самом деле внутри мидлета создаётся свой собственный «поток» времени. Возможно это не интересовало разработчиков игр, т.к. сутками на телефоне никто не играет, но в моём случае это приводило к накоплению ошибки в отсчёте времени. Я не разбирался с тем что именно происходит внутри конкретной реализации java-машины, но для себя я понимал это так. При загрузке java-машина инициализирует внутренний счётчик времени от системных часов, в процессе работы поток, который отвечает за отсчёт времени, притормаживает и поэтому считает время неправильно, что сказывается на возвращаемых значениях Date().


Что делать? Мне пришло в голову только одно — дополнительно вести учёт времени в своей программе и корректировать задания для таймеров в зависимости от набежавшей за всё время работы поправки. Честно говоря, я уже сам по прошествии нескольких лет точно не знаю как это у меня работает, но оно работает. Каждый день в полночь происходит формирование пакета звонков, при этом время задаётся скорректированное, где дельта рассчитывается как произведение прошедших с начала работы суток на невязку в одни сутки. Эта суточная невязка определяется опытным путём по результатам испытаний. Способ, конечно, кривоват, но такой телефонный звонок проработал в общей сложности три года, пока не отвалился кабель питания (micro-usb) и телефон не спёрли.


О проекте




Подробное описание работы с программой можно найти в Руководстве пользователя, которое я приложил ниже. Исходники на github я собирал последний раз кажется в NetBeans 8. Работу мидлета можно полностью протестировать на эмуляторе. Для этого нужно собрать отладочную версию указав в файле main.java значение:

// Установка или сброс для отладочного режима.
static final public boolean РЕЖИМ_СИМУЛЯТОРА = true;




При этом нужно в root файловой системы положить папку Мелодии с github. Там находятся как сами мелодии, так и конфигурационные файлы. Возможно в файле Настройки.txt нужно будет изменить пути на локальные для эмулятора, я точно уже не помню. Посмотреть как что работает можно под отладчиком.

Также в программе используется модуль microlog, который ведёт очень подробную статистику того, что делается в мидлете. При этом в той же папке с мелодиями создаётся файл microlog.txt, где можно посмотреть на действия пользователя или ошибки, возникающие по ходу работы. Это очень удобно.


Может быть мой проект натолкнёт кого-то на какие идеи по использованию мобильника. Очень жаль, что столько вычислительного добра каждый год выбрасывается на свалку истории, а ведь они могли бы ещё служить и служить людям, перемалывая нолики и единички.


Ссылки




1. Исходники на github.

2. Школьник-3. Руководство пользователя (pdf).

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий