пятница, 17 октября 2014 г.

Java ME на Freescale FRDM-K64F

The statements and opinions expressed here are my own and do not necessarily represent those of Oracle Corporation.
Всё, что написано ниже, я выдумал, предаваясь фантазиям. Воспринимайте это как шутку.

Главное

Вышел early-access релиз Java ME Embedded для девелоперской платы Freescale FRDM-K64F.
Если у вас есть такой дружок, можно, ознакомившись с краткой инструкцией по быстрому старту, сконфигурировать устройство для запуска на нём мидлетов и немного поиграться. Я тут попишу немного про подключение к устройству, написание небольшого демо-приложения с раскрытием структуры проекта и работу с device acces API, ок?
Главное - это в процессе конфигурирования не забыть в конце файла jwc_properties.ini прописать сетевые параметры устройства, чтобы потом можно было подключить его к device-manager'у из состава Java ME SDK, соответствующую версию EA 8.1 которого тоже необходимо предварительно скачать и установить. В принципе, если у нас в системе установлены USB-драйверы устройства, то мы сможем подключаться к нему и по COM-интерфейсу, но это будет работать заметно медленнее.

Подключение к устройству

Ну, ладно. Microsd-карточку с преднастроенными параметрами в плату воткнули, нужную версию файла java.bin на flash-устройство, которым девайс определился в системе положили, попробуем подключиться и посмотреть, что у нас есть. Сделать это можно несколькими способами:
  • Способ первый - тру-хардкор-коммандлайн для бородатых ребят. В каталоге с установленной Java ME SDK ищем файл toolkit-lib\lib\proxy.jar. Можно, кстати, взять его и из дистрибутива платформы для K64, там он лежит в каталоге util. Ну, и применяем из командной строки к нему такой подход: java -jar proxy.jar -socket X.X.X.X -debug, где вместо X.X.X.X требуется подставить ip-адрес устройства, который мы предусмотрительно прописали в файле jwc_properties.ini. После этого можно каким-нибудь клиентом типа putty в RAW-режиме подключиться на localhost:65002 и узреть там примерно следующее: 
    Это так называемая ams-консоль, через которую можно и по устройству пошариться, и мидлетами поуправлять. 
  • Способ второй - с кнопочками. Опять же идём в каталог Java ME SDK и запускаем bin\device-manager.exe. Тут же в системном трее появится значок, дважды кликнув на который, вы увидите окно, в котором по нажатию кнопки Add можно будет вписать IP-адрес очередного устройства (или же по COM-порту подключиться, избрав не наш путь). Устройство получит не особо о чём-то говорящее имя вроде EmbeddedExternalDeviceX, и проверить его можно, если кликнуть по тому же значку device-manager'а в системном трее правой кнопкой и выбрать пункт Registered devices. Если же хочется его поменять, то рекомендую открыть файл в домашнем каталоге пользователя, из-под учётной записи которого запускается Java ME SDK, что-то типа такого вот C:\Users\%ИМЯ_ПОЛЬЗОВАТЕЛЯ%\javame-sdk\%ВЕРСИЯ_SDK%\device-detection\connections.xml и поправить в нём поле <void property="deviceName"> <string>%ИМЯ_УСТРОЙСТВА%</string></void> соответствующей борды. Легко найти. У меня оно переименовано в fsk64 теперь выглядит так: 
    Сконфигурировав подключение, запускаем из каталога Java ME SDK бинарник эмулятора с такими ключами:
    bin\emulator.exe -Xjam -Xdevice:fsk64,
    после чего радуемся открытому окну, в меню которого можно почитать логи и поуправлять устройством. Кстати, данный способ не лишает нас радостей и ams-консоли. После запуска этого эмулятора мы так же можем подсоединиться на localhost:65002 и сделать всё, что нужно.
  • Способ третий - самый ленивый и является продолжением второго. Ставим NetBeans (так уж получилось, что на настоящий момент эта IDE лучше вех интегрируется с JavaME), указываем в настройках Tools - Java Platforms путь до нашей Java ME SDK и создаём Java ME проект, в свойствах которого указываем необходимость запуска приложение на девайсе fsk64:

Напишем что-нибудь

Девайс оборудован несколькими кнопками, LED-индикаторами и акселерометром. К этим устройствам можно обращаться через Java ME DAAPI. Писать я буду примитивный детектор тряски, собирающий показания с акселерометра и зажигающий индикатор при изменении показателей в пределах погрешности. Полезным будет почитать datasheet акселерометра и ознакомиться вот с этими исходниками.
Чтобы получить список всех устройств на борту платы, не прибегая к чтению спецификаций, можно задействовать примерно такой код:

Iterator l = DeviceManager.list();
while(l.hasNext())
{
   DeviceDescriptor d = (DeviceDescriptor) l.next();
   System.out.println(d.getName()+"; "+d.getID()+"; "+d.getConfiguration());
}

Получив на выходе что-то типа списка:

PC2; 101; jdk.dio.counter.PulseCounterConfig@9f3ec512
PC1; 100; jdk.dio.counter.PulseCounterConfig@9820de3e
PWM1; 301; jdk.dio.pwm.PWMChannelConfig@2a63e1f7
ADC5_PTC10; 505; jdk.dio.adc.ADCChannelConfig@fd339546
FXOS8700CQ; 300; jdk.dio.i2cbus.I2CDeviceConfig@11e7c3f
ADC4_PTC11; 504; jdk.dio.adc.ADCChannelConfig@fd16fc55
ADC3_PTB11; 503; jdk.dio.adc.ADCChannelConfig@fcfa6364
ADC2_PTB10; 502; jdk.dio.adc.ADCChannelConfig@fcddca73
SPI_Slave; 12; jdk.dio.spibus.SPIDeviceConfig@279b1931
ADC1_PTB3; 501; jdk.dio.adc.ADCChannelConfig@fcc13182
ADC0_PTB2; 500; jdk.dio.adc.ADCChannelConfig@fca49891
UART3; 40; jdk.dio.uart.UARTConfig@30605d5
DAC0; 700; jdk.dio.dac.DACChannelConfig@3350d998
LEDS; 8; jdk.dio.gpio.GPIOPortConfig@e16b5918
SW3; 6; jdk.dio.gpio.GPIOPinConfig@a53bead
SW2; 5; jdk.dio.gpio.GPIOPinConfig@a56fc99
LED3; 3; jdk.dio.gpio.GPIOPinConfig@34faede4
LED2; 2; jdk.dio.gpio.GPIOPinConfig@34fb3292
LED1; 1; jdk.dio.gpio.GPIOPinConfig@34fafb7d

Мы будем работать с двумя устройствами: снимать показания с акселерометра FXOS8700CQ и при изменении данных показаний зажжём светодиод LED3.
Весь код проекта традиционно лежит на гитхабе.
Вот как это выглядит в жизни:

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

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