From ebec983b9b1ff15d2d8ed8896107deedb8e178e2 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sun, 27 Jan 2013 10:08:24 -0800 Subject: [PATCH] Cleaned up BCS2 code a bit; added scanner settings dialog code. --- src/AppMain.c | 343 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 206 insertions(+), 137 deletions(-) diff --git a/src/AppMain.c b/src/AppMain.c index 4556607..86db242 100644 --- a/src/AppMain.c +++ b/src/AppMain.c @@ -35,6 +35,7 @@ #ifdef SCANLIB_BCS2 #include "BCS2ScannerLib.h" +#include "BCS2 Configuration Header.h" #endif #ifdef SCANLIB_JANAM @@ -87,7 +88,7 @@ ************************************************************/ #ifdef SCANLIB_BCS2 -UInt16 gBcs2RefNum = 0; +UInt16 gBCS2RefNum = sysInvalidRefNum; #endif #ifdef SCANLIB_JANAM @@ -110,7 +111,7 @@ Boolean gBabbo = false; //UInt16 gNumRows = 11; //MemHandle gHandles[11][3]; Int16 firstRecordIndex = -1; -Boolean scanRecordsSelected[12]; +Boolean scanRecordsSelected[12] = {false}; Int16 eventEnteredRow = -1; // 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 void ClearScanRecordSelection(); +static void* GetObjectPtr(UInt16 objectID); +static void UpdateBarcode(Char* scancode); static void FocusBarcode(); #ifdef SCANLIB_SYMBOL static void FetchScanData(); #endif static void ProcessScan(); -static void StoreScanData(); +static void StoreScanRecord(); static Boolean IsChecked(FormPtr form, UInt16 controlID); static void ShowQuantityForm(UInt16 triggerID, Boolean manual); @@ -209,10 +212,13 @@ static void AppendQuantityDigit(UInt16 digit); static void UpdateQuantityDisplay(); static void QuantityFormAccept(); +// Scanner Settings Form +static Boolean ScannerSettingsFormHandleEvent(EventPtr event); + // Scanner-Specific #ifdef SCANLIB_BCS2 -static Boolean OpenBCS2Scanner(); -static void CloseBCS2Scanner(); +static Err OpenBCS2Scanner(); +static Err CloseBCS2Scanner(); #endif @@ -224,15 +230,11 @@ static void CloseBCS2Scanner(); UInt32 PilotMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags) { - Err error = errNone; + Err error = errNone; #ifdef SCANLIB_BCS2 SysNotifyParamType* notifyParams = (SysNotifyParamType*) cmdPBP; - Char * scancode; - FormPtr form; - FieldPtr barcode; - MemHandle barcodeH; - MemPtr barcodeP; + Char* scancode; #endif switch (cmd) { @@ -246,33 +248,12 @@ UInt32 PilotMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags) #ifdef SCANLIB_BCS2 case sysAppLaunchCmdNotify: if (notifyParams->notifyType == BCS2BarCodeReadyNotification) { - - // Get pointer to scanned data. - scancode = (Char*) notifyParams->notifyDetailsP + 1; - - // Verify we got a good read from the scanner. - if (StrCompareAscii(scancode, "NO READ") == 0) { + scancode = (Char*) notifyParams->notifyDetailsP; + if (StrCompare(scancode, "NO READ") == 0) { SndPlaySystemSound(sndWarning); - } else { SndPlaySystemSound(sndConfirmation); - - 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); - + UpdateBarcode(scancode); ProcessScan(); } } @@ -380,7 +361,7 @@ static void AppEventLoop() // 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 // 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; } #endif @@ -427,6 +408,9 @@ static Boolean AppHandleEvent(EventPtr event) case QuantityForm: FrmSetEventHandler(form, QuantityFormHandleEvent); break; + case ScannerSettingsForm: + FrmSetEventHandler(form, ScannerSettingsFormHandleEvent); + break; default: break; } @@ -576,8 +560,8 @@ static Boolean MainFormHandleEvent(EventPtr event) // On Meazura devices, the "center" hardware key is our scan // trigger. But we'll only trigger the scanner if the barcode // field has focus. - if (gBcs2RefNum && (FrmGetFocus(form) == FrmGetObjectIndex(form, MainFormBarcode))) { - BCS2LibTriggerOn(gBcs2RefNum); + if ((gBCS2RefNum != sysInvalidRefNum) && (FrmGetFocus(form) == FrmGetObjectIndex(form, MainFormBarcode))) { + BCS2LibTriggerOn(gBCS2RefNum); } handled = true; #endif @@ -596,11 +580,11 @@ static Boolean MainFormHandleEvent(EventPtr event) /* if (GetCheckedValue(MainFormStopOnUnits)) { */ /* SetFieldFocus(MainFormUnits); */ /* } else { */ - /* StoreScanData(); */ + /* StoreScanRecord(); */ /* } */ /* *\/ */ /* } else if (objId == MainFormUnits) { */ - /* StoreScanData(); */ + /* StoreScanRecord(); */ /* } */ /* // 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 */ /* // trigger. */ /* } else if (event->data.keyDown.chr == MzVCentreKey) { */ - /* if (gBcs2RefNum) { */ + /* if (gBCS2RefNum) { */ /* if (FrmGetFocus(form) == FrmGetObjectIndex(form, MainFormBarcode)) */ - /* BCS2LibTriggerOn(gBcs2RefNum); */ + /* BCS2LibTriggerOn(gBCS2RefNum); */ /* } */ /* /\* */ @@ -679,11 +663,6 @@ static void MainFormInit(FormPtr form) TablePtr table; Int16 cols, col, rows, row; - // Clear row selection state. - for (row = 0; row < 12; row++) { - scanRecordsSelected[row] = false; - } - table = FrmGetObjectPtr(form, FrmGetObjectIndex(form, MainFormScanRecords)); TblHasScrollBar(table, true); @@ -789,6 +768,11 @@ static Boolean MainFormDoCommand(UInt16 command) handled = true; break; + case MainOptionsScannerSettings: + FrmPopupForm(ScannerSettingsForm); + handled = true; + break; + case MainOptionsAboutRattail: form = FrmInitForm(AboutForm); 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 @@ -1192,14 +1149,46 @@ static Boolean IsChecked(FormPtr form, UInt16 controlID) * ************************************************************/ -/* static void *GetObjectPtr(UInt16 objectID) */ -/* { */ -/* FormPtr form; */ - -/* form = FrmGetActiveForm(); */ -/* return FrmGetObjectPtr(form, FrmGetObjectIndex(form, objectID)); */ -/* } */ - +static void* GetObjectPtr(UInt16 objectID) +{ + FormPtr form; + + form = FrmGetActiveForm(); + 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); } else { - StoreScanData(); + StoreScanRecord(); } } /************************************************************ * - * FUNCTION: StoreScanData + * FUNCTION: StoreScanRecord * ************************************************************/ -static void StoreScanData() +static void StoreScanRecord() { FormPtr form; ControlPtr ctrl; @@ -1383,7 +1372,7 @@ static void StoreScanData() FocusBarcode(); } -/* static void StoreScanData() */ +/* static void StoreScanRecord() */ /* { */ /* FormPtr form; */ /* FieldPtr barcode; */ @@ -1536,65 +1525,83 @@ static Boolean OpenBabboScanner() * ************************************************************/ -static Boolean OpenBCS2Scanner() +static Err OpenBCS2Scanner() { Err err; - LocalID dbId; + LocalID dbID; - err = SysLibLoad('libr', 'BcAp', &gBcs2RefNum); - if (err) { - switch (err) { - case sysErrLibNotFound: + // Find the loaded BCS2 library, or attempt to load it. + if (SysLibFind(BCS2LibName, &gBCS2RefNum) != errNone) { + err = SysLibLoad(BCS2LibTypeID, BCS2LibCreatorID, &gBCS2RefNum); + if (err != errNone) { 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; + return err; } - 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; + + // Open the BCS2 library. + err = BCS2LibOpen(gBCS2RefNum); + if (err != 0) { + SysFatalAlert("BCS2 library could not be opened!"); + goto error; } - - dbId = DmFindDatabase(cardNumber, appDbRattail); - if (! dbId) { - SysFatalAlert("Find database failed!"); - SysLibRemove(gBcs2RefNum); - gBcs2RefNum = 0; - return false; + + // Find the Rattail database. + dbID = DmFindDatabase(cardNumber, appDbRattail); + if (dbID == 0) { + err = DmGetLastErr(); + SysFatalAlert("Rattail application database not found!"); + goto error; } - - err = SysNotifyRegister(cardNumber, dbId, - BCS2BarCodeReadyNotification, NULL, - sysNotifyNormalPriority, NULL); + + // Register for barcode ready notification. + err = SysNotifyRegister(cardNumber, dbID, BCS2BarCodeReadyNotification, NULL, sysNotifyNormalPriority, NULL); if (err != errNone) { - SysFatalAlert("Notify registration failed!"); - SysLibRemove(gBcs2RefNum); - gBcs2RefNum = 0; - return false; + SysFatalAlert("Registering for barcode ready notification failed!"); + goto error; } - - return true; + + 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 @@ -1864,11 +1871,11 @@ static void QuantityFormAccept() if (IsChecked(form, MainFormStopOnUnits)) { ShowQuantityForm(MainFormUnits, false); } else { - StoreScanData(); + StoreScanRecord(); } } else if (gQuantityTriggerID == MainFormUnits) { - StoreScanData(); + StoreScanRecord(); } #ifdef SCANLIB_SYMBOLY @@ -1877,3 +1884,65 @@ static void QuantityFormAccept() #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; +}