Предыстория
Сегодня Windows CE 6.0 переживает не лучшие времена, даже родители (в лице Microsoft) уже открестились от своего детища и поддерживать более не намерены. Причин тому много, да и сама ОС морально устарела. Ее потихоньку вытесняет Андроид. Тот же ATOL у нас в России переходит на "зеленого робота" в своих сканнерах.
Плохо это или нет - не нам судить.
Мой знакомый тоже судить не стал и купил такую забавную вещь, как "Автоинформатор", на борту которой стоит тот самый Windows CE 6.0 с процессором ARM Cortex-a9.
Вы спросите - "нафига" ему такой архаизм?
Ирония в том, что мой знакомый даже не знал, какая ОС хранится внутри. Так уж сложилось, что он работает на троллейбусе и напрягать свои связки ему уже порядком поднадоело. Так он и решил, что ему нужно что-то вроде старинной "СССР-овской" коробочки, которая бы говорила за него "осторожно, двери закрываются ...", а он лишь переключал эти записи одной кнопкой.
Купил он этот аппарат за 6-7 тысяч рублей, причем ситуация была странная. Продавец пообещал доставить автоинформатор и не брать предоплаты, но потом на 2 недели куда-то пропал!
При обращении к нему через 2 недели - оказалось, что он попросту забыл.
Забавно. ;)
Но в итоге все же отправил. И вот, ещё через неделю - эта "приблуда" попала моему знакомому в руки.
И вот загвоздка. Он просил загрузить маршруты у продавца, но пришла коробочка с 2-мя остановками и парочкой фраз.
Так как он не "шарит" за все электронное - обратился ко мне "закинь мне маршруты", ну а я согласился.
Windows CE 6.0 я в руках держал только на работе в виде "Атоловских переносных сканнеров", но и этого хватало, чтобы покопаться в устройстве и обнаружить, что, почему-то это устройство может работать с маршрутами, но без GPS - посылает меня на 3 буквы (если у Вас не так - отпишитесь, может я просто не разобрался. Кто знает? ;D). Более того, маршруты можно скачать с этого сайта бесплатно. Однако, моему "знакомому" нужен был необычный маршрут, а за построение маршрута вручную - нужно платить монетой, да и озвучка там на половину человеческая, а на половину через электронного диктора.
Поняв, что без GPS - смысла в этом нет (а GPS ему вряд-ли кто туда прикрутит, учитывая, что начальство планирует менять троллейбусы на новые), я предложил - попробовать написать программу самому.
Так и пришли к тому, что под Windows CE 6.0 я отправился писать код.
Среды разработки
Идея в моей голове была проста - мне нужна была форма с кнопками и выпадающими списками, которая бы воспроизводила "wav файлы" в определенных условиях, которые я опишу в "конфигах". С этим и "WinAPI" справится, но опять же о Windows CE 6.0 на уровне разработки я не знал ровно ничего, да и смущала архитектура процессора (там несколько версий только одной ARM). Нужен был мультиплатформенный инструмент, который "завелся бы" не зависимо от архитектуры.
Сначала я подумал о Python (его какие-то энтузиасты уже "портануть" успели), но решил, что запускать скрипты - человек, который не разбирается в компьютерах не сможет, да и кто знает - что смогли "портировать" от полноценного Python, а что нет. Так же - банально на моем "проце" (ARM Cortex-a9) - он не запустился. Так что я отбросил эту идею.
В качестве второй среды разработки я решил попробовать Lazarus. Он поддерживает мультиплатформенность и даже необычные процессоры, но вот с Cortex-a9 и Windows CE 6.0 "не свезло". У Lazarus поддержка максимум до Cortex-4. Так что и эта идея была отброшена.
Раз другие варианты не подходят - стоит попробовать решение от "родителей" Windows в лице Microsoft.
Я был готов писать и на чистом Си + WinAPI (мне не привыкать), но нашел куда более простое и удобное решение - C# + Windows Forms.
Но возник вопрос - а как начать разработку под устаревшее устройство? На какой версии Visual Studio я могу это сделать? Ответ был найден в этой статье - это Visual Studio 2008.
Спасибо pilamaster, хоть и работы с "пинами" мне не понадобились. :)
Так я и приступил к разработке.
Еще отдельное спасибо этому сайту, ведь на нем я бесплатно смог записать все реплики диктора.
Как создать проект на C# для Windows CE 6.0
Создать проект на Windows CE 6.0 в Visual Studio 2008 не составляет труда.
Для начала нажимаем File->New->Project.
Затем выбираем Visual C#->Smart Device->Smart Device Project и даем имя проекту.
После выбираем Target platform: Windows CE, а версию .Net Compact: 3.5 (что соответствует .NET Framework 3.5 для ПК). Далее жмем "Ок".
И вот у нас уже среда готова для разработки. Остальное как на ПК - добавляем кнопки из "Toolbox" и меняем свойства в Properties (Которую можно открыть через View->Properties Window).
В качестве эмулятора для тестов советую "Pocket PC 2003 SE Emulator" (но в Windows 10 эмуляторы не работают, учтите, так что лучше иметь под рукой устройство).
Если Вы планируете работать с устройством - достаточно просто собрать проект на "Build" и скинуть *.exe файл с окружающими файлами на само устройство и "ручками" запустить приложение (или настроить API, но прокатит не со всеми устройствами. С моим не прокатило :( ).
Если же Вы работаете с эмулятором, то есть 2 способа запустить Ваше приложение на нем:
- Нажать Run (Но тогда файлы, что должны лежать с проектом не перенесутся. Например: "конфиги", музыка и тд);
- Закинуть через общую папку (типа как SD флешку) собранный через "Build" "*.exe" файл (как с реальным устройством) со всеми данными (картинки, "конфиги", "wav файлы" и тд). Как это сделать - сейчас Вам и покажу:
На эмуляторе открываем File->Configure...
Выбираем вкладку General и указываем путь до проекта в Shared folder и жмем "Ок".
Теперь чтобы запустить проект внутри Windows CE в эмуляторе жмем "Пуск"->File Explorer.
Выбираем карту памяти (она и видится как общая папка), а дальше ищите свой *.exe файл в Debug или Release папках и запускаете "ручками".
Примечание для практиков:
Учтите, хоть код и пишется как на ПК, помните, что устройство Windows CE 6.0 игнорирует относительные пути, так что если Вам как и мне надо иметь доступ к "конфигам" или "wav файлам" по относительному пути - нужно сначала указать полный путь до приложения. Делается это так:
using System.Reflection;
using System.IO;
//...
String appDir = Path.GetDirectoryName( Assembly.GetExecutingAssembly().GetName().CodeBase );
Так Вы получите путь до папки, просто "конкатинируйте" с относительным путем к "конфигу" и все.
А воспроизводить "wav" можно так:
using System.Media;
using System.IO;
using System.Reflection;
//...
String appDir = Path.GetDirectoryName( Assembly.GetExecutingAssembly().GetName().CodeBase );
var fullPath = Path.Combine(appDir, @"" + path);
SoundPlayer player1 = new SoundPlayer(fullPath);
player1.PlaySync();
Где path - это относительный путь до файла а appDir - полный путь до приложения, описанный выше.
Что в итоге вышло у меня
Не с первой попытки, конечно, но мне удалось получить то, что мы с "знакомым" и хотели.
Многое приходилось дорабатывать или переделывать, но ничего не поделаешь - не все люди умеют четко формулировать то, что они хотят, потому это был не простой опыт, но мы все равно пришли к консенсусу. :)
Как видно - это простое окно с выбором самого маршрута и направления маршрута. При нажатии на кнопку ">>" - диктор говорит "Осторожно, двери закрываются. Следующая остановка такая-то", нажав еще раз "Остановка такая-то".
На некоторых остановках я сделал так, чтобы диктор говорил какие-то фразы, по типу "Крепче держитесь за поручни". Ну а нажав на "Повтор" - диктор говорит последую фразу, что говорил.
Были так же добавлены 2 кнопки "Улица А" и "Улица Б". На них диктор говорит по какому маршруту мы едем.
При достижении конца списка - маршрут сам разворачивается (кнопка ">>" становится "<<"), а диктор начинает говорить остановки в обратном порядке.
Все остановки в виде списка написаны в конфигурационных файлах, а записи лежит в "wav файлах", описанных в "конфигах".
Заключение
Опыт оказался не сильно новым (Все же под C# код не сильно отличается от ПК), но довольно интересным. Когда еще у меня будет возможность написать что-то на Windows CE 6.0? Надеюсь, что статья была интересной и познавательной.
Желаю всем приятного кода. :)