Найти тему
NoraDev

Как я разрабатывал программу "Автоинформатор" для Windows CE 6.0 на C#

Оглавление

Предыстория

Сегодня 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.

-2

Затем выбираем Visual C#->Smart Device->Smart Device Project и даем имя проекту.

-3

После выбираем Target platform: Windows CE, а версию .Net Compact: 3.5 (что соответствует .NET Framework 3.5 для ПК). Далее жмем "Ок".

-4

И вот у нас уже среда готова для разработки. Остальное как на ПК - добавляем кнопки из "Toolbox" и меняем свойства в Properties (Которую можно открыть через View->Properties Window).

В качестве эмулятора для тестов советую "Pocket PC 2003 SE Emulator" (но в Windows 10 эмуляторы не работают, учтите, так что лучше иметь под рукой устройство).

Форма для наших будущих разработок :)
Форма для наших будущих разработок :)

Если Вы планируете работать с устройством - достаточно просто собрать проект на "Build" и скинуть *.exe файл с окружающими файлами на само устройство и "ручками" запустить приложение (или настроить API, но прокатит не со всеми устройствами. С моим не прокатило :( ).

Если же Вы работаете с эмулятором, то есть 2 способа запустить Ваше приложение на нем:

  1. Нажать Run (Но тогда файлы, что должны лежать с проектом не перенесутся. Например: "конфиги", музыка и тд);
  2. Закинуть через общую папку (типа как SD флешку) собранный через "Build" "*.exe" файл (как с реальным устройством) со всеми данными (картинки, "конфиги", "wav файлы" и тд). Как это сделать - сейчас Вам и покажу:

На эмуляторе открываем File->Configure...

-6

Выбираем вкладку General и указываем путь до проекта в Shared folder и жмем "Ок".

-7

Теперь чтобы запустить проект внутри Windows CE в эмуляторе жмем "Пуск"->File Explorer.

-8

Выбираем карту памяти (она и видится как общая папка), а дальше ищите свой *.exe файл в Debug или Release папках и запускаете "ручками".

-9

Примечание для практиков:

Учтите, хоть код и пишется как на ПК, помните, что устройство 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? Надеюсь, что статья была интересной и познавательной.

Желаю всем приятного кода. :)