Перевод: 30 дней Windows Mobile, день третий — GPS Compass (.NET vs WinAPI/C)

Original author: Chris Craft и Christopher Fairbairn
  • Translation
Третья часть из цикла переводов. Сегодня у нас на очереди GPS Compass. Предыдущая статья, менеджер Bluetooth — http://habrahabr.ru/blogs/mobiledev/61703/.

Крис Крафт. C#


Оригинал находится здесь.

Я не дизайнер, но как уже говорилось раньше, приложение должно выглядеть привлекательным. Поэтому для GPS компаса я нашёл очень хорошее бесплатное изображение в Wikimedia. Когда основа для оформления была выбрана, осталось определиться с механизмом получения GPS-данных. Были доступны следующие варианты:
  1. получать данные через последовательный порт
  2. с помощью OpenNetCF GPS библиотеки
  3. используя GPS Intermediate Driver



Приложение GPS Compass Я остановился на третьем варианте, т.к. он достаточно новый и как говорится в документации «он полезен, т.к. обеспечивает промежуточный уровень абстракции между производителями GPS-устройств и разработчиками». Никто не изготавливает оборудование одинаковым образом — всегда существуют особенности и подводные камни.


Для тестирования приложения мне было необходимо устройство с GPS, и у меня даже такое было (AT&T Tilt), но, к сожалению, в помещении уровень сигнала стремился к нулю. К счастью у Microsoft нашлась утилита FakeGPS, как раз подходящая для моих целей. Данная утилита использует текстовый файл с GPS данными для эмуляции функционирования настоящего GPS-приёмника.

В документации я быстро обнаружил то, что нужно — описание структуры GPS_POSITION. Для моего простого приложения мне было необходимо только одно поле flHeading, в градусах. Север соответствует нулю.

На данном этапе в комплекте с Windows Mobile 6 SDK в примерах я обнаружил приложение GPS Application — C:\Program Files\Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS

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

В приложении был хороший статус-экран, вызов которого я вынес в меню. Однако, главная составляющая приложения, конечно же отображена на скриншоте выше. В принципе, на основе этого примера можно строить любые приложения, использующие GPS.

Скачать исходный код.

Прим. переводчика: Крис не любит приводить примеры кода в своих статьях, предпочитая сразу давать ссылку на файл с исходным кодом проекта. Однако, я позволяю себе делать особенно интересные вставки, если это актуально. В случае с GPS Compass приводить куски кода бесполезно, т.к. получится или слишком мало, или слишком много. Скажу одно — если бы у Криса не было под рукой приложения из SDK, намучился бы он капитально, т.к. в примере написаны все обёртки вокруг native-структур, перечислений и методов, данный пример ещё и хорош для изучения особенностей маршаллинга больших и сложных структур.

Кристофер Фэрбейрн. WinAPI — C


В Windows Mobile 5 и выше существует унифицированный API под названием GPS Intermediate Driver, который позволят множеству приложений одновременно использовать одно GPS-устройство. Это интерфейс высокого уровня, избавляющий нас от необходимости разбирать NEMA предложения и т.д.

Чтобы подключиться к GPS устройству нам необходимо подключить gpsapi.h и вызвать GPSOpenDevice
// Откроем соединение с GPS Intermediate Driver<br/>
HANDLE hGPS = GPSOpenDevice(NULL, NULL, NULL, 0);


* This source code was highlighted with Source Code Highlighter.


Данный API считает ссылки, это означает, что каждый вызов GPSOpenDevice должен обязательно иметь закрывающий GPSCloseDevice. GPS-оборудование отключится только когда последний клиент завершит соединение.


Далее для получения информации мы воспользуемся методами GPSGetPosition или GPSGetDeviceState для получения положения или статуса устройства соответственно. Например, чтобы получить текущее местоположение, можно воспользоваться следующим кодом:

GPS_POSITION pos;<br> <br>// Инициализируем структуру<br>memset(&pos, 0, sizeof(pos));<br>pos.dwVersion = GPS_VERSION_CURRENT;<br>pos.dwSize = sizeof(pos);<br> <br>// Просим GPS intermediate driver <br>// заполнить структуру.<br>GPSGetPosition(hGPS, &pos, 500000, 0);<br><br>* This source code was highlighted with Source Code Highlighter.


Обращаю внимание, что структура GPS_POSITION содержит поле dwValidFlags. Это битовая маска, которая говорит о том, какие поля содержат корректную информацию. Например, если в поле не выставлен флаг GPS_VALID_LATITUDE, это означает, что на поле dblLatitude нельзя полагаться.

В нашем GPS компасе мы используем одну интересную возможность. Передавая два обработчика событий в качестве параметров методу GPSOpenDevice, мы избавляем себя от необходимости периодически опрашивать устройство с помощью GPSGetPosition. Вместо этого мы просто ждём, пока не сработает то или иное событие, с гарантией получая данные, отличающиеся от ранее полученных значений.

Создание меню.


Это первое приложение, в котором потребовалось меню. Меню создаётся в редакторе ресурсов и загружается с помощью SHCreateMenuBar. Вызов данного метода обычно помещается в обработчике WM_INITDIALOG:

case WM_INITDIALOG:<br> // Configure the menu<br> SHMENUBARINFO mbi;<br> memset(&mbi, 0, sizeof(mbi));<br> mbi.cbSize = sizeof(mbi);<br> mbi.hWndParent = hWnd; // the dialog's handle<br> mbi.nToolBarId = IDR_MENU; // the menu resource id<br> mbi.hInstRes = GetModuleHandle(NULL);<br> mbi.dwFlags = SHCMBF_HMENU;<br> <br> // Create the menu<br> SHCreateMenuBar(&mbi);<br> break;<br><br>* This source code was highlighted with Source Code Highlighter.


Далее существует целый набор API для взаимодействия с элементами меню. Например, можно активирировать или деактивировать определённый элемент с помощью EnableMenuItem:
// Disable a menu item with id 'IDC_SOME_ITEM'<br>EnableMenuItem(hMenu, IDC_SOME_ITEM,<br> MF_BYCOMMAND | MF_GRAYED);<br> <br>// Enable a menu item with id 'IDC_SOME_ITEM'<br>EnableMenuItem(hMenu, IDC_SOME_ITEM,<br> MF_BYCOMMAND | MF_ENABLED);<br><br>* This source code was highlighted with Source Code Highlighter.


Обратите внимание, что один и тот же метод вызывается для установки различных состояний элементов меню. Правильное место для подобных вызовов — в обработчике WM_INITMENUPOPUP. Это сообщение посылается владельцу меню непосредственно перед отображением меню.

Скачать исходный код.

Заключение от переводчика


Что мне нравится в переводе сразу двух статей — Крис описывает, как по-быстрому накидать нужный функционал на C#, а Кристофер всегда копает глубже и описывает тонкости библиотек, которые зачастую просто не увидеть из .net, если не вникать. Соответственно, даже если нет необходимости или желания программировать на чистом WinAPI, знать, как всё устроено внутри, очень полезно.

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 16

    +2
    Я понимаю, что мои взгляды достаточно «критичны» но все же,… Windows Mobile страшный архоичный зверь, который держиться «на поверхности», лишь по причине своего старшего брата.
    За последние 4-5 лет Windows Mobile не сдвинулся в своем развитии, по сравнению, с Palm, Blackberry, Symbiane, MacOS (iPhone), Android.

    Не поворотливые решения Microsoft уже начинают внушать ужас в меня (как в разработчика). И я все время задаюсь вопросом, почему Microsoft, имея колосальные ресурсы не преобрел «сырой продукт», но координально новый и не сделал из него лидера рынка. ??? Ведь на протяжении 4 лет все время проскакивают различные «новые» мобильные решения.
      +1
      WMobile 7 расставит всё по местам. Майкрософт так просто не отдаст этот рынок.
        0
        3 года пишу под WM и осваиваю Android. Не пойму в чем проблема для вас как для разработчика? Ну да, стандартные интерфейсы кривоваты, но то, как выглядит и функционирует ваш продукт — полностью зависит от вас. Просто ранее рынок КПК не был столь популярен до айФона, и приложения писались немного с другой целью. Но MS обязательно наверстает упущенное) В WM6.5, который ждем осенью, уже будет выход на marketplace. Уверен и WM7 не за горами, а там уж точно нас «удивят»)
          0
          Про Marketplace есть следующая информация — к концу года он начнёт поддерживать не только WM 6.5, но и WM 6/6.1, всё-таки на WM 6.5 массово перейти очень сложно, а армия владельцев WM 6/6.1 всё-таки несоизмеримо больше.

          Источник: windowsteamblog.com/blogs/windowsphone/archive/2009/07/14/get-ready-windows-marketplace-for-mobile-offers-millions-of-potential-new-customers.aspx
            0
            Спасибо за информацию. Все-таки MS Marketplace, ровно как и Apple App Store и Adnroid Market — очень полезные вещи для разработчиков-стартаперов. Вот еще бы в них Россию «полюбили» полностью)
          +1
          А лично мне ну очень нравится Windows Mobile Standard 5.0-6.5. Я теперь мобильными пользоваться не могу, так хороша эта ОС, никаких сенсорных дисплеев, никаких дурных java и игр, минимализм и удобство, всё самое нужное на today, остальное в recent programms, пункты меню заточены на исключительно быстрый выбор цифровыми клавишами, интерфейс с крупными чёткими шрифтами, ничего лишнего, все настройки в одной кучке (кроме аккаунтов, правда, и настроек приложений как IE, календарь), прокручивающиеся списки сделаны действительно удобными, синхронизация с Exchange-сервером (в моём случае Google, синхронизируются календарь, контакты) и подключение к почте по IMAP, молниеносный быстрый поиск по контактам, бездонная история звонков и SMS, не тормозит с 200 МГц, не спит как коммуникаторы — всегда всё включено, просто выключен дисплей и процессор в экономичном режиме по возможности. Взял коммуникатор на Professional — плююсь, ужас и безумие, всё то же самое, но видно, что делали специально, назло как можно менее удобно. Standard очень правильно развивается в том плане, что 5 похожа на 6.1 и 6.5, просто добавляются современные востребованные штуки, но нет кардинальных, ломающих привычки изменений, даже интерфейс слабо меняется, хотя и раньше today был удобным, теперь это ещё более удобная карусель. Мало хорошего софта под Standard (но есть почти всё необходимое, если без ПО-фетишизма), а последние веяния обязывают производить под эту редакцию исключительно массивные qwerty-устройства (и плюс, и минус), я знаю только одну современную стоящую трубку с разрешением 320x320 (все остальные — лэндскейп, 240x320, а тогда весь today не влезает на экран без прокрутки. Я не люблю разработки Microsoft и отношусь к ним весьма скептически, но этот продукт реально крут. Очень многие из малого количества, кто попробовал эту редакцию — остаются верны ей, потому что реально подсаживаешься, попробуйте погонять хотя бы в эмуляторе или посмотреть скриншоты, это не тот глючный и тормозной Professional. Я его рекомендую абсолютно всем, особенно удобен он будет людям, активно общающимся и имеющим большую телефонную книгу, остальным он будет просто очень удобным и простым мобильным телефоном. К сожалению, вот только устройств дешёвых и нормальных почти не осталось. Сейчас эта ветка умирает из-за узкой нишевости, то она была бизнес-решением корпоративного уровня, то стала бюджетным решением, теперь опять бизнес-решение. Если она загнётся совсем — я абсолютно не представляю, какой смартфон после этого брать…
          У Standard есть несколько минусов.
          1) Веб-браузер шустрый и под него есть оптимизированные гугл-сервисы, но он плохой с точки зрения поддержки стандартов/технологий и неудобный, в 6.5 он стал и лучше, и хуже: потерял удобство, повысилась функциональность.
          2) Многооконность глубоко запрятана. То есть переключаться между приложениями из коробки почти невозможно. Но это решает отличное приложение SmartToolkit (кривоватое, бета, зато удобно), заодно добавляя функциональность кат-паста всюду, где возможно (из коробки нет, в последних версиях добавляют из приложения в приложение).
          3) Их нет с сенсорными дисплеями. Это плюс, но в то же время на Professional очень легко ткнуть в середину или конец полосы прокрутки и попасть в нужное место на странице или в списке электронных писем. Невозможно выделить какие-то определённые письма и что-нибудь с ними сделать, придётся по-одному или расправиться со всеми сразу. Я был бы рад, если Standard заточили под сенсорные экраны и начали бы их ставить на устройства с сенсорными дисплеями не меняя форм-фактора и размера.
          4) Нет флеша. Хотя как им пользоваться без сенсорного дисплея? Просто иногда очень нужно и такой облом. Есть урезанный флеш, но на нём почти ничего не идёт.
          5) Windows Media Player: он не грузит систему и в принципе не очень плох, но нет эквалайзера, и управление списком воспроизведения и плейлистами неудобно (отчасти из-за отсутствия сенсорного дисплея). Особенно плохо, что под него нет кодеков. А сторонние плееры — костыли, тормозят, перегружены функциями, неудобные.
          6) У меня в 6.0 в календаре невозможно было сделать гибкие напоминания на вручную заданное время, только фиксированные интервалы до события. Может быть сейчас это поправили, не помню уже, но помоему воз и ныне там, в Pro всё хорошо.
          7) Устройства: почти нет раскладушек, только старые модели. Да и вообще сейчас одни qwerty, в Россию почти не везутся, htc очень дорогие за логотип.

          Получился какой-то куцый мини-обзор. В общем всем советую посмотреть на эту редакцию в любом доступном виде, разочарованы не будете. Symbian слизал today у WM Standard.
          Я пользовался Qtek 8310.
            –1
            >>А лично мне ну очень нравится Windows Mobile Standard 5.0-6.5
            а именно плюсы:
            — Мало хорошего софта под Standard…
            — обязывают производить…
            — today не влезает на экран без прокрутки…
            — К сожалению, вот только устройств дешёвых и нормальных почти не осталось…
            — Сейчас эта ветка умирает из-за узкой нишевости,…
            >>У Standard есть несколько минусов.
            — Веб-браузер шустрый «Очень поспорю»!
            — Многооконность глубоко запрятана.
            — Их нет с сенсорными дисплеями.
            — Нет флеша. (не флеша не замены. Напомню, что iPhone не просто так от него отказался маркетинговыйход, и им было что предложить в замен, технически кстате напорядок качественее.)
            -Windows Media Player — даже не каметнирую
            -У меня в 6.0 в календаре невозможно было сделать, (десктопный календарь, это вещь, но в мобильном исполнении)
            -Устройства: почти нет раскладушек,

            P.S. Я же говорю что Windows Mobile это монстр, ахтианазавр.
            Те кто держали Android или iPhone в руках, поймет меня ,…
              0
              Я держал iPhone в руках, Android только в эмуляторе. Это всё неудобно с точки зрения как простой телефон.
              У меня today на qtek 8310 влезал целиком (ибо 320x240, портрет). И софт нужный лично мне — нашёлся. И между приложениями в фоне я переключался с помощью SmartToolkit за три нажатия.
              Вы не передёргивайте и не выдирайте слова из контекста. Тем более что под устройствами я рассматривал рынок Российский, у нас с этим плохо, в США — гораздо лучше, есть выбор, но все — qwerty. В доказательство — хороший и дешёвый Samsung i627, i637, оба $320 анлокнутые на ebay, вот только они qwerty из-за этого крупноваты: один толстый и широкий, второй широкий. Это HTC в России на Standard неоправданно дорогие.

              Веб-браузер шустрый на маленьких страничках, на больших — да, не спорю, тормоза сильные, зато ЦП и ОП почти не грузит, в фоне ещё много чего может висеть и выполняться.

              И что вы имеете против Windows Media Player? Я и на iPhone flac и ogg вроде не смогу слушать.

              А календарь удобный, как в Pro, так и в Standard, вот только таймауты напоминаний в последнем…

              Вы подержите Standard в руках, желательно пару дней, потом будете говорить, я не защищаю Professional & Classic, их можете растерзать, я их ненавижу :)

              На айфонах вообще многозадачность где? Вы хотите поговорить о том, что предложили Apple в iPhone вместо флеша? Тогда вам придётся мне рассказать об этом, потому что для меня большая новость, что Apple что-то вообще предложили.

              И не говорите мне, пожалуйста про iPhone. И потому, что мне он не нравится, и потому что он вообще для других целей, эти продукты (я только про Standard) — не конкуренты. Мне не нужен здоровый телефон с дисплеем на весь экран, мне кнопки нужны, и размеры поменьше, и возможность ранать несколько приложений одновременно. Хотя собран iPhone круто…

              Ваш ответ мне вообще какой-то странный, я не понял, что вы им хотели сказать: какой крутой iPhone и Android'ы-переростки с кошмарным видом G1?
            0
            «Не в обиду», но надо что-то делать… Бог уж с ними, с запятыми, но в таком коротком посте и:

            архаичный, держится, symbian, неповоротливые, колоссальные, приобрёл, кардинально…

            Это не в упрёк — просто запоминай как правильно, пожалуйста.
            0
            А нету ни у кого пресрелиза по этому зверю? Интересно что они хотят противопоставить таким рабочим решениям как Mobile Youtube, Apple App Store, Google Map, MultiTouch, Safari, etc. ???
              0
              У них будет свой магазин, недавно в Подкаст9 об этом говорили и в Радио-т схема как у Apple 70% разработчику. Соответственно всё напишут, всё сделают. Главное, чтоб WMobile 7 был нормальный, в плане UI
              0
              Mobile YouTube — m.youtube.com работает в IE уже года два как :)
              Про AppStore уже выше писалось, что Marketplace будет совсем скоро
              Google Maps естественно уже тоже очень давно работает на WM
              Safari для WM нет, зато есть Opera Mobile и Fennec (Firefox mobile)
              Multitouch будет в Wm7, в 6.x просто на уровне API нет возможности его обрабатывать.
                0
                боюсь что к моменту выхода wm7 опять наберется список новых фич, появившихся к тому времени в нормальных платформах, но «планируемых» в wm.
            • UFO just landed and posted this here
                0
                А никто и не обещал на неподвижном дивайсе получать стороны света :) Просто в статьях это не акцентировалось.

              Only users with full accounts can post comments. Log in, please.