home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
linuxmafia.com 2016
/
linuxmafia.com.tar
/
linuxmafia.com
/
pub
/
palmos
/
palmmetex-0.0.3.tar.gz
/
palmmetex-0.0.3.tar
/
palmmetex-0.0.3
/
PMetex.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-04-24
|
22KB
|
977 lines
/* Main code for PalmMetex */
/* $Id: PMetex.c,v 1.9 1999/08/30 18:41:20 bodo Exp $ */
#include <Pilot.h>
#include <SerialMgr.h>
#include <SysEvtMgr.h>
#include "callback.h"
#include "PMetexRsc.h"
#define DBTYPE 'Data'
#define noRecordSelected 0xffff
typedef struct {
UInt version;
ULong appID;
Int baudRate;
UChar time; /* sec */
} rec0valT;
typedef struct {
ULong when;
Char display[14];
} recT;
/* begin globals */
Long aktList = 0;
UInt nextRec = 0;
Boolean running = false;
UInt refNum = 0;
Boolean alertOnTimeout = false;
DmOpenRef myDB = 0;
Char dbName[] = "PalmMetexDB";
rec0valT rec0val = {
1,
APPID,
1200,
5
};
Boolean logIt = true;
/**************************/
static Word CurrentRecord = noRecordSelected;
static Word TopVisibleRecord = 1;
/* end globals */
VoidPtr GetObjectPtr(Int objectID)
{
FormPtr pfrm;
pfrm = FrmGetActiveForm();
return FrmGetObjectPtr(pfrm, FrmGetObjectIndex(pfrm, objectID));
}
Boolean InitSerialPort(Int baudrate)
{
SerSettingsType settings;
Err retval;
settings.baudRate = baudrate;
settings.flags = serSettingsFlagStopBits2 |
serSettingsFlagBitsPerChar7;
settings.ctsTimeout = serDefaultCTSTimeout;
retval = SysLibFind("Serial Library", &refNum);
ErrFatalDisplayIf(retval != 0, "Couln't find serial library!");
retval = SerOpen(refNum, 0, baudrate);
if (retval != 0) {
if (retval == serErrAlreadyOpen) {
SerClose(refNum);
FrmAlert(SerialInUseAlert);
} else {
FrmAlert(CantOpenSerialAlert);
}
return 0;
}
retval = SerSetSettings(refNum, &settings);
if (retval == serErrNotOpen)
ErrFatalDisplay("Serial port not opened!");
else if (retval == serErrBadParam)
ErrFatalDisplay("Bad serial parameters");
return 1;
}
void read_dmm(void)
{
Char buf[15];
Err retval;
RectangleType r;
CustomPatternType p;
Word err;
BooleanPtr ctsOnP = NULL;
BooleanPtr dsrOnP = NULL;
VoidHand RecHandle;
Ptr RecPointer;
recT record;
r.topLeft.x = 50;
r.topLeft.y = 100;
r.extent.x = 140;
r.extent.y = 10;
p[0] = 0;
p[1] = 0;
p[2] = 0;
p[3] = 0;
WinSetPattern(p);
EvtResetAutoOffTimer();
StrCopy(buf, " ");
SerSend10(refNum, "D\n", 2);
retval = SerReceive10(refNum, buf, 14, 1 * sysTicksPerSecond);
if (retval == serErrLineErr) {
err = SerGetStatus(refNum, ctsOnP, dsrOnP);
SerClearErr(refNum);
FrmCustomAlert(SerErrAlert, StrIToA(buf, err),
err == 12 ? "Try disconecting RTS (Pin 4)" : " ",
" ");
} else {
if (retval != serErrTimeOut) {
buf[13] = '\0';
WinFillRectangle(&r, 0);
WinDrawChars(buf, 13, 50, 100);
if (logIt) {
StrNCopy(record.display, buf, sizeof(record.display));
record.when = TimGetSeconds();
RecHandle = DmNewRecord(myDB, &nextRec, sizeof(record));
RecPointer = MemHandleLock(RecHandle);
DmWrite(RecPointer, 0, &record, sizeof(record));
MemPtrUnlock(RecPointer);
DmReleaseRecord(myDB, nextRec, true);
nextRec++;
}
} else {
if (alertOnTimeout)
FrmAlert(TimeoutAlert);
}
}
}
Boolean doitall(void)
{
if (!running) /* paranoia checking */
return false;
if (InitSerialPort(rec0val.baudRate)) {
read_dmm();
SerClose(refNum);
return true;
}
return false;
}
static int findBaudSelectionByValue(long value)
{
switch(value) {
case 300: return 0; break;
case 600: return 1; break;
case 1200: return 2; break;
case 9600: return 3; break;
default : return 4; break;
}
}
static int findTimeSelectionByValue(long value)
{
switch(value) {
case 1: return 0; break;
case 2: return 1; break;
case 5: return 2; break;
case 10: return 3; break;
default: return 4; break;
}
}
static void ClearLog(void)
{
Err err;
UInt numRecords;
numRecords = DmNumRecords(myDB);
while(--numRecords) {
err = DmRemoveRecord(myDB, numRecords);
ErrNonFatalDisplayIf(err, "DmRemoveRecord failed");
/*
if (err)
break;
*/
}
}
static Boolean MainFormHandleEvent (EventPtr e)
{
Boolean handled = false;
FormPtr frm;
Char tmpChar1[10], tmpChar2[10];
CALLBACK_PROLOGUE
switch (e->eType) {
case frmUpdateEvent:
CtlEraseControl(GetObjectPtr(e->data.frmUpdate.updateCode));
if (e->data.frmUpdate.updateCode == lList) {
LstSetSelection(GetObjectPtr(lList), findBaudSelectionByValue(rec0val.baudRate));
CtlSetLabel(GetObjectPtr(bList), StrIToA(tmpChar1, rec0val.baudRate));
} else { /* e->data.frmUpdate.updateCode == lTime */
LstSetSelection(GetObjectPtr(lTime), findTimeSelectionByValue(rec0val.time));
CtlSetLabel(GetObjectPtr(bTime), StrIToA(tmpChar2, rec0val.time));
}
CtlDrawControl(GetObjectPtr(e->data.frmUpdate.updateCode));
handled = true;
break;
case frmOpenEvent:
frm = FrmGetActiveForm();
LstSetSelection(GetObjectPtr(lList), findBaudSelectionByValue(rec0val.baudRate));
LstSetSelection(GetObjectPtr(lTime), findTimeSelectionByValue(rec0val.time));
CtlSetLabel(GetObjectPtr(bList), StrIToA(tmpChar1, rec0val.baudRate));
CtlSetLabel(GetObjectPtr(bTime), StrIToA(tmpChar2, rec0val.time));
FrmDrawForm(frm);
handled = true;
break;
case menuEvent:
MenuEraseStatus(NULL);
switch(e->data.menu.itemID) {
/*
case mAbout:
FrmAlert(AboutAlert);
break;
*/
case mViewLog:
FrmPopupForm(ViewLogForm);
break;
case mClearLog:
if (FrmAlert(ClearLogAlert) == 0)
ClearLog();
break;
}
handled = true;
break;
case ctlSelectEvent:
switch(e->data.ctlSelect.controlID) {
case bStart:
if (running) {
CtlSetLabel(GetObjectPtr(bStart), "Start");
CtlSetEnabled(GetObjectPtr(cLog), true);
CtlSetEnabled(GetObjectPtr(bList), true);
CtlSetEnabled(GetObjectPtr(bTime), true);
running = false;
}
else { /* not runing */
CtlSetEnabled(GetObjectPtr(bTime), false);
CtlSetEnabled(GetObjectPtr(bList), false);
CtlSetEnabled(GetObjectPtr(cLog), false);
CtlSetLabel(GetObjectPtr(bStart), "Stop");
running = true;
doitall();
}
handled = true;
break;
case cLog:
logIt = CtlGetValue(GetObjectPtr(cLog));
break;
}
break;
case popSelectEvent:
aktList = e->data.popSelect.listID;
if (e->data.popSelect.selection == 4) {
FrmPopupForm(enterValueForm);
handled = true;
} else {
CharPtr tmpList = LstGetSelectionText(GetObjectPtr(aktList),
LstGetSelection(GetObjectPtr(aktList)));
if (aktList == lList) {
rec0val.baudRate = StrAToI(tmpList);
} else { /* aktList == lTime */
rec0val.time = StrAToI(tmpList);
}
}
break;
case nilEvent:
if (running) {
handled = doitall();
}
break;
default:
break;
}
CALLBACK_EPILOGUE
return handled;
}
static Boolean enterValueFormHandleEvent(EventPtr e)
{
Boolean handled = false;
const FormPtr frm = FrmGetActiveForm();
CALLBACK_PROLOGUE
switch (e->eType) {
case frmOpenEvent: {
FieldPtr fld = GetObjectPtr(fenterValue);
Char tmpText[10];
if (aktList == lList) {
StrIToA(tmpText, rec0val.baudRate);
} else { /* aktList == lTime */
StrIToA(tmpText, rec0val.time);
}
FldInsert(fld, tmpText, StrLen(tmpText));
FrmDrawForm(frm);
FrmSetFocus(frm, FrmGetObjectIndex(frm, fenterValue));
FldSetInsertionPoint(fld, FldGetTextLength(fld));
break;
}
case menuEvent:
MenuEraseStatus(NULL);
switch (e->data.menu.itemID) {
}
handled = true;
break;
case ctlSelectEvent:
switch (e->data.ctlSelect.controlID) {
case bOK: {
FieldPtr fld = GetObjectPtr(fenterValue);
Handle textH;
CharPtr textP;
Int tmpVal;
textH = FldGetTextHandle(fld);
if (textH) {
textP = MemHandleLock((VoidHand)(textH));
tmpVal = StrAToI(textP);
MemHandleUnlock((VoidHand)(textH));
if (aktList == lList) {
rec0val.baudRate = tmpVal;
} else { /* aktList == lTime */
rec0val.time = (Char) tmpVal;
}
}
FrmUpdateForm(MainForm, aktList);
FrmReturnToForm(MainForm);
handled = true;
break;
}
case bCancel:
FrmReturnToForm(MainForm);
handled = true;
break;
}
break;
default:
break;
}
CALLBACK_EPILOGUE
return handled;
}
#if 1 /* NEW TABLE CODE */ /* HIER DREHEN */
static Boolean SeekRecord(UIntPtr indexP, Int offset, Int direction)
{
DmSeekRecordInCategory(myDB, indexP, offset, direction, dmAllCategories);
if (DmGetLastErr())
return false;
return true;
}
static Word ViewLogNumberOfRows(TablePtr table)
{
Word rows;
Word rowsInTable;
Word tableHeight;
/* FontID currFont; */
RectangleType r;
rowsInTable = TblGetNumberOfRows(table);
TblGetBounds(table, &r);
tableHeight = r.extent.y;
/* currFont = FntSetFont(ListFont); */
rows = tableHeight / FntLineHeight();
/* FntSetFont(currFont); */
if (rows <= rowsInTable)
return rows;
else
return rowsInTable;
}
static void ViewLogUpdateScrollers(FormPtr frm, Word bottomRecord)
{
Word pos;
Word rows;
Word maxValue;
rows = ViewLogNumberOfRows(GetObjectPtr(tLog));
if (/* numRecords */ nextRec > rows) {
pos = DmPositionInCategory(myDB, TopVisibleRecord, dmAllCategories);
maxValue = /* numRecords */ nextRec - rows;
} else {
pos = 1;
maxValue = 1;
}
SclSetScrollBar(GetObjectPtr(sLog), pos, 1, maxValue, rows);
}
static void ViewLogLoadTable(FormPtr frm)
{
Word row;
Word recordNum;
Word lineHeight;
Word dataHeight;
Word tableHeight;
Word lastRecordNum = 0; /* shut up GCC */
Word numRows;
ULong uniqueID;
/* FontID currfont; */
TablePtr table;
VoidHand recordH;
RectangleType r;
ErrNonFatalDisplayIf(TopVisibleRecord == 0, "TopVisibleRecord == 0");
table = GetObjectPtr(tLog);
TblGetBounds(table, &r);
tableHeight = r.extent.y;
/* currFont = FntSetFont(ListFont); */
lineHeight = FntLineHeight();
/* FntSetFont(currFont) */
dataHeight = 0;
recordNum = TopVisibleRecord;
numRows = TblGetNumberOfRows(table);
for (row = 0; row < numRows; row++) {
recordH = DmQueryNextInCategory(myDB, &recordNum, dmAllCategories);
if (recordH && (tableHeight >= dataHeight + lineHeight)) {
TblSetRowID(table, row, recordNum);
TblSetItemStyle(table, row, 0, customTableItem);
/* TblSetItemFont(table, row, 0, ListFont); */
TblSetRowHeight(table, row, lineHeight);
DmRecordInfo(myDB, recordNum, NULL, &uniqueID, NULL);
if ((TblGetRowData(table, row) != uniqueID) || ( ! TblRowUsable(table, row))) {
TblSetRowUsable(table, row, true);
TblSetRowData(table, row, uniqueID);
TblMarkRowInvalid(table, row);
}
lastRecordNum = recordNum;
if (row+1 < numRows)
recordNum++;
dataHeight += lineHeight;
} else
TblSetRowUsable(table, row, false);
}
ViewLogUpdateScrollers(frm, lastRecordNum);
}
static void ViewLogScroll(Short linesToScroll)
{
Int i;
Word rows;
Word lastRow;
Word scrollAmount;
UInt newTopVisibleRecord;
TablePtr table;
RectangleType scrollR;
RectangleType vacated;
DirectionType direction;
table = GetObjectPtr(tLog);
CurrentRecord = noRecordSelected;
newTopVisibleRecord = TopVisibleRecord;
if (linesToScroll > 0)
SeekRecord(&newTopVisibleRecord, linesToScroll, dmSeekForward);
else if (linesToScroll < 0)
SeekRecord(&newTopVisibleRecord, -linesToScroll, dmSeekBackward);
ErrFatalDisplayIf(TopVisibleRecord == newTopVisibleRecord, "Invalid scroll value");
TopVisibleRecord = newTopVisibleRecord;
rows = ViewLogNumberOfRows(table);
if (((linesToScroll > 0) && (linesToScroll < rows)) ||
((linesToScroll < 0) && (-linesToScroll < rows))) {
scrollAmount = 0;
if (linesToScroll > 0) {
lastRow = TblGetLastUsableRow(table) - 1;
for (i = 0; i < linesToScroll; i++) {
scrollAmount += TblGetRowHeight(table, lastRow);
TblRemoveRow(table, 0);
}
direction = up;
} else {
for (i = 0; i < -linesToScroll; i++) {
scrollAmount += TblGetRowHeight(table, 0);
TblInsertRow(table, 0);
}
direction = down;
}
TblGetBounds(table, &scrollR);
WinScrollRectangle(&scrollR, direction, scrollAmount, &vacated);
WinEraseRectangle(&vacated, 0);
}
ViewLogLoadTable(FrmGetActiveForm());
TblRedrawTable(table);
}
static void DrawRecordData(CharPtr data, short x,short y, short width)
{
#if 0
Int titleLen;
Word charsToDraw;
short titleWidth;
CharPtr ptr;
Boolean stringFit;
ptr = StrChr(data, linefeedChr);
if (ptr)
charsToDraw = (Word) (ptr - data);
else
charsToDraw = StrLen(data);
titleWidth = width;
titleLen = charsToDraw;
FntCharsInWidth(data, &titleWidth, &titleLen, &stringFit);
if (stringFit)
WinDrawChars(data, titleLen, x, y);
else {
width -= FntCharWidth('.') * 3;
while (titleWidth > width ||
data[titleLen - 1] == ' ' ||
data[titleLen - 1] == tabChr)
titleWidth -= FntCharWidth(data[--titleLen]);
WinDrawChars(data, titleLen, x, y);
x += titleWidth;
WinDrawChars("...", 3, x, y);
}
#else
Char line[34];
recT tmpRecord;
DateTimeType dt;
MemMove(&tmpRecord, data, sizeof(tmpRecord));
TimSecondsToDateTime(tmpRecord.when, &dt);
DateToAscii(dt.month, dt.day, dt.year, dfDMYWithDots, line);
StrCat(line, " ");
TimeToAscii(dt.hour, dt.minute, tfColon24h, (line + StrLen(line)));
StrCat(line, ":");
StrIToA((line + StrLen(line)), dt.second);
if (dt.second < 10)
StrCat(line, "0");
StrCat(line, " ");
StrNCopy((line + StrLen(line)), tmpRecord.display, 14);
WinDrawChars(line, StrLen(line), x, y);
#endif
}
static void ViewLogDrawRecord(VoidPtr table, Word row, Word column, RectanglePtr bounds)
{
Word len;
Word recordNum;
VoidHand recordH;
short x,y;
CharPtr recordP;
Word pos;
char posStr[6];
recordNum = TblGetRowID(table, row);
recordH = DmQueryRecord(myDB, recordNum); /* read only */
recordP = MemHandleLock(recordH);
x = bounds->topLeft.x + 1;
y = bounds->topLeft.y;
/* FntSetFont(ListFont); */
pos = DmPositionInCategory(myDB, recordNum, dmAllCategories);
StrIToA(posStr, pos);
len = StrLen(posStr);
posStr[len++] = '.';
posStr[len] = '\0';
if (len < 3)
x += FntCharWidth('1');
WinDrawChars(posStr, len, x, y);
x += FntCharsWidth(posStr, len) + 4;
DrawRecordData(recordP, x, y, bounds->extent.x - x);
MemHandleUnlock(recordH);
}
static void ViewLogInit(FormPtr frm)
{
TablePtr table;
Word recordNum;
Word rowsInTable;
table = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, tLog));
rowsInTable = ViewLogNumberOfRows(table);
if (CurrentRecord != noRecordSelected) {
if (TopVisibleRecord > CurrentRecord)
TopVisibleRecord = CurrentRecord;
else {
recordNum = TopVisibleRecord;
DmSeekRecordInCategory(myDB, &recordNum, rowsInTable-1, dmSeekForward, dmAllCategories);
if (recordNum < CurrentRecord)
TopVisibleRecord = CurrentRecord;
}
}
if (/* numRecords */ nextRec) {
recordNum = dmMaxRecordIndex;
DmSeekRecordInCategory(myDB, &recordNum, rowsInTable-1, dmSeekBackward, dmAllCategories);
TopVisibleRecord = min(TopVisibleRecord, recordNum);
if (!TopVisibleRecord)
TopVisibleRecord++;
} else
TopVisibleRecord = 1;
ViewLogLoadTable(frm);
TblSetCustomDrawProcedure(table, 0, ViewLogDrawRecord);
TblSetColumnUsable(table, 0, true);
}
#else
static void ViewLogInit(FormPtr frm)
{
TablePtr table;
Word rowsInTable;
Word row;
Word rows;
Word visibleRows;
RectangleType r;
Word tableHeight;
VoidHand RecHandle;
Ptr RecPointer;
VoidPtr recPtr;
recT tmpRecord;
DateTimeType dt;
table = GetObjectPtr(tLog);
rowsInTable = TblGetNumberOfRows(table);
for (row = 0; row < rowsInTable; row++) {
TblSetItemStyle(table, row, 0, labelTableItem);
TblSetItemStyle(table, row, 1, labelTableItem);
TblSetRowUsable(table, row, false);
}
TblSetColumnUsable(table, 0, true);
TblSetColumnUsable(table, 1, true);
/* TblSetColumnSpacing(table, 0, 20); */
/* TblSetCustomDrawProcedure(table, column, function); */
TblGetBounds(table, &r);
tableHeight = r.extent.y;
rows = tableHeight / FntLineHeight();
if (rows <= rowsInTable)
visibleRows = rows;
else
visibleRows = rowsInTable;
#if 0
if (DmNumRecords(myDB)-1 < visibleRows)
visibleRows = DmNumRecords(myDB)-1;
#else
if (nextRec - 1 < visibleRows)
visibleRows = nextRec - 1;
#endif
for (row = 0; row < visibleRows; row++) {
TblSetRowUsable(table, row, true);
TblMarkRowInvalid(table, row);
/* TblSetRowID(table, row, ID); */
/* TblSetItemInt(table, row, 0, -1); */
RecHandle = DmQueryRecord(myDB, row+1);
RecPointer = MemHandleLock(RecHandle);
MemMove(&tmpRecord, RecPointer, sizeof(tmpRecord));
MemPtrUnlock(RecPointer);
DmReleaseRecord(myDB, row+1, false);
recPtr = MemPtrNew(14);
StrNCopy(recPtr, tmpRecord.display, 14);
TblSetItemPtr(table, row, 1, recPtr);
recPtr = MemPtrNew(20);
TimSecondsToDateTime(tmpRecord.when, &dt);
DateToAscii(dt.month, dt.day, dt.year, dfDMYWithDots, recPtr);
StrCat(recPtr, " ");
TimeToAscii(dt.hour, dt.minute, tfColon24h, (recPtr + StrLen(recPtr)));
StrCat(recPtr, ":");
StrIToA((recPtr + StrLen(recPtr)), dt.second);
if (dt.second < 10)
StrCat(recPtr, "0");
TblSetItemPtr(table, row, 0, recPtr);
}
TblHasScrollBar(table, true);
SclSetScrollBar(GetObjectPtr(sLog), 1, 1, nextRec, 1);
}
#endif
static Boolean ViewLogFormHandleEvent(EventPtr e)
{
Boolean handled = false;
const FormPtr frm = FrmGetActiveForm();
CALLBACK_PROLOGUE
switch (e->eType) {
case frmOpenEvent:
ViewLogInit(frm);
FrmDrawForm(frm);
break;
case menuEvent:
MenuEraseStatus(NULL);
switch (e->data.menu.itemID) {
}
handled = true;
break;
case ctlSelectEvent:
switch (e->data.ctlSelect.controlID) {
case bOK: {
FrmReturnToForm(MainForm);
handled = true;
break;
}
}
break;
case sclRepeatEvent:
ViewLogScroll(e->data.sclRepeat.newValue - e->data.sclRepeat.value);
break;
case tblEnterEvent:
/* DisplayDetails(e); */
break;
case tblSelectEvent:
#if 0
CurrentRecord = TblGetRowID(e->data.tblSelect.pTable, e->data.tblSelect.row);
EditScrollPosition = 0;
FrmGotoForm(EditForm);
handled = true;
#endif
break;
default:
break;
}
CALLBACK_EPILOGUE
return handled;
}
static Boolean ApplicationHandleEvent(EventPtr e)
{
FormPtr frm;
Word formId;
Boolean handled = false;
if (e->eType == frmLoadEvent) {
formId = e->data.frmLoad.formID;
frm = FrmInitForm(formId);
FrmSetActiveForm(frm);
switch(formId) {
case MainForm:
FrmSetEventHandler(frm, MainFormHandleEvent);
break;
case enterValueForm:
FrmSetEventHandler(frm, enterValueFormHandleEvent);
break;
case ViewLogForm:
FrmSetEventHandler(frm, ViewLogFormHandleEvent);
break;
}
handled = true;
}
return handled;
}
Int OpenDatabase(void)
{
UInt index = 0;
VoidHand RecHandle;
Ptr RecPointer;
#if 0
LocalID dbID;
UInt cardNo;
#endif
myDB = DmOpenDatabaseByTypeCreator(DBTYPE, APPID, dmModeReadWrite);
if (!myDB) { /* doen't exist -> create it */
if (DmCreateDatabase(0, dbName, APPID, DBTYPE, false))
return 1;
myDB = DmOpenDatabaseByTypeCreator(DBTYPE, APPID, dmModeReadWrite);
ErrFatalDisplayIf(!myDB, "Couldn't create db.");
RecHandle = DmNewRecord(myDB, &index, sizeof(rec0val));
RecPointer = MemHandleLock(RecHandle);
DmWrite(RecPointer, 0, &rec0val, sizeof(rec0val));
MemPtrUnlock(RecPointer);
DmReleaseRecord(myDB, index, true);
}
#if 0
DmOpenDatabaseInfo(myDB, &dbID, NULL, NULL, &cardNo, NULL);
#endif
nextRec = DmNumRecords(myDB);
/* load initial values */
RecHandle = DmQueryRecord(myDB, index); /* read only */
RecPointer = MemHandleLock(RecHandle);
MemMove(&rec0val, RecPointer, sizeof(rec0val));
MemPtrUnlock(RecPointer);
DmReleaseRecord(myDB, index, false);
return 0;
}
void CloseDatabase(void)
{
UInt index = 0;
VoidHand RecHandle;
Ptr RecPointer;
/* save initial values */
RecHandle = DmGetRecord(myDB, index); /* read write */
RecPointer = MemHandleLock(RecHandle);
DmWrite(RecPointer, 0, &rec0val, sizeof(rec0val));
MemPtrUnlock(RecPointer);
DmReleaseRecord(myDB, index, true);
DmCloseDatabase(myDB);
}
/* Get preferences, open (or create) app database */
static Word StartApplication(void)
{
Int retval;
retval = OpenDatabase();
if (retval)
return retval;
FrmGotoForm(MainForm);
return 0;
}
/* Save preferences, close forms, close app database */
static void StopApplication(void)
{
if (running)
SerClose(refNum);
CloseDatabase();
FrmSaveAllForms();
FrmCloseAllForms();
}
static long GetWaitTime(void)
{
if (!running)
return evtWaitForever;
else
return rec0val.time * sysTicksPerSecond;
}
/* The main event loop */
static void EventLoop(void)
{
Word err;
EventType e;
do {
EvtGetEvent(&e, GetWaitTime());
if (! SysHandleEvent (&e))
if (running || (! MenuHandleEvent (NULL, &e, &err)))
if (! ApplicationHandleEvent (&e))
FrmDispatchEvent (&e);
} while (e.eType != appStopEvent);
}
/* Main entry point; it is unlikely you will need to change this except to
handle other launch command codes */
DWord PilotMain(Word cmd, Ptr cmdPBP, Word launchFlags)
{
Word err;
if (cmd == sysAppLaunchCmdNormalLaunch) {
err = StartApplication();
if (err) return err;
EventLoop();
StopApplication();
} else {
return sysErrParamErr;
}
return 0;
}