Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
25.1 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

100m

w Click

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

Кодинг

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

ХАКЕР 07 /186/ 2014

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

ЗНАКОМИМСЯПОБЛИЖЕ

Проект Arduino построен на базе микроконтроллера Atmel ATmega2560 (далее мы будем рассматривать версию Arduino Mega 2560), который является представителем SoC (System on a Chip, «система на кристалле»). Чем же примечательна эта концепция построения микроконтроллеров?

Если открыть системный блок компьютера, то внутри мы обнаружим необъятных размеров материнку, в которую вставлен процессор, оперативная память и еще куча всякого добра (и зла). Микроконтроллер с маркировкой ATmega2560 (см. рис. 1), который мы можем лицезреть на плате Arduino, содержит все перечисленное сразу.

ВСКРЫТИЕПОКАЖЕТ

Микроконтроллеры отличаются друг от друга количеством «ног», списком бортовой периферии, объемами Flash и оперативной памяти. Звучит «глобально», но на деле Atmel спроектировал свои контроллеры обратно совместимыми чуть ли не от самого старшего до самого младшего (далее станет понятно, почему не так все страшно). Для любознательных — добро пожаловать на сайт Atmel (goo.gl/wP302R), где можно подробно сравнить микроконтроллеры.

Кратко про нашего подопытного:

микроконтроллер ATmega2560;

объем Flash-памяти 256 Кб;

объем оперативной памяти 8 Кб;

объем EEPROM-памяти 4 Кб;

тактовая частота 16 МГц.

Многие обратят внимание на тактовую частоту. Всего 16 МГц, но для большинства задач, для которых используются подобные малютки, этого более чем достаточно.

Остановимся чуть подробнее на видах памяти.

Что-тоспамятьюмоейстало

Flash-память предназначена для хранения и исполнения кода программы, а также для хранения констант.

SRAM — оперативная память отдается полностью под хранение данных программы (что очевидно).

EEPROM — отдельный орган микроконтроллера, энергонезависимая память, используется для хранения каких-то калибровочных данных, может быть использована под журналы и прочие данные, которые мы не хотим потерять, если вдруг питание нашего устройства пропадет.

Flash

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

1

TOOLCHAIN

Toolchain — набор инструментов

для компиляции и генерации исполняемого кода. Часто термин используют применительно к кросс-средствам, когда архитектура процессора, на котором генерируется код, отличается от архитектуры целевого процессора. Например, мы будем использовать кросс-средства для компиляции кода, исполняемого на процессоре

с архитектурой AVR, но наш компьютер управляется процессором с архитекту-

рой x86 (x64).

INFO

Пользователям *nix крупно повезло, так как весь используемый в статье софт-зоопарк есть в репозиториях практически всех популярных дистрибутивов.

WARNING

При работе с микроконтроллером постарайся убрать все металлические предметы, чтобы предотвратить случайное короткое замыкание и выход платы из строя.

Рис 1. Сердце Arduino, процессор

ATmega2560

EEPROM

Затронем самую незнакомую аббревиатуру — EEPROM. EEPROM является представителем энергонезависимой памяти. Почему не Flash? Все очень просто:

1.EEPROM предоставляет доступ на чтение и запись к каждой ячейке памяти, в отличие от Flash, где перед записью необходимо очищать целую страницу памяти (это даже звучит долго :)).

2.EEPROM имеет гораздо больший ресурс циклов перезаписи. Все логично, программу ты записываешь (в идеальном случае) один раз, данные программа менять может по ходу жизни устройства множество раз.

3.EEPROM доступна на чтение практически мгновенно.

Есть у EEPROM и недостатки. Очень уж она медленная на запись, но этому противопоставляется мгновенная (по меркам контроллера) скорость чтения данных. На текущий момент существует новый вид памяти, называемый FRAM, но это отдельная тема для разговоров (например, Texas Instruments предлагает микроконтроллеры, полностью построенные на FRAM, тем самым убивая целое стадо зайцев: стираются границы доступа к памяти).

Давай теперь рассмотрим архитектуру самого микроконтроллера. Как можно подглядеть в вики, он у нас построен по гарвардской архитектуре, то есть область данных и область кода разделены. Да не как-нибудь, а физически. Для того чтобы в программе прочитать в регистр байт из оперативной памяти, из памяти программ или EEPROM, надо дать процессору абсолютно разные инструкции. Это одновременно и удобно, так как никакие переполнения не приведут к искажению кода программы, и жутко неудобно при обращении к данным.

Код нашей программы выполняется напрямую из Flash, в отличие от Большого компьютера, где код программы загружается в память и уже туда передается управление.

ВБОЙ Инструменты

Работать мы будем под Linux (у меня стоит Ubuntu 13.10), так что все указания будут справедливы для работы именно в этой ОС. Впрочем, выбор ОС не принципиален, так как пользоваться мы будем кросс-платформенными инструментами.

Для начала нам понадобится среда разработки. Обычно я пользуюсь Eclipse с установленным плагином для AVR (найти можно в репозитории Eclipse), но на этот раз решил поставить эксперимент и попробовать Code::Blocks (www.codeblocks. org). Результаты эксперимента меня порадовали :).

Далее топаем на сайт Atmel и скачиваем Atmel AVR 8-bit Toolchain 3.4.3 (goo.gl/uIUmkC). На сайте атмелов нам предложат зарегистрироваться, делай смело, в этом ничего страшного, даже спам не приходит. Существует и более свежая версия сборки тулчайнов, которая идет в составе средств разработки для Arduino, но нам это не принципиально.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

ХАКЕР m

07 /186/ 2014

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

В Arduino по-хардкорному

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w101Click

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Теперь самое интересное. Нам надо как-то прошивать наш

Рис. 2. Инструмен-

Helloworld

микроконтроллер. В Arduino Mega 2560 с завода идет загруз-

тарий

Конечно же, я не мог обойти стороной традицию написать Hello

чик с эмуляцией протокола программатора STK500v2. Для на-

 

world для первого знакомства с чем-либо в мире программи-

чала нам хватит и этого, но в идеале хорошо бы иметь «же-

 

рования. Но он у нас будет несколько специфическим: мы

лезный» программатор. Почему «для начала»? Потому что это

 

будем делать железный Hello world, который заставит устрой-

эмулятор, он поддерживает только команды чтения-записи,

 

ство моргать светодиодом. В знак приветствия, конечно.

но как отладчиком им воспользоваться не получится. Идем

 

Итак, создаем в Code::Blocks новый проект типа AVR

на сайт проекта AVRDUDE (www.nongnu.org/avrdude/) и ска-

 

Project, выбираем процессор ATmega2560, остальное оставим

чиваем утилиту программирования avrdude.

 

по умолчанию.

Ну и конечно же, сама железяка, Arduino Mega 2560.

 

Теперь надо немного настроить среду. Лезем в меню

Для подключения к компьютеру нам понадобится USB-кабель

 

Settings

Compiler, выбираем компилятор GNU GCC

типа B. Очень рекомендую скачать описание микроконтролле-

 

compiler

for AVR, на закладке Search Directory проверя-

ра ATmega2560 (goo.gl/6LfOF0) — оно пригодится для более

 

ем, что пути для заголовочных и библиотечных файлов ука-

глубокого понимания сути происходящего.

 

заны <avr

toolchain path>/avr/include и <avr toolchain

Также нам не помешает схема устройства Arduino Mega

 

path>/avr/lib соответственно, где <avr toolchain path>

2560 (goo.gl/4s7dnR).

 

это путь, куда мы распаковали тулчайн, скачанный с сайта

ťŦŤŮŞŘŠŖ Ş ŤŨšŖŚŠŖ

Все микроконтроллеры обладают встроенным интерфейсом программирования и внутрисистемной отладки. На нашей плате есть интерфейс последовательной шины SPI, к которой можно подключить аппаратный отладчик и отлаживать программу так же, как и на большом компьютере.

Внашем случае все несколько упрощено. Разработчики Arduino поместили на плату дополнительный контроллер, который эмулирует переходник RS232 <-> USB, назовем его uATmega (на самом деле это микрокон-

троллер ATmega16U).

Вмикропроцессор уже прошит загрузчик, который умеет использовать функции самопрограммирования микроконтроллера (то есть средствами микроконтроллера стирает и записывает страницы памяти) для записи прошивки и общается с внешним миром по протоколу программатора STK500v2. При изменении сигнала DTR интерфейса RS232 uATmega дергает ножкой перезагрузки основного микроконтроллера и дает команду загрузчику «Слушай команды программатора». В обычном режиме после сброса основного микроконтроллера загрузчик передает управление основной прошивке.

Для программирования нашего микроконтроллера мы используем утилиту /usr/bin/avrdude. AVRDUDE довольно простая, но мощная штука, которая умеет записывать и читать данные микроконтроллера.

Давай бегло пробежимся по флагам, которые мы будем использовать дальше:

'-p' — указываем тип микроконтроллера ATmega2560;

'-c' — тип программатора, которым мы прошиваем микроконтроллер (помним, что в Arduino загрузчик эмулирует работу программатора

STK500);

'-D' — этот ключ необходимо передать утилите avrdude, чтобы она не давала команду на очистку всего микроконтроллера, так как в нашем случае это ни к чему не приведет;

'-P' — указывается устройство последовательного порта, к которому подключен программатор. В моем случае это было устройство USB последовательного порта /dev/ttyACM0, но, чтобы не сбивать читателя с толку, я сделал поиск определенного устройства.

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

102m

w Click

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

WARNING

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

Рис. 3. Настройка утилиты программирования

Кодинг

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

ХАКЕР 07 /186/ 2014

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

3

Atmel либо установленный вместе с Arduino IDE. На закладке

 

/**

 

Toolchain executables в строке Compiler’s installation

 

@brief ǧȔȚȜȗȔșȠ ȥȖșȦȢȘȜȢȘ

path указан путь к корневой папке тулчайна.

 

*/

 

 

И еще одна маленькая настройка для удобства. Настроим

 

inline void ledOn(){

прошивку микроконтроллера из меню. Лезем в меню Tools

 

// dzȥȦȔȡȔȖȟȜȖȔșȠ Ȗ ȣȢȤȦ ȥȢȢȦȖșȦȥȦȖȧȲȭȜȝ

Configure tools..., нажимаем Add. Заполняем в соответствии

DANGER

// ȥȖșȦȢȘȜȢȘȧ ȕȜȦ Ȗ 1

c рис. 3.

PORTB |= _BV(PB7);

Name: Firmware

Статическое электри-

}

 

Executable: avrdude

 

 

• Parameters: -p m2560 -c STK500 -D -P `ls /dev/serial/by-

чество смертельно

Установив 0 в соответствующий бит порта PORTB, погасим

 

id/*Arduino*` -U flash:w:${TARGET_OUTPUT_BASENAME}.

для микросхем,

светодиод.

 

hex:i

старайся избегать

/**

 

 

 

 

работы с микроконтрол-

 

 

Тут нам стоит немного прерваться и открыть схему нашего

лерами в синтетической

@brief ǣȔȥȜȠ ȥȖșȦȢȘȜȢȘ

Arduino, а также взглянуть на плату. На плате мы видим све-

и шерстяной одежде,

*/

 

тодиод и подпись L, ищем его на схеме (рис. 4) и выясняем,

по возможности ис-

inline void ledOff(){

что светодиод подключен к ноге 26 микроконтроллера, кото-

пользуй заземляющие

// DZȕȤȔȥȯȖȔșȠ Ȗ ȣȢȤȦș ȥȢȢȦȖșȦȥȦȖȧȲȭȜȝ ȥȖșȦȢȘȜȢȘȧ

рая, в свою очередь, обозначена как PB7. Запоминаем эту цен-

браслеты.

// ȕȜȦ Ȗ 0

ную информацию.

 

PORTB &= ~_BV(PB7);

 

Теперь будем разбираться с кодом.

 

}

 

 

Подключаем заголовочные файлы для AVR:

 

 

 

#include <avr/io.h>

 

 

 

 

 

 

4

#include <util/delay.h>

 

 

 

 

 

 

 

 

Для управления питанием светодиода надо перевести пин

 

 

 

7 порта PORTB в режим «Выход». Это делается записью 1 в со-

 

 

 

ответствующий бит в регистре DDRB — регистр направления

 

 

 

данных порта PORTB.

 

 

 

/**

 

 

 

 

 

@brief ȜȡȜȪȜȔȟȜțȔȪȜȳ ȣșȤȜȨșȤȜȜ

 

 

 

*/

 

 

 

 

 

inline void init_hw() {

 

 

 

 

 

// ǨȡȜȪȜȔȟȜțȜȤȧșȠ ȡȢȚȞȧ ȣȤȢȪșȥȥȢȤȔ Șȟȳ ȤȔȕȢȦȯ

 

 

 

 

 

// ȡȔ ȖȯȩȢȘ Ȝ ȧȣȤȔȖȟșȡȜȳ ȥȖșȦȢȘȜȢȘȢȠ

 

 

 

 

 

DDRB |= _BV(PB7);

 

 

 

}

 

 

 

 

 

 

Само же моргание будет реализовано изменением соот-

 

 

 

ветствующего бита порта PORTB. Установка этого бита в 1 —

Рис. 4. Обозначение

 

 

зажигаем светодиод

светодиода на схеме

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

t

 

 

 

P

D

 

 

 

 

 

 

 

 

o

 

 

 

 

 

 

 

NOW!

r

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В Arduino по-хардкорному

w

 

 

 

 

ХАКЕР m

07 /186/ 2014

w Click

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Основной код работы нашей прошивки:

 

 

 

 

 

 

int main(void)

 

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

// ǨȡȜȪȜȔȟȜțȔȪȜȳ ȣșȤȜȨșȤȜȜ

 

 

 

init_hw();

 

 

WWW

// ǮȥȡȢȖȡȢȝ ȪȜȞȟ

 

 

while(1)

 

 

 

{

 

 

Очень популярный

ledOn();

 

 

форум разработчиков

_delay_ms(400);

 

 

для AVR:

ledOff();

 

 

avrfreaks.net

_delay_ms(200);

 

 

 

ledOn();

 

 

Статья на русском

_delay_ms(400);

 

 

о запуске Code::Blocks

ledOff();

 

 

для AVR:

_delay_ms(1000);

 

 

goo.gl/Aq23QJ

}

 

 

 

return 0;

 

 

AVR Libc:

}

 

 

nongnu.org/avr-libc/

Обратим внимание, что наш main крутится в бесконечном

 

цикле. Все логично, так как наша программа — это единствен-

 

ное, чем будет заниматься микроконтроллер.

 

 

 

Код готов, компилируем его. Нам встретится один warning,

 

который сообщает, что мы собираем прошивку в Debug и наши

 

задержки вовсе не обязаны соответствовать тем цифрам,

 

которые мы передаем через параметр. Связано это с тем,

 

что в мире программирования микроконтроллеров все вре-

 

менные интервалы довольно маленькие, а следовательно,

 

должны быть достаточно точными. Так как при сборке Debug

 

компилятор рассовывает кучу отладочной информации, то эти

 

задержки могут «поползти» в большую сторону. В нашем при-

 

мере это некритично.

 

 

 

Теперь самое душещипательное. Будем прошивать наш

 

микроконтроллер. В меню выбираем Tools

Firmware, за-

 

пустится утилита программирования avrdude. Если мы все

 

правильно сделали, то увидим окошко, как на рис. 5.

 

Вот мы и прошили первой программой наш микроконтрол-

 

лер. Теперь он должен моргать каждую секунду два раза и пауза.

 

ЗАКЛЮЧЕНИЕ

 

 

 

Итак, в этой статье мы кратко познакомились с процессорами

 

архитектуры AVR, написали простенькую программу и даже

 

прошили наш первый микроконтроллер. Программирование

 

микроконтроллеров — очень глубокая и интересная тема.

 

В то же время программист микроконтроллеров должен об-

 

ладать глубокими знаниями языка си, аккуратностью, внима-

Рис. 5. Прошивка

тельностью, усердием и терпением.

 

 

микроконтроллера

5

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

103Click

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

FUSE-ŗŞŨű

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

Что же в них опасного? А то, что неправильно выставленные FUSE-биты могут загнать микроконтроллер в такой режим, из которого потом будет очень сложно его вывести, либо просто угробить устройство. Например, можно отключить интерфейс отладчика, тогда ты больше не сможешь очистить контроллер и записать в него другую прошивку. Будь осторожен и бдителен!

Но мы с тобой можем быть пока спокойны, так как в нашем примере мы используем интерфейс программирования через прошив- ку-загрузчик, который не дает возможности управлять FUSE-битами.

ŢŖŠŦŤŧűŚšŵŦŖŗŤŨű ŧťŞţŖŢŞŘŨũšŭŖşţśAVR

В микропроцессорах любое действие — это запись или чтение из адреса памяти. Память нашего микропроцессора ATmega2560 разбита на две области: адреса ниже 0x200 отданы под регистры периферии микропроцессора, адреса старше 0x200 отданы под SRAM и внешнюю память.

Так как работа с пинами микропроцессора — дело достаточно муторное, то в тулчайне существует множество макросов для облегчения рутины разработчика. Приведем отдельные из них, которые встретятся в коде:

DDRB — макрос, определяющий адрес регистра направления данных. Говоря простым языком, этот регистр отвечает за то, в каком режиме будет работать та или иная нога процессора — на вход (принимать сигнал) или на выход (управлять чемнибудь);

_BV(bitnum) — простенький макрос, занимающийся установкой соответствующего бита, номер которого указан в качестве параметра, в '1' или в простонародье (1 << (bitnum));

PORTB — адрес порта ввода-вывода

PORTB.

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

 

hang

e

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

-

 

 

 

d

 

F

 

 

 

 

t

 

D

 

 

 

 

 

i

 

 

 

 

 

 

r

 

P

 

 

NOW!

o

 

 

 

 

 

 

 

BUY

 

 

 

to

104m

Кодинг

 

 

w Click

 

w

 

 

 

 

 

 

 

w

 

 

 

 

 

o

 

.

 

 

 

.c

 

 

p

 

 

g

 

 

 

df

 

n

e

 

 

-xcha

 

 

 

 

 

 

ŦśŬśťŨű

ŠŤŚŞţřŖ ťŤŚOS X

ВОСПРОИЗВЕДЕНИЕ ДИО, ВИДЕО, РАБОТА С ОКАЦИЕЙ

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

ХАКЕР 07 /186/ 2014

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Мы уже рассматривали в рамках рубрики «Кодинг» базовые механизмы операционной системы OS X и то, как их программировать (апрель 2014-го), но потом, пользуясь хитрыми вебкодерскими приемчиками :), инициативу в области освещения Apple-кодинга перехватила Ирина Чернова. Адепты нативного программирования вынуждены были отступить для перегруппировки и подготовки решительного наступления. И вот оно свершилось! Сегодня мы продолжим начатую подборку трюков для программирования под эту систему. Рассмотрим в статье две большие темы: воспроизведение мультимедиа и геолокацию.

Юрий «yurembo» Язев yazevsoft@gmail.com

ЧАСТЬ

2

ВОСПРОИЗВЕДЕНИЕМУЛЬТИМЕДИА:ВИДЕО

Для проигрывания мультимедиа на обеих платформах: в OS X (фреймворк Cocoa) и в iOS (фреймворк Cocoa Touch) используется библиотека AV Foundation. Это очень объемный и многофункциональный фреймворк для проигрывания видео и аудио широкого спектра форматов, среди которых QuickTime, MPEG4 Audio, WAV, MP3 и многие другие. Тем не менее для библиотеки AV Foundation не имеет значения, какого формата определенный медиаобъект, мы можем просто указать библиотеке на ресурс и стандартным образом проиграть его, не делая никаких предположений относительно его формата. Рассматриваемая библиотека представляет ресурс как ассет. Ассеты могут быть загружены по сети как удаленный ресурс или с локального устройства хранения информации (необязательно жесткого диска). В обоих случаях ресурс загружается с URL.

Воспроизводятся медиаданные с помощью объекта класса AVPlayer. Между тем этот объект не умеет отображать видео. Для этого в OS X используются слои. Прежде чем перейти непосредственно к проигрыванию видео, нам необходимо обсудить этот важный момент.

В операционной системе OS X слои наравне с анимациями являются объектами, включенными во фреймворк Core Animation. К слову, изначально он был разработан для iOS,

а к Mac OS X добавлен только в версии 10.5. Несмотря на свое название, он не только воспроизводит анимацию, но и также представляет хорошо оптимизированную систему рендеринга. Возможности данного фреймворка в отношении анимаций мы сегодня рассматривать не будем, а сконцентрируем свое внимание на слоях. Слой представляет собой прямоугольную область, которую визуализирует видеоадаптер в тот момент, когда программе необходимо что-то показать пользователю в области вида, другими словами, на экране — в окне приложения. Слои являются экземплярами класса CALayer (и его потомков). Чтобы создать слой в приложении, надо создать объект NSView (в OS X) и UIView (в iOS). В отличие от последних слои не выполняют никакую нагрузку, кроме отображения контента. Имеются некоторые различия в работе слоев в разных операционных системах. Поскольку в OS X слои — рекомендуемый, но никак не единственный способ отображения графики, то объекты NSView управляют экземплярами класса CALayer обособленно, то есть каждым отдельно. С другой стороны, в iOS объект класса UIView является своего рода оберткой для CALayer, поэтому, задавая позицию для UIView, мы фактически задаем позицию для слоя. На нижнем уровне объекты класса CALayer представлены четырехугольными примитивами OpenGL с изменяющимися текстурами, что позволяет добиться высокопроизводительного видеовывода.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

ХАКЕР m

07 /186/ 2014

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Рецепты кодинга под OS X, часть 2

0

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

105Click

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

1

Вернемся к видео, то есть спустимся вниз по иерархии

После этого похожим образом создай для каждой кнопки

Рис. 0. Добавленные

классов слоев до видеослоя. Воспроизведение видеоданных

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

фреймворки

осуществляется на слое — объекте класса AVPlayerLayer. Его

тип связи (Connection) — Action. Назови каждое событие, со-

 

 

достаточно только создать, остальную работу по воспроизве-

ответственно, PlayFileClick, SlowSpeedClick, NormSpeedClick,

Рис. 1. Итоговая форма

дению видео сделает класс AVPlayer.

RewindClick. К примеру, первое событие в коде должно выгля-

 

 

Разработаем простой пример для воспроизведения видео

деть следующим образом: (IBAction)PlayFileClick:(id)sender;.

Рис. 2. Создание от-

формата MP4. Создай новое Cocoa-приложение, Class Prefix

Остальные создаются аналогично.

ношения между компо-

и Document Extension заполни по желанию. После выбора

Добавим код для воспроизведения видео. В файл

нентом ГУИ и кодом

месторасположения проекта и его создания первым делом

AppDocument.h импортируй две либы:

 

 

откроется главная страница настроек, если этого не произо-

#import <AVFoundation/AVFoundation.h>

 

 

 

шло, щелкни на верхнем пункте дерева содержимого проек-

 

 

та слева. На этой странице нам надо добавить фреймворки,

#import <QuartzCore/QuartzCore.h>

 

 

которые будут использоваться в приложении. Внизу страни-

 

 

 

 

цы в разделе «Linked Frameworks and Libraries» ниже строки

Ниже их добавь расширение класса AppDocument. Оно со-

 

 

Cocoa.framework щелкни по знаку «+». Сверху выпадет спи-

стоит из добавления переменной-члена для хранения объек-

 

 

сок, состоящий из доступных для подключения фреймвор-

та-указателя на объект класса AVPlayer. Как мы обсуждали ра-

 

 

ков. Выбери: AVFoundation, CoreMedia и QuartzCore (все три

нее, он является ключевым звеном для проигрывания медиа:

 

 

с расширением Foundation). Щелчком по кнопке Add добавь

@interface AppDocument () {

 

 

 

их в проект.

 

 

Затем перетащи подготовленный MP4-файл на дерево про-

AVPlayer* player;

 

 

екта прямо в XCode. Появится диалоговое окно для выяснения

}

 

 

 

подробностей добавления файла, отметь флажок Destination:

@end

 

 

Copy items into destionation group’s folder (if needed) и пере-

 

 

 

 

ключатель Folder: Create folder references for any added folder,

После нажатия кнопки Play File мы будем проигрывать ви-

 

 

ниже в списке Add to targets отметь первый из двух проектов,

део, поэтому в обработчике этого события надо инициализи-

 

 

жми Finish. Далее, открой файл AppDocument.xib, в конструк-

ровать объект класса AVPlayer, ссылку на который мы объявили

 

 

торе формы удали с нее надпись и помести на форму ком-

выше: указать путь к проигрываемому файлу; кроме того, надо

 

 

понент Custom View (найди его с помощью поиска). Растяни

настроить объект класса AVPlayerVideo. В созданный ранее

 

 

помещенный на форму компонент вида. Дополнительно рас-

обработчик события (IBAction)PlayFileClick:(id)sender напиши:

 

 

положи на форме четыре кнопки: Play File, Slow Speed, Norm

NSURL* contentURL = [[NSBundle mainBundle]

 

 

 

Speed, Rewind.

 

 

Теперь добавим к компоненту Custom View слой. Для этого,

URLForResource:@"test" withExtension:@"mp4"];

 

 

 

выделив данный компонент, перейди на страницу View Effects

player = [AVPlayer playerWithURL:contentURL];

 

 

 

в инспекторе (последняя кнопка), в списке Core Animation Layer

AVPlayerLayer* playerLayer = [AVPlayerLayer

 

 

отметь Custom View. Тем самым мы указали использовать слой

 

 

 

 

CALayer, поверх которого можно добавить AVPlayerLayer.

 

 

 

 

Теперь мы готовы к тому, чтобы связать графические эле-

 

 

 

2

менты пользовательского интерфейса с кодом, то есть настро-

 

 

 

 

ить отношения. В OS X (и iOS) есть два типа отношений: Outlet

 

 

 

 

и Action. С помощью первого осуществляется связь графиче-

 

 

 

 

ского компонента с переменной в коде, во втором случае опи-

 

 

 

 

сывается событие: указывается метод, который должен быть

 

 

 

 

выполнен в результате генерации этого события. Сначала соз-

 

 

 

 

дадим аутлет, для этого открой AppDocument.h в отдельном

 

 

 

 

окне редактора (двойной щелчок на файле в навигаторе про-

 

 

 

 

екта). Затем из конструктора формы, установив курсор на ком-

 

 

 

 

понент Custom View и зажав клавишу CTRL, перетащи голубую

 

 

 

 

связывающую линию от данного компонента в окно кода —

 

 

 

 

в объявление интерфейса. После этого вылезет всплываю-

 

 

 

 

щее окошко, в котором можно выбрать тип связи (Outlet или

 

 

 

 

Action), задать имя и выбрать другие параметры.

 

 

 

 

В данном случае тип связи: Outlet, Name: videoPlayer, Type:

 

 

 

 

NSView, Storage: Weak. После задания значений кликни кноп-

 

 

 

 

ку Connect. В коде будет добавлено новое свойство — аутлет:

 

 

 

 

@property (weak) IBOutlet NSView *videoPlayer;.

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

106m

w Click

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

t

 

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Кодинг

 

 

 

 

 

to

 

 

 

 

 

ХАКЕР 07

w Click

 

 

 

 

 

m

 

 

/186/ 2014

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

-x cha

 

 

 

 

playerLayerWithPlayer:player];

[self.videoPlayer.layer addSublayer:playerLayer];

playerLayer.frame = self.videoPlayer.layer.bounds;

playerLayer.autoresizingMask =

kCALayerWidthSizable | kCALayerHeightSizable;

player.actionAtItemEnd =

AVPlayerActionAtItemEndNone;

[player play];

Обрати внимание: путь к проигрываемому файлу формируется на основе объекта NSBundle, который представляет собой каталог, содержащий корневую папку приложения с расширением app вместе с исполняемым файлом и скриптами внутри. Также путь составляют имя файла (test) и его расширение (mp4), которые указываются в параметрах конструктора объекта класса NSBundle. На основе определенного файла создается объект player. В качестве параметра он передается методу playerLayerWithPlayer для создания объекта-слоя AVPlayerLayer. Затем посредством сообщения addSublayer мы добавляем этот слой аутлету videoPlayer. Настраиваем некоторые параметры для видеослоя. Указываем для плеера действие при достижении конца файла (остановиться) и финальной операцией начинаем воспроизведение.

Откомпилируй и протестируй приложение. Видео должно проигрываться. Заполним остальные обработчики. Чтобы замедлить скорость, например в пять раз: [player setRate:0.2];. Для ее восстановления (нормальная скорость): [player setRate:1.0];. Для проигрывания файла с начала (без его пере-

загрузки): [player seekToTime:kCMTimeZero];.

ПРОИГРЫВАЕМАУДИО

Рассмотрим возможности еще одного класса для проигрывания медиа, а именно аудиофайлов. Добавь на форму еще одну кнопку: Play Audio. Создай объект — IBAction (событие).

В файл AppDocument.m в расширение класса AppDocument добавь ссылку на объект класса AVAudioPlayer: AVAudioPlayer *mplayer;. А в обработчике нажатия на кнопку напиши:

NSURL* soundFileURL = [[NSBundle mainBundle]

URLForResource:@"Here" withExtension:@"wav"];

NSError* err = nil;

mplayer = [[AVAudioPlayer alloc]

initWithContentsOfURL:soundFileURL error:&err];

if (!mplayer)

NSLog(@"Error creating player: %@", err);

mplayer.volume = 1.0;

mplayer.numberOfLoops = -1;

mplayer.currentTime = 0;

[mplayer prepareToPlay];

[mplayer play];

Здесь мы также формируем путь. На основе выбранного файла с помощью метода initWithContentsOfURL инициализируем объект класса AVAudioPlayer. Вторым параметром этот метод получает ссылку на объект класса NSError, куда в случае ошибки о ней будет записана информация. Если ошибки не будет, тогда этот объект останется пустым. Затем мы настраиваем созданный объект для проигрывания аудио: устанавливаем уровень громкости (свойство volume: 1.0 — максимальное значение), указываем количество проигрываний данного файла (свойство numberOfLoops: -1 означает бесконечность). Свойство currentTime позволяет указать временную отметку, откуда начать проигрывание данного звука. Сообщение prepareToPlay осуществляет подготовку к воспроизведению, и play начинает проигрывать звук.

Скомпиль и протестируй, все должно работать, как задумано. Пример (PlayViseoStremApp) ждет твоего внимания среди материалов к номеру.

ГЕОЛОКАЦИЯ

Геолокация — незаменимая штука на мобильных устройствах от Apple. Между тем на лэптопах и десктопах под управлением OS X тоже имеются средства для геолокации! На всем многообразии яблодевайсов присутствует три вида устройств для определения местонахождения: GPS, определение расположения на основе Wi-Fi и сотовых передатчиков.

GPS (система глобального позиционирования) используется исключительно на iPhone и некоторых моделях iPad, содержащих 3G/4G-передатчики. Как ты знаешь, GPS-системы работают на основе данных со спутников, покрывающих сигналами всю поверхность планеты. В результате позиция устанавливается довольно точно.

Месторасположение на основе Wi-Fi и сотовых передатчиков определяется похоже: в обоих случаях на основе близости нахождения определенной сигнальной базы, будь то Wi-Fi или сота. Однако если во втором случае аппаратной поддержкой могут воспользоваться владельцы айфонов и айпадов, то в первом также обладатели десктопов и лэптопов.

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

Создай новый Cocoa-проект, обзови его GeoLocation. Для разработки и тестирования приложения я буду с особым цинизмом использовать десктопный компьютер. Забегая вперед, отмечу, что оно вычислило мое размещение довольно точно. Для определения координат мы воспользуемся фреймворком Core Location, который не только един для настольных и мобильных Apple-платформ, но и использует один и тот же код для работы с разными типами геолокационных устройств. На первой странице настройки свойств проекта в разделе

Linked Frameworks and Libraries привычным движением добавь фреймворк Core Location. Создадим интерфейс приложения. По замыслу, мы запланировали вывести широту и долготу местонахождения устройства, а также точность (или погрешность) определения, измеряемую в метрах. Кроме того, мы попробуем вывести адрес, по которому находится устройство. Для этого служит отдельный класс. Он работает следующим образом: получив координаты места (широта, долгота), он может преобразовать их в адрес. Этот процесс называется обратным геокодированием, соответственно, преобразование из адреса в координаты называется геокодированием. Почему «может», а не «делает»? По двум причинам: 1) отсутствует соединение с интернетом, для преобразования нужна связь с Apple-сервером; 2) сервер попросту может не знать какое-то место, чтобы сопоставить ему адрес, — возможно, ты, как и я, находишься в ущелье Уральских гор (да-а, гонорары тебе отправлять тоже не так просто. — Прим. ред.).

Итак, открыв в навигаторе файл AppDocument.xib, перетащи на форму шесть надписей (Label), расположи их в два столбца по три надписи в каждом. В левом столбце измени свойство Title каждой надписи, соответственно, сверху вниз: широта, долгота, точность. Правый столбец надписей оставь пока без изменений. Ниже добавь седьмую надпись, предназначенную для вывода адреса, поэтому сделай ее подлиннее. Заметь, после запуска приложения и вывода координат вместе с адресом проходит некоторый временной промежуток, его продолжительность зависит от скорости коннекта с интернетом и может составить несколько секунд. Следовательно, надо показать пользователю, что программа в это время что-то делает, а не просто балуется, выведя окно с надписями.

Для этого поместим на форму Indeterminate Progress Indicator.

Растянем его на всю форму приложения. Форму моего тестового приложения можешь увидеть на рис. 3.

Пришло время связать интерфейс с кодом — создать аутлеты. Для каждой надписи, у которой мы не меняли Title, привычным способом создай аутлет. Каждый должен иметь следующие имена, сверху вниз: latitudeText, longitudeText, accuracyText, addressText. Дополнительно для индикатора тоже создай аутлет, назови его progressBar. Перейдем к коду.

В файле AppDocument.h импортируй либу CoreLocation.h: #import <CoreLocation/CoreLocation.h>, измени заголовок класса AppDocument, чтобы последний соответствовал де-

легатам NSApplicationDelegate и CLLocationManagerDelegate следующим образом: @interface AppDocument : NSDocument <NSApplicationDelegate, CLLocationManagerDelegate>. В фай-

ле AppDocument.m после импорта заголовочного файла добавим расширение класса, состоящее из объявления двух новых объектов:

@interface AppDocument () {

CLLocationManager* _locationManager;

CLGeocoder* _geocoder;

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

ХАКЕР m

07 /186/ 2014

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Рецепты кодинга под OS X, часть 2

3

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

107Click

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

4

}

@end

Первый из них служит для получения координат, второй — для выполнения обратного геокодирования. Ниже, в области реализации класса, синтезируем свойства-аутлеты.

Для примера — свойство latitudeText: @synthesize latitudeText = _latitudeText; остальные подобным образом (см. исходник (сэмпл GeoLocation)). Тем самым мы сообщаем компилятору Objective-C, чтобы он автоматически сгенерировал методы SET и GET для этих свойств. Переменная справа от знака присваивания (с лидирующим символом подчеркивания) нигде не объявлена, она синтезируется автоматически, то есть ее подставляет компилятор (в некоторых других языках, например C#, вместо нее служит ключевое слово value). Как только приложение загрузится и элементы управления на форме будут сгенерированы, надо создать объявленные объекты. Когда наступает этот момент, генери-

руется событие windowControllerDidLoadNib, следуй в его об-

работчик. Далее я не буду приводить весь код, так как куски довольно большие. Сначала создается и инициализируется объект _locationManager, затем ему передается сообщение startUpdatingLocation, и он начинает отслеживать положение на мировой карте. Таким же образом создается объект _geocoder, потом всем надписям для начального вывода присваивается «-», после чего на время ожидания информации о местоположении запускается анимация индикатора про-

гресса: [self.progressBar startAnimation:nil];. Обрати внимание:

поскольку координаты после вызова startUpdatingLocation обновляются периодически, это может стать причиной ненужного расхода заряда аккумулятора при неиспользовании приложения, поэтому во время его деактивации надо отключить объект _locationManger, передав ему сообщение stopUpdatingLocation.

Когда объект _locationManager получает данные, он генерирует событие didUpdateToLocation, в его обработчике происходит обновление надписей для вывода широты, долготы и точности. Новые данные берутся из объекта newLocation класса CLLocation, который передается в обработчик в качестве параметра. К примеру, так выводится широта: self.latitudeText. stringValue = [NSString stringWithFormat:@"%.2f", newLocation. coordinate.latitude]; также у индикатора прогресса останавли-

вается анимация: [self.progressBar stopAnimation:nil];.

Кроме того, в этом обработчике содержится блок кода, выполняющий процедуру обратного геокодирования. В начале блока выполняется метод reverseGeocodeLocation объекта класса CLGeocoder. Этот метод получает объект newLocation класса CLLocation с текущими координатами, вдобавок он получает указатели на массив и объект NSError, которые после выполнения метода содержат, соответственно, набор объек-

тов класса CLPlacemark, и, в случае возникновения ошибки,

Рис. 3. Форма прило-

информацию об ошибке. Если же ошибки не будет, тогда ука-

жения GeoLocation

затель на объект класса NSError будет содержать nil, в ином

 

случае в строке адреса на форме программа выведет сообще-

Рис. 4. Приложение

ние, что вычислить адрес невозможно, и завершит выполне-

GeoLocation

ние обработчика события. Каждый объект класса CLPlacemark

 

содержит набор строк, определяющих адрес, который соот-

 

ветствует координатам, в разных случаях это могут быть такие

 

записи: страна, город, улица и прочее. Однако в зависимости

 

от расположения устройства, определяющего местонахож-

 

дения, какие-то записи могут отсутствовать (как в примере

 

про Уральские горы). Далее по коду мы выбираем из массива

 

последний объект, он содержит самые новые данные о место-

 

расположении. Затем на основе записей полученного объ-

 

екта класса CLPlacemark формируем строку — объект класса

 

NSString. Последним действием блока кода мы присваиваем

 

эту строку свойству — аутлету addressText, чтобы вывести ее

 

в компонент на форме.

 

Если во время получения данных работа объекта _

 

locationManager преждевременно завершается с ошибкой,

 

тогда генерируется событие didFailWithError. В его обработ-

 

чике мы устанавливаем надписи в начальное состояние плюс

 

включаем анимацию индикатора.

 

На этом разработку приложения GeoLocation можно счи-

 

тать завершенной, все, что мы запланировали, оно выполняет.

 

Запусти и проверь его функциональность. У меня получился

 

такой вывод (рис. 4).

 

ИТОГИ

OS X содержит множество фреймворков для гибкого управления любым аспектом операционной системы и разнообразным оборудованием. В сегодняшней статье мы обратили внимание на мультимедиа и геолокацию. Для работы с мультимедиа мы воспользовались фреймворком AVFoundation, который предлагает мощные средства для загрузки данных из любых источников и воспроизведения видео и аудио самых разных форматов. Мы узнали о поддержке вывода видеоданных со стороны фреймворка Core Animation, который предоставляет слои для визуализации видеоконтента. В этом контексте мы разобрались и научились работать со слоями двух типов. Рассматривая тему геолокации, мы выяснили, какие аппаратные средства имеются в устройствах фирмы Apple, воспользовались средствами геолокационного фреймворка Core Location и научились с его помощью определять свое местонахождение и адрес, преобразуя «сырые» координаты в понятные сведения на уровне названия страны, города, улицы.

Не отступая от традиции, хочу пожелать тебе удачи в кодировании для систем от Яблока, освоении новых технологий и прочих простых программистских радостей. До встречи на страницах ][!

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

108m

w Click

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

Кодинг

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

ХАКЕР 07 /186/ 2014

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

ХАКЕР m

07/186/ 2014

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Мобильному кодеру: RAD XE6 или подешевле?

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

109Click

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

ŢŤŗŞšŲţŤŢũŠŤŚśŦũ:

RAD XE6 ŞšŞťŤŚśŮśŘšś?

ОБЗОР ВОЗМОЖНОСТЕЙ ДЛЯ МУЛЬТИДЕВАЙСНОЙ МОБИЛЬНОЙ РАЗРАБОТКИ

В апреле этого года вышла RAD XE6. Таблица возможностей среды разработки представляет собой 25-страничный PDF-документ, набранный очень мелким шрифтом. Бросается в глаза невероятное обилие наворотов для мобильного кодинга. Стоит ли ради них приобретать RAD XE6? ][ разобрался, что кроется за каждым пунктом рекламного проспекта, и протестировал новый продукт от Embarcadero на предмет удобства мобильной разработки. Мы сделали статью блоками, поэтому ты можешь посмотреть на соответствующие врезки и понять, имеет ли смысл покупать большую среду разработки или проще чуть напрячься и реализовать то же самое с помощью нативного инструментария.

ţśũţŞŠŖšŲţűś

 

 

 

 

 

 

ŠŤŢťŤţśţŨű

Ť RAD XE6

 

Визуальный редактор дизайна

 

 

 

 

Поддержка push-уведомлений

 

 

Ирина Чернова

• Custom Pickers, Date Picker и Time Picker

Embarcadero Techonologies третий десяток лет представ-

irairache@gmail.com

• Поддержка интерфейса совершения звонка

лена на рынке программного обеспечения для управления

 

Нативные стилевые опции

базами данных (наиболее значимые продукты — InterBase

 

Компонент TListView

и Rapid SQL). В 2008 году компания купила у разорившей-

 

• Swipe-to-Delete

ся Borland подразделение CodeGear, которое занималось

 

• Поддержка жестов (swipe, касание и удержа-

Delphi и C++ Builder. В 2011 году Embarcadero выпустила

 

 

ние, масштабирование и другие)

RAD XE2 — IDE, объединяющую компоненты для разработ-

 

Встроенные фильтры поиска

чиков под Delphi и под C++. Последняя версия (XE 6) вклю-

 

• Поддержка различных типов клавиатуры

чает следующие компоненты:

 

Доступ к камере

Delphi;

 

Сенсоры ориентации (гироскоп/компас)

InterBase;

WWW

 

и датчик движения

C++Builder;

• Компоненты доступа к данным

HTML5 Builder.

Официальная

• Встраивание браузера в приложение

 

 

 

 

 

 

страница RAD XE6:

 

 

 

 

goo.gl/G4Gs3i

ŗŞŗšŞŤŨśŠŖ FIREMONKEY

Эта либа — основное преимущество RAD перед другими

 

средами разработки. Позиционирует себя как платформу

 

для создания приложений нового поколения (Windows,

WARNING

Mac, Android, iOS). Основная ее фишка — запредельная

оптимизация использования железа и повышение произ-

Понравилась перспекти-

водительности. Все новшества мобильного кодинга реали-

зованы на ее основе. Достойна отдельной статьи. Содер-

ва iOS-кодинга на C++?

жит инструменты для программирования 3D, встроенные

RAD в этом не уникальна.

компоненты для подсоединения к различным типам баз

Есть еще Marmelade SDK

данных и много чего еще. Подробности: goo.gl/Lo9pcg.

(goo.gl/IGfZCT) за 15

 

долларов в месяц и не-

 

сколько других менее

Макросы!

популярных решений.

Соседние файлы в папке журнал хакер