Cleaned up BCS2 code a bit; added scanner settings dialog code.

This commit is contained in:
Lance Edgar 2013-01-27 10:08:24 -08:00
parent eca34f597a
commit ebec983b9b

View file

@ -35,6 +35,7 @@
#ifdef SCANLIB_BCS2 #ifdef SCANLIB_BCS2
#include "BCS2ScannerLib.h" #include "BCS2ScannerLib.h"
#include "BCS2 Configuration Header.h"
#endif #endif
#ifdef SCANLIB_JANAM #ifdef SCANLIB_JANAM
@ -87,7 +88,7 @@
************************************************************/ ************************************************************/
#ifdef SCANLIB_BCS2 #ifdef SCANLIB_BCS2
UInt16 gBcs2RefNum = 0; UInt16 gBCS2RefNum = sysInvalidRefNum;
#endif #endif
#ifdef SCANLIB_JANAM #ifdef SCANLIB_JANAM
@ -110,7 +111,7 @@ Boolean gBabbo = false;
//UInt16 gNumRows = 11; //UInt16 gNumRows = 11;
//MemHandle gHandles[11][3]; //MemHandle gHandles[11][3];
Int16 firstRecordIndex = -1; Int16 firstRecordIndex = -1;
Boolean scanRecordsSelected[12]; Boolean scanRecordsSelected[12] = {false};
Int16 eventEnteredRow = -1; Int16 eventEnteredRow = -1;
// This handle serves the barcode field. // This handle serves the barcode field.
@ -193,12 +194,14 @@ static Boolean TableHitTest(TablePtr table, Int16 screenX, Int16 screenY);
static Int16 TableRowHitTest(TablePtr table, Int16 screenX, Int16 screenY); static Int16 TableRowHitTest(TablePtr table, Int16 screenX, Int16 screenY);
static void ClearScanRecordSelection(); static void ClearScanRecordSelection();
static void* GetObjectPtr(UInt16 objectID);
static void UpdateBarcode(Char* scancode);
static void FocusBarcode(); static void FocusBarcode();
#ifdef SCANLIB_SYMBOL #ifdef SCANLIB_SYMBOL
static void FetchScanData(); static void FetchScanData();
#endif #endif
static void ProcessScan(); static void ProcessScan();
static void StoreScanData(); static void StoreScanRecord();
static Boolean IsChecked(FormPtr form, UInt16 controlID); static Boolean IsChecked(FormPtr form, UInt16 controlID);
static void ShowQuantityForm(UInt16 triggerID, Boolean manual); static void ShowQuantityForm(UInt16 triggerID, Boolean manual);
@ -209,10 +212,13 @@ static void AppendQuantityDigit(UInt16 digit);
static void UpdateQuantityDisplay(); static void UpdateQuantityDisplay();
static void QuantityFormAccept(); static void QuantityFormAccept();
// Scanner Settings Form
static Boolean ScannerSettingsFormHandleEvent(EventPtr event);
// Scanner-Specific // Scanner-Specific
#ifdef SCANLIB_BCS2 #ifdef SCANLIB_BCS2
static Boolean OpenBCS2Scanner(); static Err OpenBCS2Scanner();
static void CloseBCS2Scanner(); static Err CloseBCS2Scanner();
#endif #endif
@ -229,10 +235,6 @@ UInt32 PilotMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags)
#ifdef SCANLIB_BCS2 #ifdef SCANLIB_BCS2
SysNotifyParamType* notifyParams = (SysNotifyParamType*) cmdPBP; SysNotifyParamType* notifyParams = (SysNotifyParamType*) cmdPBP;
Char* scancode; Char* scancode;
FormPtr form;
FieldPtr barcode;
MemHandle barcodeH;
MemPtr barcodeP;
#endif #endif
switch (cmd) { switch (cmd) {
@ -246,33 +248,12 @@ UInt32 PilotMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags)
#ifdef SCANLIB_BCS2 #ifdef SCANLIB_BCS2
case sysAppLaunchCmdNotify: case sysAppLaunchCmdNotify:
if (notifyParams->notifyType == BCS2BarCodeReadyNotification) { if (notifyParams->notifyType == BCS2BarCodeReadyNotification) {
scancode = (Char*) notifyParams->notifyDetailsP;
// Get pointer to scanned data. if (StrCompare(scancode, "NO READ") == 0) {
scancode = (Char*) notifyParams->notifyDetailsP + 1;
// Verify we got a good read from the scanner.
if (StrCompareAscii(scancode, "NO READ") == 0) {
SndPlaySystemSound(sndWarning); SndPlaySystemSound(sndWarning);
} else { } else {
SndPlaySystemSound(sndConfirmation); SndPlaySystemSound(sndConfirmation);
UpdateBarcode(scancode);
form = FrmGetFormPtr(MainForm);
barcode = FrmGetObjectPtr(form, FrmGetObjectIndex(form, MainFormBarcode));
barcodeH = FldGetTextHandle(barcode);
FldSetTextHandle(barcode, NULL);
if (! barcodeH) {
barcodeH = MemHandleNew(15); // ugh
}
barcodeP = MemHandleLock(barcodeH);
StrCopy((Char*) barcodeP, scancode);
MemHandleUnlock(barcodeH);
FldSetTextHandle(barcode, barcodeH);
FldDrawField(barcode);
ProcessScan(); ProcessScan();
} }
} }
@ -380,7 +361,7 @@ static void AppEventLoop()
// the event bubble up to the application handler instead. This is // the event bubble up to the application handler instead. This is
// possibly very bad form, but as of this writing I'm not sure how else // possibly very bad form, but as of this writing I'm not sure how else
// to accomplish using that button for a trigger. // to accomplish using that button for a trigger.
if (gBcs2RefNum && (event.eType == keyDownEvent) && (event.data.keyDown.chr == MzVCentreKey)) { if ((gBCS2RefNum != sysInvalidRefNum) && (event.eType == keyDownEvent) && (event.data.keyDown.chr == MzVCentreKey)) {
defaultSysHandler = false; defaultSysHandler = false;
} }
#endif #endif
@ -427,6 +408,9 @@ static Boolean AppHandleEvent(EventPtr event)
case QuantityForm: case QuantityForm:
FrmSetEventHandler(form, QuantityFormHandleEvent); FrmSetEventHandler(form, QuantityFormHandleEvent);
break; break;
case ScannerSettingsForm:
FrmSetEventHandler(form, ScannerSettingsFormHandleEvent);
break;
default: default:
break; break;
} }
@ -576,8 +560,8 @@ static Boolean MainFormHandleEvent(EventPtr event)
// On Meazura devices, the "center" hardware key is our scan // On Meazura devices, the "center" hardware key is our scan
// trigger. But we'll only trigger the scanner if the barcode // trigger. But we'll only trigger the scanner if the barcode
// field has focus. // field has focus.
if (gBcs2RefNum && (FrmGetFocus(form) == FrmGetObjectIndex(form, MainFormBarcode))) { if ((gBCS2RefNum != sysInvalidRefNum) && (FrmGetFocus(form) == FrmGetObjectIndex(form, MainFormBarcode))) {
BCS2LibTriggerOn(gBcs2RefNum); BCS2LibTriggerOn(gBCS2RefNum);
} }
handled = true; handled = true;
#endif #endif
@ -596,11 +580,11 @@ static Boolean MainFormHandleEvent(EventPtr event)
/* if (GetCheckedValue(MainFormStopOnUnits)) { */ /* if (GetCheckedValue(MainFormStopOnUnits)) { */
/* SetFieldFocus(MainFormUnits); */ /* SetFieldFocus(MainFormUnits); */
/* } else { */ /* } else { */
/* StoreScanData(); */ /* StoreScanRecord(); */
/* } */ /* } */
/* *\/ */ /* *\/ */
/* } else if (objId == MainFormUnits) { */ /* } else if (objId == MainFormUnits) { */
/* StoreScanData(); */ /* StoreScanRecord(); */
/* } */ /* } */
/* // Until I have more to go on, I'm assuming that if a handheld has */ /* // Until I have more to go on, I'm assuming that if a handheld has */
@ -608,9 +592,9 @@ static Boolean MainFormHandleEvent(EventPtr event)
/* // "center" navigational (hardware) key should be used as the scan */ /* // "center" navigational (hardware) key should be used as the scan */
/* // trigger. */ /* // trigger. */
/* } else if (event->data.keyDown.chr == MzVCentreKey) { */ /* } else if (event->data.keyDown.chr == MzVCentreKey) { */
/* if (gBcs2RefNum) { */ /* if (gBCS2RefNum) { */
/* if (FrmGetFocus(form) == FrmGetObjectIndex(form, MainFormBarcode)) */ /* if (FrmGetFocus(form) == FrmGetObjectIndex(form, MainFormBarcode)) */
/* BCS2LibTriggerOn(gBcs2RefNum); */ /* BCS2LibTriggerOn(gBCS2RefNum); */
/* } */ /* } */
/* /\* */ /* /\* */
@ -679,11 +663,6 @@ static void MainFormInit(FormPtr form)
TablePtr table; TablePtr table;
Int16 cols, col, rows, row; Int16 cols, col, rows, row;
// Clear row selection state.
for (row = 0; row < 12; row++) {
scanRecordsSelected[row] = false;
}
table = FrmGetObjectPtr(form, FrmGetObjectIndex(form, MainFormScanRecords)); table = FrmGetObjectPtr(form, FrmGetObjectIndex(form, MainFormScanRecords));
TblHasScrollBar(table, true); TblHasScrollBar(table, true);
@ -789,6 +768,11 @@ static Boolean MainFormDoCommand(UInt16 command)
handled = true; handled = true;
break; break;
case MainOptionsScannerSettings:
FrmPopupForm(ScannerSettingsForm);
handled = true;
break;
case MainOptionsAboutRattail: case MainOptionsAboutRattail:
form = FrmInitForm(AboutForm); form = FrmInitForm(AboutForm);
FrmDoDialog(form); FrmDoDialog(form);
@ -1112,33 +1096,6 @@ static DmOpenRef OpenScanDatabase()
} }
#ifdef SCANLIB_BCS2
/************************************************************
*
* FUNCTION: CloseBCS2Scanner
*
************************************************************/
static void CloseBCS2Scanner()
{
LocalID dbId;
if (! gBcs2RefNum) {
return;
}
dbId = DmFindDatabase(cardNumber, appDbRattail);
if (dbId) {
SysNotifyUnregister(cardNumber, dbId, BCS2BarCodeReadyNotification,
sysNotifyNormalPriority);
}
BCS2LibClose(gBcs2RefNum);
SysLibRemove(gBcs2RefNum);
gBcs2RefNum = 0;
}
#endif
/************************************************************ /************************************************************
* *
* FUNCTION: CreateScanDatabase * FUNCTION: CreateScanDatabase
@ -1192,13 +1149,45 @@ static Boolean IsChecked(FormPtr form, UInt16 controlID)
* *
************************************************************/ ************************************************************/
/* static void *GetObjectPtr(UInt16 objectID) */ static void* GetObjectPtr(UInt16 objectID)
/* { */ {
/* FormPtr form; */ FormPtr form;
/* form = FrmGetActiveForm(); */ form = FrmGetActiveForm();
/* return FrmGetObjectPtr(form, FrmGetObjectIndex(form, objectID)); */ return FrmGetObjectPtr(form, FrmGetObjectIndex(form, objectID));
/* } */ }
/************************************************************
*
* FUNCTION: UpdateBarcode
*
************************************************************/
static void UpdateBarcode(Char* scancode)
{
UInt16 size;
FieldPtr barcode;
MemHandle barcodeH;
MemPtr barcodeP;
size = StrLen(scancode) + 1;
barcode = GetObjectPtr(MainFormBarcode);
barcodeH = FldGetTextHandle(barcode);
if (barcodeH == NULL) {
barcodeH = MemHandleNew(size);
} else if (MemHandleSize(barcodeH) < size) {
MemHandleResize(barcodeH, size);
}
barcodeP = MemHandleLock(barcodeH);
MemMove(barcodeP, scancode, size);
MemHandleUnlock(barcodeH);
FldSetTextHandle(barcode, barcodeH);
FldDrawField(barcode);
}
/************************************************************ /************************************************************
@ -1333,18 +1322,18 @@ static void ProcessScan()
ShowQuantityForm(MainFormUnits, false); ShowQuantityForm(MainFormUnits, false);
} else { } else {
StoreScanData(); StoreScanRecord();
} }
} }
/************************************************************ /************************************************************
* *
* FUNCTION: StoreScanData * FUNCTION: StoreScanRecord
* *
************************************************************/ ************************************************************/
static void StoreScanData() static void StoreScanRecord()
{ {
FormPtr form; FormPtr form;
ControlPtr ctrl; ControlPtr ctrl;
@ -1383,7 +1372,7 @@ static void StoreScanData()
FocusBarcode(); FocusBarcode();
} }
/* static void StoreScanData() */ /* static void StoreScanRecord() */
/* { */ /* { */
/* FormPtr form; */ /* FormPtr form; */
/* FieldPtr barcode; */ /* FieldPtr barcode; */
@ -1536,65 +1525,83 @@ static Boolean OpenBabboScanner()
* *
************************************************************/ ************************************************************/
static Boolean OpenBCS2Scanner() static Err OpenBCS2Scanner()
{ {
Err err; Err err;
LocalID dbId; LocalID dbID;
err = SysLibLoad('libr', 'BcAp', &gBcs2RefNum); // Find the loaded BCS2 library, or attempt to load it.
if (err) { if (SysLibFind(BCS2LibName, &gBCS2RefNum) != errNone) {
switch (err) { err = SysLibLoad(BCS2LibTypeID, BCS2LibCreatorID, &gBCS2RefNum);
case sysErrLibNotFound:
SysFatalAlert("BCS2 library not found!");
break;
case sysErrNoFreeRAM:
SysFatalAlert("Out of memory (RAM)!");
break;
case sysErrNoFreeLibSlots:
SysFatalAlert("No free library slots!");
break;
default:
SysFatalAlert("BCS2 library load failed!");
break;
}
gBcs2RefNum = 0;
return false;
}
err = BCS2LibOpen(gBcs2RefNum);
if (err) {
switch (err) {
case errBCS2MemoryError:
SysFatalAlert("BCS2 threw memory error");
break;
default:
SysFatalAlert("BCS2 library open failed!");
break;
}
SysLibRemove(gBcs2RefNum);
gBcs2RefNum = 0;
return false;
}
dbId = DmFindDatabase(cardNumber, appDbRattail);
if (! dbId) {
SysFatalAlert("Find database failed!");
SysLibRemove(gBcs2RefNum);
gBcs2RefNum = 0;
return false;
}
err = SysNotifyRegister(cardNumber, dbId,
BCS2BarCodeReadyNotification, NULL,
sysNotifyNormalPriority, NULL);
if (err != errNone) { if (err != errNone) {
SysFatalAlert("Notify registration failed!"); SysFatalAlert("BCS2 library not found!");
SysLibRemove(gBcs2RefNum); return err;
gBcs2RefNum = 0; }
return false;
} }
return true; // Open the BCS2 library.
err = BCS2LibOpen(gBCS2RefNum);
if (err != 0) {
SysFatalAlert("BCS2 library could not be opened!");
goto error;
}
// Find the Rattail database.
dbID = DmFindDatabase(cardNumber, appDbRattail);
if (dbID == 0) {
err = DmGetLastErr();
SysFatalAlert("Rattail application database not found!");
goto error;
}
// Register for barcode ready notification.
err = SysNotifyRegister(cardNumber, dbID, BCS2BarCodeReadyNotification, NULL, sysNotifyNormalPriority, NULL);
if (err != errNone) {
SysFatalAlert("Registering for barcode ready notification failed!");
goto error;
}
return errNone;
error:
if (dbID != 0) {
SysNotifyUnregister(cardNumber, dbID, BCS2BarCodeReadyNotification, sysNotifyNormalPriority);
}
if (gBCS2RefNum != sysInvalidRefNum) {
SysLibRemove(gBCS2RefNum);
gBCS2RefNum = sysInvalidRefNum;
}
return err;
}
/************************************************************
*
* FUNCTION: CloseBCS2Scanner
*
************************************************************/
static Err CloseBCS2Scanner()
{
Err err = errNone;
LocalID dbID;
dbID = DmFindDatabase(cardNumber, appDbRattail);
if (dbID != 0) {
SysNotifyUnregister(cardNumber, dbID, BCS2BarCodeReadyNotification, sysNotifyNormalPriority);
}
if (gBCS2RefNum != sysInvalidRefNum) {
err = BCS2LibClose(gBCS2RefNum);
if (err == errNone) {
err = SysLibRemove(gBCS2RefNum);
if (err == errNone) {
gBCS2RefNum = sysInvalidRefNum;
}
}
}
return err;
} }
#endif #endif
@ -1864,11 +1871,11 @@ static void QuantityFormAccept()
if (IsChecked(form, MainFormStopOnUnits)) { if (IsChecked(form, MainFormStopOnUnits)) {
ShowQuantityForm(MainFormUnits, false); ShowQuantityForm(MainFormUnits, false);
} else { } else {
StoreScanData(); StoreScanRecord();
} }
} else if (gQuantityTriggerID == MainFormUnits) { } else if (gQuantityTriggerID == MainFormUnits) {
StoreScanData(); StoreScanRecord();
} }
#ifdef SCANLIB_SYMBOLY #ifdef SCANLIB_SYMBOLY
@ -1877,3 +1884,65 @@ static void QuantityFormAccept()
#endif #endif
} }
} }
/************************************************************
*
* FUNCTION: ScannerSettingsFormHandleEvent
*
************************************************************/
static Boolean ScannerSettingsFormHandleEvent(EventPtr event)
{
Boolean handled = false;
FormPtr form;
Char settings[7] = {0};
switch (event->eType) {
case frmOpenEvent:
form = FrmGetActiveForm();
FrmDrawForm(form);
handled = true;
break;
case ctlSelectEvent:
switch (event->data.ctlSelect.controlID) {
case ScannerSettingsResetScanner:
BCS2LibReset(gBCS2RefNum);
handled = true;
break;
case ScannerSettingsSetFactoryDefaults:
BCS2LibSetToFactoryDefaults(gBCS2RefNum);
handled = true;
break;
case ScannerSettingsPushRattailSettings:
/* BCS2LibChangeSettings(gBCS2RefNum, BCS2ManualTrigger, 3); */
/* BCS2LibChangeSettings(gBCS2RefNum, BSC2EnableNOREAD, 3); */
/* BCS2LibChangeSettings(gBCS2RefNum, "R40R34", 6); */
StrCopy(settings, BCS2ManualTrigger);
StrCat(settings, BSC2EnableNOREAD);
BCS2LibChangeSettings(gBCS2RefNum, settings, StrLen(settings));
handled = true;
break;
case ScannerSettingsDone:
FrmReturnToForm(MainForm);
handled = true;
break;
default:
break;
}
break;
default:
break;
}
return handled;
}