Введение в on-board программирование для Palm OS. Консольные приложения

Предисловие. "Там живут несчастные..."

Если Вы программист в душе :) и давно работаете с палмом, то наверняка у Вас не единожды возникало желание значительно упростить жизнь, написав пару утилит "под себя". Причем, по возможности, не сходя с любимой "игрушки".

Меня оно замучило уже с первых часов работы с моим Palm IIIe. Останавливало, только широко распространенное утверждение о сложности программирования для Palm OS, требующей долгого изучения...

Если уж об этом говорили профессиональные разработчики, работающие на мощных ПК в дорогих средах разработки, то казалось, что здесь "ловить" любителю? Но однажды, два года, назад я рискнул! И сам удивился результату: написание небольших программ прямо на КПК оказалось ничуть не сложнее, чем на его старших собратьях, и отнюдь не требовало долгих часов знакомства. Со временем ситуация только улучшилась и сегодня достижениям "карманных" разработчиков могут позавидовать "профессионалы".

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

Часть I. "На лицо ужасные - добрые внутри!"

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

Откроем интернетовские копилки и пороемся в разделе разработчика: знаменитый OnBoard C пока откладываем - за него просят денег. Пропускаем и экзотику (Forth, APL , Casl и т.п.). Выбор все еще остается: FreePascal (новичок), LispMe (ветеран), yBasic (он же cBas Pad появившийся еще со времен Pilot'a!) , SmallBasic (варяг) . Moжет, что и пропущено, пишите.
Краткая оценка.

Palm OS Pascal compiler (PP) он же FreePascal
Требования: Palm OS 3.5 - 5.0
Размер в памяти:~500 Кб
http://pages.total.net/~hkontas/pp.html

Навскидку, наиболее предпочтительным выглядит вариант недавно появившегося компилятора Паскаля, как широко распространенного и стандартизированного ISO /ANSI языка с большим потенциальным "запасом" готового кода. Вдобавок, это единственный из "номинантов", выдающий машинный код, и как следствие, далеко оторвавшийся по скорости от конкурентов. Встроенная поддержка inline кода, теоретически, позволяет вызывать любые функции API (на практике это слишком сложно для простых смертных). Ограничения на размер программ и данных - стандартные для Palm OS 4.0. Самое удивительное, что это тоже продукт карманной разработки. Он откомпилирован на OnBoard C!

Для его работы нам потребуется: Palm OS >3.5, библиотека ( желательно и среда) VFS-Dos, библиотека MathLib 1.1 и (сюрприз!) редактор файлов формата Doc.

Увы, недостатки у него немалые - скомпилированный код не запустишь прямо из окна приложений (Palm Application), не прикрепишь к кнопке. Интерфейс предлагается только консольный, в среде vfsdos. Ввод-вывод только в неупакованные doc-файлы. Компилятор также имеет привычку перезагружать Ваш КПК (см. советы). Что самое худшее, придется забыть о русском языке! Эти ограничения, во многом делают PP вещью в себе, пригодной скорее для обучения, чем для реальной работы.

Это еще не все: может и смешно, но я не знаю freeware редактора doc формата. Читалок - сколько угодно, демок - тоже немало, а вот легальный и бесплатный редактор - проблема (конечно и этой проблеме можно найти решение, но ведь хочется быть белыми и пушистыми...)

Поэтому, давайте ненадолго отложим этот продукт и посмотрим остальной список. Может, удастся решить проблему?

Hotpaw yBasic (бывший cbasPad Pro Basic).
Требования: Palm OS > 2.0
Размер в памяти:~200 Кб
http://www.hotpaw.com/rhn/hotpaw/

yBasic - очень уважаемое у пальмаводов имя. Он стал одним из первых массовых карманных средств разработки (под именем cBasPad ) придя еще со времен Pilot'ов ( с 1996 г!). Автор заметки тоже начинал с него. Продукт не бесплатен, но и его ограниченной демо-версии хватает для простых программ (размером до 1 Кб). Этот продукт основательно интегрирован с Palm OS (около 20 специальных команд и функций). Тексты программ хранятся в MemoPad. Он также позволяет запускать одно из своих приложений напрямую, с помощью утилиты yLaunch.

Файловые средства работают с текстами MemoPad, различая их по номерам (open "memo",4 for ...). Можно также работать с записями To Do, Address. Увы, чисто языковые возможности этого бейсика (уровень GWBasica - вспоминаем метки и goto), и документированность оставляют желать лучшего. Раздражают и демо-ограничения. В процессе моей работы в конце 2001 - начале 2002 г. он регулярно вешал Palm IIIe, и даже сумел "добиться" Hard Reset'a с полной переустановкой софта. Вероятно, нестабильность работы была связана с использованием бета-версии 1.3.0b0 (ныне на http://www.hotpaw.com лежит 1.3.9). Вскоре, мои эксперименты с ним закончились, но Вам, конечно, никто не мешает, особенно если надо поработать с системой поглубже, например, залезть в буфер обмена или поменять что-нибудь в регистрах. Скорость работы приемлемая.

Кстати, у меня довольно долго висела на yLaunch утилитка, конвертирующая текст из буфера обмена в формат hexedt и обратно.

LispMe 3.11
Требования: Palm OS 2.0-5.0
Размер в памяти:~150 Кб
http://www.lispme.de

Реализацию одного из известнейших языков назвать экзотикой конечно нельзя (пользователям AutoCad'а, например, он очень нравится), но лично мне было трудновато работать из-за нестандартности языковых конструкций. Продукт совершенно бесплатен и хорошо документирован (в HTML). На палме работает с 08/1997, совместим с версиями Palm OS 2-5. Исходники функций хранятся в Мемо. Возможности интерпретатора весьма велики, он отлично интегрирован с Palm OS, поддерживает параллельные сессии, сокеты, серийные (IR) порты, обрабатывает различные PDB форматы, включая memo (увы, doc'a нет) и некоторые базы данных, может использовать полноценные дружественные интерфейсы (формируемые правда стандартным образом, настольно, с помощью компилятора ресурсов совместимого с PilRC.). К сожалению, для полноценной работы с системой придется изучать Palm API. Основное неудобство - запускать все программы можно лишь из самого LispMe, но это можно простить за все остальные достоинства.

Итак, если Вы хорошо знаете Lisp и не боитесь Palm API - можете смело останавливать на этом продукте свой выбор. Скорость запуска и работы программ вполне терпимая. Про его ограничения нигде не сказано, но создать список больше 60 К в LM версии 3.07 мне не удалось.И, наконец,

Наконец SmallBasic
Требования: Palm OS > 3.0
Размер в памяти:~370 Кб
http://smallbasic.sf.net

Знакомое название? Да, это тот самый любимый студентами SmallBasic (MicroBasic) пришедший с Xenix/Dos. Ныне он поддерживается на Palm вместе с умножением матриц и решением систем уравнений :). Разумеется, версии под Unix/Linux/Dos/Windows тоже есть. Почти все Ваши программы будут нормально работать и на настольных ПК и на карманных машинках, что сильно облегчает их разработку и отладку.

Конечно, маленьким SmallBasic можно назвать только в сравнении с VB. Это один из весьма продвинутых бейсиков, с хорошими языковыми конструкциями, и поддержкой подключения библиотек процедур(#include), изначально ориентированный на студентов первых курсов. Дополнительно, он включает в себя удобную среду разработки (текстовый редактор и отладчик). К достоинствам нужно отнести подробную справку по языку и функциям доступную прямо из Palm'a. Написанные программы можно компилировать в байт-код и выносить на панель приложений или кнопки Palm'а.

Вызываются и выполняются они как обычные Палм-приложения. По быстродействию программы занимают твердое второе место после PP. Размер байт-кода на Palm ограничен 64 Кb.

SB, единственный, кто нормально поддерживает два основных текстовых формата файлов MemoPad и Doc. Также поддерживаются файловые системы карточек, ком-порты и сокеты .

Графические возможности стандартные для бейсиков, стилус рассматривается как щелчки мыши. Консоль поддерживает управляющие коды ANSI (см. советы).

На этом интеграция с Palm OS увы, заканчивается. Никакой возможности добраться до PDB-записи или буфера обмена не существует. Ввод-вывод (за исключением графики) текстовый/консольный.

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

Помните, я говорил, что для FreePascal не хватает бесплатного текстового редактора в формате Doc. Вот и решение проблемы - редактируем файл в формате MemoPad и конвертируем в DOC. Для этого "компилируем" на SB небольшую утилитку конверсии (со слиянием и транслитерацией) серий Memo-файлов с расширением PASxx в DOCовский с тем же именем и выносим ее в список приложений Palm OS. (см. раздел примеры.)Небольшие Паскалевские программы можно набирать прямо в оболочке SB и экспортировать их в doc-формат. :)

Так что же выбрать? Решать Вам, но если можно ограничиться консольным или простым графическим интерфейсом и не требуется высокого быстродействия - SmallBasic наверное будет лучшим выбором. То же можно сказать о случаях мат. расчетов или программах, которые нужно будет запускать и на ПК.

Если же Вам катастрофически не хватает быстродействия, памяти, или требуются сложные структуры данных, обратитесь к Паскалю, а еще лучше работайте на ПК.

Чтобы обрабатывать данные адресной книги или расписание попробуйте установить yBasic, но не забывайте, что бесплатно он поддерживает только до 4-х програм по 1 Кб.

Если Вам знаком и нравится Lisp, то смело ставьте LispMe u почти вся API Palm OS будет в Вашем распоряжении.

Если Вы захотели написать программку для посторонних, можете воспользоваться SB, создать установочный архив, содержащий байт код Вашей программы вместе с интерпретатором. Потребитель ничего не заметит (кроме странного интерфейса :( ).

Увы, не одно из этих средств не позволяет создавать программы, переносимые на перспективную платформу Pocket PC. Кстати для этой платформы мне вообще не удалось найти бесплатных карманных средств разработки.

Если же Вам со временем захочется, не тратя много сил и средств, создать нечто более серьезное или переносимое, то присмотритесь к ПКшным средствам разработки, например Waba или дождитесь 2-й части статьи.

Часть II. Советы и секреты. "Надо понедельники взять и исключить".

Все нижесказанное является лишь моими наблюдениями, может быть ошибочными.

Palm OS Pascal

Думаю про сам паскаль рассказывать нечего . Ему посвящены сотни книг. Коснемся реализации.

Как уже отмечалось FreePascal несколько сыроват. Главной проблемой, с которой Вы столкнетесь при разработке программ на нем станет отсутствие проверок границ массивов. Программисту, привычному к безопасной разработке Паскалевских программ с массивами, придется не раз перезагружать Палм, а то и его содержимое.

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

Учтите, что в отличие от ТурбоПаскаля, строки (тип String) кодируются в Си-шном формате (с завершающим 0).

Также не стоит удивляться, если не сможете прочитать doc файл, созданный другой программой. Среда исполнения поддерживает только неупакованный формат этих файлов, используемый немногими программам. Сам компилятор работает с любыми.

Если у Вас вдруг не подключилась MathLib - значит, загружена старая версия компилятора или самой MathLib. Обновите их с http://pages.total.net/~hkontas/pp.html

В моем m515 верхняя scroll клавиша работает как Ctrl-C. Как сделано в системах с колесиком - не знаю.

Главная проблема - не работает русский язык, даже в комментариях. Чтобы не мучиться с читабельностью программ, пишите их в MemoPad и воспользуйтесь приведенным в примерах конвертором Memo-> Doc с функцией транслитерации.

yBasic

Basic как язык тоже описывать не стоит. :)

Боюсь, мои советы уже порядком устарели. Главный, из них - помните, переменные s$ и r$ используются yBasic как служебные массивы для работы с Palm OS. Не в коем случае не используйте их в программе. Это прямой путь к перезагрузке.

Файлы MemoPad адресуются по номерам, но их порядок может меняться в случае модификации. Поэтому, перед очередным открытием не забудьте перепроверить номер.fid = db.find("memo","test.pas")
if (m open "memo",fid as #4
...
fid = db.find("memo","test.pas") -- Обязательно!
open "memo",fid as #4.

Способ открытия определяется по номеру потока. 4 - предназначена для записи и модификации.

Функция db.find , корректно работает только с теми приложениями, которые поддерживаются yBasic (Memo, Address, ToDo, DB, JFile,List,HanDBase). При работе с остальными yBasic обычно рушится.

Новый файл создается с помощью специальной формы open new, но помните, что оператор open new "memo", "test.pas", выполненный дважды, не перезапишет, а создаст два новых файла с одинаковым именем.

При записи в clipboard оператором put,
put "clipboard", "text..."
не забывайте, что длина буфера в Palm OS ограниченна в зависимости от версии, а yBasic запишет столько, сколько вы попросите, невзирая на последствия.

Программу, хранящуюся в файле memo:startup.bas, можно запускать напрямую, утилитой yLaunch.

LispMe

У меня еще мало опыта работы с ним, но главное уже ясно. Чтобы нормально работать, нужно изучить хотя бы основы Palm API. Высокоуровневых функций обработки данных в нем почти не наблюдается. Для хранения символов используется двухбайтовый тип, поэтому с нормальной работы с русским придется потрудиться.

SmallBasic

Перед началом работы прочитайте встроенную справку. Не пожалеете. Почти все нижесказанное есть там.

Главное: - работа с консолью не означает отсутствия интерфейса вообще. SB экран поддерживает ANSI -коды управления экраном. Также, функцией inkey можно обрабатывать жесткие кнопки. Поэтому, например, текстовый редактор на SB написать вполне реально.

Только в справке есть ошибка- "e ", "x" не поддерживается, поэтому коды лучше посылать командой вида print chr(27) + "[:m". Вообще задание специальных символов через слэш не работает, хотя в справке примеры приводятся.

Этот язык также отличается очень удобными потоковыми конструкциями - их стоит изучить подробнее. Например, для работы с массивами переменной имеется оператор for in последовательно перебирающий все элементы массива: dim array(10) :::for i in array : print i : next i. С помощью специальных функций массивы можно использовать как определители (!).

SB поддерживает подключаемые библиотеки #inc: "namelib.bas", и локальные переменные в процедурах и функциях. Это сделает Ваши программы более читаемыми.

Если при работе функции выдается вроде бы беспричинное Stack overflow- значит Вы воспользовались оператором return. Это неправильно - в бейсике значения и возвращаются присвоением переменной с именем функции. Управление возвращается оператором exit func/sub. Return используется для выхода из главной программы.

Работа с файлами форматов memo,doc и карточек поддерживается по именам:open "memo:test.pas", open "pdoc:test.pas", open "vfs:test.pas". "pdoc:" означает упакованный (packed) doc, но этот префикс нормально читает и неупакованные файлы. Для работы с большими и упакованными doc-файлами лучше пользоваться не стандартными операторами чтения (почему-то страшно тормозящими в этом случае), а функцией input или bgetc (bputc).

Если два файла имеют одинаковое имя - откроется раньше сохраненный. Для обхода этого ограничения при работе с сериями переименовывайте или удаляйте обработанные файлы. При операциях с каталогами или групповых операциях можно использовать символы шаблонов (*,?).

Для работы с небольшими файлами (особенно memo) есть удобные операторы tload и tsave (см. справку и примеры), загружающие их целиком в массивы или, наоборот, выгружающие из них.

Работу зациклившейся программы можно прервать, вызвав меню (пункт Break).

Да, чуть не забыл, файлы во встроенном редакторе нужно сохранять явно, командами Save или Save&Run. Если во время работы с файлом, Вы перейдете в другое приложение, все изменения потеряются.

Чтобы вынести программу XXX в Palm Application, нужно выполнить ее один раз (чтобы откомпилировалась), выйти в главное меню, дать команду Edit/File Details (или /D) и включить флажок Palm OS script. Теперь, в панели приложений, (каталог "Unfiled") появится новая программа XXX.bas. Можете перемещать ее в нужный каталог.

После синхронизации байткод этого приложения, находится в базе программ и данных Palm OS под именем /Palm/BackUp/A/XXX_bin.pdb. Его можно распространять как отдельную программу, прилагая в архив интерпретатор. Исходный текст прилагать необязательно.

Практические примеры. "На проклятом острове нет календаря"

Пример N 1

Программа mpas2d - конвертирует файлы формата memo в формат doc. Обрабатываются все файлы заданного шаблона (*.pas). Большие файлы можно помещать в несколько записей нумеруя их ч/з расширение:test.pas, test.pas1, test.pas2

Дополнительно работает функция транслитерации c русского текста в английский, чтобы в программе можно было нормально работать с комментариями.
'm2dpas.bas - модификация для паскаля.
' 02/04/2003
func ruslat( ts)
' транслитерация строк
sr= "абвгдеежзийклмнопрстуфцхьыъэ"
sl="abvgdeejziуklmnoprstufhc'i'е"
ts=translate (ts,"ч","ch")
ts=translate (ts,"ш","sh")
ts=translate (ts,"щ","sch")
ts=translate (ts,"ю","yu")
ts=translate (ts,"я","ya")
for i =1 to len (sr)
ts=translate (ts,mid(sr,i,1),mid(sl,i,1))
next i
? ts
ruslat=ts
end

dim file_list(1) ' список memo файлов
dim atxt(1) ' тело файла
file_list= files("memo:*.pas") ' Получаем список файлов , соотв. шаблону

for i in file_list
fn1="memo:"+i
fn2="pdoc:"+i
' Варианты формата доп. файлов
' ext_name= translate(fn1,".pas",".")
ext_name=fn1
id=1
' загрузка файла в массив
tload fn1,atxt
' вывод файла в doc-mode
open fn2 for output as #4
for j in atxt
print #4, ruslat(j)
next j
' поиск и копирование дополнений.
while (exist(ext_name+id))
tload ext_name+id,atxt

for j in atxt
print #4, ruslat(j)
next j
id++
wend
close #4
next i

Осталось только поставить флажок Palm OS script (см. Советы). Теперь, в панели приложений, появилась новая программа m2d.bas. Можете перемещать ее в нужный каталог или использовать в командном файле VFS Dos.

Пример N 2

Программа d2m решает обратную задачу - разбивает заданный doc файл (или их группу) на несколько memo. Это удобно для обработки на Palm больших текстов.

' d2m.bas
' 11/06/2002
dim file_list(1) ' список файлов
dim atxt(1) ' тело файла
? files("pdoc:*")
input "Введите шаблон " , fpic
file_list= files("pdoc:"+fpic) ' Шаблон
for i in file_list
? "Обрабатывается:", i
fn=i
open "pdoc:"+fn for input as #1
? "open"
sz=0
id=0
open "memo:"+fn for output as #4
while not eof(1)
sz++
ch=bgetc(1)
' ch=input( 1, 1)
' print#4, ch;
bputc#4; ch
if (ch=10 and sz>3000) or sz>3500 then
close#4
id++
sz=0
? "part "+id
open "memo:"+fn+id for output as #4
endif
wend
close #1
close #4
next i

Пример N 3

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

Обычно, читать их на телефоне очень утомительно, тем более, что при быстром СМС-центре они приходят вперемешку.

Для решения этой проблемы я выбрал программку, поддерживающую "оптовую" запись (экспорт) входящих СМС в Memo - это оказалась MasterSMS 1.5 (именно первая версия, а не вторая, где в демо все убрано) и после приема почты запускаю небольшую программку, компонующую почту в единый файл с одновременным просмотром

' readsms.bas
' 13/02/2002
dim tout(100) ' обрабатываются письма длиной до 100 СМС (16000 Кб).
' больше нет смысла из-за ограничений шлюза
dim asl(1)

iout=0
fn="memo:000" ' 000- номер моего шлюза, подставьте свой
while (exist(fn))
sums=""
tload fn,asl ' Загрузка файла в массив

for i in asl
if len(sums)>0 then
sums=sums+chr(10)+chr(13) ' Запись массива в одну строку допустима т.к. размер СМС физически ограничен 165 символами.
endif
sums=sums+i
next i
ifrag=val(leftof(mid(sums,2),"/")) ' Определяется номер фрагмента
tout(ifrag)=rightof( sums,")") ' И текст записывается в соотв. строку массива.
? ifrag
iout=max(iout,ifrag) ' Количество СМС-ок
kill fn ' обработанный файл удаляется
wend

? iout
if iout =0
stop
endif ' Если текста нет не портим прошлый файл - защита от двойного запуска.
open "pdoc:email" for output as #4
for i=1 to iout
print #4,tout(i),
next i
close #4
for i=1 to iout ' Выводим на экран с паузами на каждом фрагменте.
? tout(i),
while len(inkey)=0
wend
next i

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

Осталось добавить, что этот текст был в основном набран на MemoPad в Palm m515.



Эта статья с сайта PalmQ Online
http://www.palmq.ru

URL этой статьи:
http://www.palmq.ru/sections.php?op=viewarticle&artid=89