/* * Name: Document Store Task * Create: Mon Dec 29 15:29:01 1997 by ishiyama * Synopsis: * #include "scn_task.h" * void DocStorTask(void); * Description: * 原稿蓄積タスク * コピーの場合は,1スタックで原稿読取り幅を変えない仕様 * 送信の場合は、ページごとに変える * Return Value: * void * Change Log: */ void DocStoreTask(void) { MESSAGE_t StoreTaskMsg; /* 送信メッセージ用エリア */ MESSAGE_t *RcvMessage; /* 受信メッセージ用エリア */ BOOL PageLoop; /* 1Page 読取り処理継続 TRUE:継続,FALSE:中断 */ tskno_SCN_WatchDocFeedTask = 0xffff; tskno_SCN_ScanPage = 0xffff; tskno_SCN_StorePage = 0xffff; tskno_SCN_DocOutTask = 0xffff; tskno_SCN_DummyTask = 0xffff; /* エンコードタスクからのイベント待ちのタスク、リスケジューラを走らせるため 1999/03/16 by T.Soneoka */ SYS_MachineStatus[SYS_STOP_SWITCH_STATUS] &= ~(SYS_STOP_DOC_STORE); /** 原稿蓄積の停止要求をクリア */ SYS_DualRestrictionStatus &= ~0x04; /* 原稿蓄積中断中解除 1999/01/21 by T.Soneoka */ SYS_StorePause = TRUE; /* 表示用 1999/1/14 by T.Soneoka */ ScannerMode = SCANNER_DOC_SCAN_MODE; OpenScanner(); /* 読取りのための初期設定 */ ExecutePushStamp = FALSE; #if (PRO_STAMP == ENABLE) SetStampExec(); #endif IniMemWriteParameter(); /* 画像メモリのオープンパラメータをセットします */ PageLoop = QueryDs1On(); if (!PageLoop) { /* 先頭ページの読取り開始時に原稿が抜かれていた場合は繰込み不良で終了する */ StoreTaskMsg.Message = MSG_DOCSTORE_FEED_ERROR; } while (PageLoop) { /* Page Loop */ /* ** 受信中、原稿蓄積中をデュアル制限のため排他制御します added by H.Hirao 1998/12/26 */ while (1) { CMN_DisableInterrupt(); if (SYS_MachineStatus[SYS_COVER_STATUS] & SYS_COVER_SCANNER_OPEN) { CMN_EnableInterrupt(); StoreTaskMsg.Item = FROM_DOCSTORE; #if (0) ** /* D86-016 メインへ送るメッセージ間違いBy O.Kimoto 1999/02/08 */ ** StoreTaskMsg.Message = MSG_SCN_DOCSTORE_TOP_COVER_OPEN; #else StoreTaskMsg.Message = MSG_SCN_DOCSTORE_DOC_ERROR; #endif snd_msg(mbxno.MAN_Task, &StoreTaskMsg); rcv_msg(mbxno.SCN_Task, &SCN_Msg); wai_tsk(0xffff); } if (SYS_DocumentStoreStopSwitch()) { CMN_EnableInterrupt(); StoreTaskMsg.Item = FROM_DOCSTORE; StoreTaskMsg.Message = MSG_SCN_DOCSTORE_STOPSW_ON; /* ** スキャンクローズで原稿排出中は回線引きっぱなしになる不具合 ** 1999/02/01 by T.Soneoka */ #if (0) ** /* 原稿排出処理 */ ** if (SCN_Close((UBYTE)0) != SCN_DOC_EXIT_OK) { ** StoreTaskMsg.Message = MSG_SCN_DOCSTORE_DOC_ERROR; ** } #else /* 原稿排出処理 */ if (SCN_Close((UBYTE)FROM_DOCSTORE) != SCN_DOC_EXIT_OK) { StoreTaskMsg.Message = MSG_SCN_DOCSTORE_DOC_ERROR; } #endif snd_msg(mbxno.MAN_Task, &StoreTaskMsg); rcv_msg(mbxno.SCN_Task, &SCN_Msg); wai_tsk(0xffff); } /* if (((SYS_DualRestrictionStatus & 0x01) == 0x01) || (SYS_MachineStatus[SYS_RESOURCE_STATUS] & SYS_PRE_LINE_BUSY)) { @* 受信中 */ #if (PRO_CLASS1 == ENABLE) && (PRO_RS_INTERNAL == ENABLE) /* by H.Hirao 1999/03/03 */ /* CL1_RestrictionStatusResetTimer added by H.Hirao 1999/05/12 */ if (((SYS_DualRestrictionStatus & 0x01) == 0x01) || (CL1_DualRestrictionStatus & CL1_CLASS1_IN_USE) || SYS_CalledRequestForDocStore || (SYS_CL1_Status & (CL1_CALLED | CL1_FNET_CALLED | CL1_DIALIN_CALLED | CL1_RECEIVE | CL1_SEND | CL1_LOCALSCAN | CL1_LOCALPRINT | CL1_AUTOINIT)) || CL1_RestrictionStatusResetTimer) { #else if (((SYS_DualRestrictionStatus & 0x01) == 0x01) || SYS_CalledRequestForDocStore) { /* 受信中 または 原稿蓄積中にCI検出 changed by H.hirao 1998/12/28 */ #endif #if (PRO_CLASS1 == ENABLE) && (PRO_RS_INTERNAL == ENABLE) /* ローカルスキャン原稿は、待ちあわせしない by H.Hirao 1999/05/12 */ if (SCN_StoreData.Item == SYS_MEM_CLASS1_TX_FILE) { CL1_DualRestrictionStatus |= CL1_SCANNER_IN_USE; CMN_EnableInterrupt(); break; } #endif /* ** DUAL制限変更のため ** 強制メモリ受信以外のときは、スキャナを停止処理をいれます ** 1999/02/18 by T.Soneoka */ #if (0) ** SYS_DualRestrictionStatus |= 0x04; /* 原稿蓄積中断中セット 1999/01/21 by T.Soneoka */ #else if ((CHK_UNI_V17ReceiveType() != V17_MRX_TO_MRX) || (CHK_UNI_V34ReceiveType() != V34_MRX_TO_MRX)) { SYS_DualRestrictionStatus |= 0x04; /* 原稿蓄積中断中セット 1999/01/21 by T.Soneoka */ } #endif CMN_EnableInterrupt(); wai_tsk(100); } else { /* ** DUAL制限変更のため ** 強制メモリ受信以外のときは、スキャナを停止処理をいれます ** 1999/02/18 by T.Soneoka */ #if (0) ** SYS_DualRestrictionStatus |= 0x02; /* 原稿蓄積中セット */ #else if ((CHK_UNI_V17ReceiveType() != V17_MRX_TO_MRX) || (CHK_UNI_V34ReceiveType() != V34_MRX_TO_MRX)) { SYS_DualRestrictionStatus |= 0x02; /* 原稿蓄積中セット */ } #endif #if (PRO_CLASS1 == ENABLE) && (PRO_RS_INTERNAL == ENABLE) CL1_DualRestrictionStatus |= CL1_SCANNER_IN_USE; /* スキャン中セット added by H.Hirao 1999/03/04 */ #endif CMN_EnableInterrupt(); break; } } SYS_DualRestrictionStatus &= ~0x04; /* 原稿蓄積中断中解除 1999/01/21 by T.Soneoka */ PageLoop = FALSE; /* default 設定 */ #if (PRO_STAMP == ENABLE) EnablePushStampEvent = TRUE; /* 済みスタンプ押下イベント許可フラグ初期化 */ #endif /* * コピーの読み取りではADFの1スタックで原稿サイズを変えないため、 * コピーの場合は先頭ページの場合だけ、読取り原稿サイズをセットする * その他の場合は、毎ページ読取り原稿サイズをセットする */ if (SYS_DocumentStoreItem == SYS_MEM_MULTI_COPY_FILE) { if (SYS_DocumentStorePage == 1) { SYS_DocumentScanSize = CMN_GetDocumentScanSize(); } } else { SYS_DocumentScanSize = CMN_GetDocumentScanSize(); } SetScanPageAttribute(CurrentPage); /* 現在の Document の属性を設定 */ SCN_StoreData.Code = CurrentPage->Code; SCN_StoreData.Mode = CurrentPage->Mode; /* ** メモリコピー、B4−>A4蓄積処理追加 ** 1999/02/17 by T.Soneoka */ if ((!CHK_UNI_ReductionPrint()) && (SYS_DocumentStoreItem == SYS_MEM_MULTI_COPY_FILE)) { if (SYS_DocumentStorePage == 1) { if (QueryReduction() == REDUCTION_B4_A4) { SCN_StoreData.Size = SYS_DOCUMENT_A4_SIZE; } else { SCN_StoreData.Size = CurrentPage->Size; } } #if (PRO_CLASS1 == ENABLE) /* by H.Hirao 1999/03/23 */ } else if (QueryClass1Tx()) { if (QueryReduction() == REDUCTION_B4_A4) { SCN_StoreData.Size = SYS_DOCUMENT_A4_SIZE; } else { SCN_StoreData.Size = CurrentPage->Size; } #endif } else { SCN_StoreData.Size = CurrentPage->Size; } SleepDocStoreSubTask = FALSE; /* Sub Task を Sleep 状態にするフラグ */ cre_tsk(&tskno_SCN_WatchDocFeedTask, TSK_SCN_WATCHDOCUMENTFEEDTASK, &mbxno.SCN_Task); /* フィーダーエラー監視タスク起動 */ cre_tsk(&tskno_SCN_ScanPage, TSK_SCN_SCANPAGE, 0); /* 原稿読取りタスク起動 */ InzStorePageResource(); /* Task が途中で Delete されることを考慮 */ cre_tsk(&tskno_SCN_StorePage, TSK_SCN_STOREPAGE, 0);/* 原稿1ページ蓄積タスク起動 */ /* エンコードタスクからのイベント待ちをするタスク、リスケジューラを走らせるため 1999/03/16 by T.Soneoka */ cre_tsk(&tskno_SCN_DummyTask, TSK_SCN_DUMMYTASK, 0);/* 原稿1ページ蓄積タスク起動 */ SCN_Open(); /* 読取り開始 */ rcv_msg(mbxno.SCN_Task, &RcvMessage); /* 蓄積関連タスクの状況をメッセージで待ち受け */ CloseScanPage(); /* 読取り終了 */ if (tskno_SCN_StorePage != 0xffff) { del_tsk(&tskno_SCN_StorePage); /* 原稿1ページ蓄積タスク終了 */ } if (tskno_SCN_ScanPage != 0xffff) { del_tsk(&tskno_SCN_ScanPage); /* 原稿読取りタスク終了 */ } if (tskno_SCN_WatchDocFeedTask != 0xffff) { del_tsk(&tskno_SCN_WatchDocFeedTask); /* フィーダーエラー監視タスク終了 */ } /* エンコードタスクからのイベント待ちをするタスク、リスケジューラを走らせるため 1999/03/16 by T.Soneoka */ if (tskno_SCN_DummyTask != 0xffff) { del_tsk(&tskno_SCN_DummyTask); } CMN_DisableInterrupt(); SYS_DualRestrictionStatus &= ~(0x02); #if (PRO_CLASS1 == ENABLE) && (PRO_RS_INTERNAL == ENABLE) CL1_DualRestrictionStatus &= ~CL1_SCANNER_IN_USE; /* スキャン中リセット added by H.Hirao 1999/03/04 */ #endif CMN_EnableInterrupt(); /* * メッセージの変換と1ページの後処理 */ switch (RcvMessage->Message) { case MSG_DOCSTORE_MEMORY_OVER: /* メモリオーバー from StorePageTask */ StoreTaskMsg.Message = MSG_SCN_DOCSTORE_MEM_OVER; break; case MSG_DOCSTORE_STOPSW_ON: /* 停止要求 from StorePageTask */ StoreTaskMsg.Message = MSG_SCN_DOCSTORE_STOPSW_ON; break; case MSG_DOCSTORE_OK: /* 蓄積正常終了 from StorePageTask */ StoreTaskMsg.Message = MSG_SCN_DOCSTORE_OK; SYB_LifeMonitor.ScanCount++; /** ライフモニタの読取り枚数加算 */ #if (PRO_STAMP == ENABLE) PushStamp(); /* 済みスタンプ処理 and モータ再スタート処理 */ #endif if (QueryDs1On() /* DS1がOnで */ && (QueryDocPosition() != DOC_POS_NO_DOCUMENT)) { /* 次ページが登録されていれば */ /* 枚数指定されていて、且つ指定枚数以上の原稿がADF上にある場合の処理が抜けていた by O.Kimoto 1998/12/17 */ if (!CheckExceedDocPageNum()) { PageLoop = TRUE; /* 次ページ処理継続 */ IncPage(); /* ** 割り込みの中で次原稿の登録をここでやるように修正します ** 割り込みの中で次原稿登録(CurrentPageとNextPageのつけ替え)した場合、 ** 次原稿登録したが、現在の原稿読み取り終了時に、次原稿読み取りしない場合(原稿枚数指定)、 ** SCN_Close()で排出処理をコールすると、次原稿まで排出されてしまう為 ** ここでしたほうがすっきりする ** 1999/02/10 by T.Soneoka */ if (NextPage != NULL) { DeleteDocObj(&CurrentPage); CurrentPage = NextPage; NextPage = NULL; } else { /* ** 最終原稿蓄積中に次の原稿をセットされると、 ** 次原稿の登録もされていないので読み取りにいってしまう ** 次原稿ある場合は、ここで登録するようにします */ DeleteDocObj(&CurrentPage); /* 上記処理を3回するとCurrentPageが取れなくなる不具合 1999/03/05 by T.Soneoka */ CurrentPage = CreateDocObj(); NextPage = NULL; } } /* 仕様変更 ** 読み取り中において、DS2がOFFした時点でDS1もOFFしていれば、今読んだ原稿が ** 最終原稿であるという風に変更 ** by O.kimoto 1999/03/08 */ else { if (!CheckNeedDocPageNum()) { StoreTaskMsg.Message = MSG_SCN_DOCSTORE_STR_PAGE_ERROR; } } } else { if (!CheckNeedDocPageNum()) { StoreTaskMsg.Message = MSG_SCN_DOCSTORE_STR_PAGE_ERROR; } } WaitDocChanged(); /* 原稿が切り替わるまで待ち合わせします */ break; case MSG_DOCSTORE_MAXLINE_OVER: /* 1m原稿長制限 from WatchDocFeedTask */ StoreTaskMsg.Message = MSG_SCN_DOCSTORE_MAXLINE_OVER; MEM_ClearBreak(&SCN_IndexData); /* 蓄積途中のファイルをクリア 1999/02/25 by T.Soneoka */ break; case MSG_DOCSTORE_COVER_OPEN: /* カバーオープン from WatchDocFeedTask */ #if (0) ** /* 蓄積中にスキャナーカバーがあいた場合は、JAMリカバーオペレーションを起動させるために ** ** メインへは、「MSG_SCN_DOCSTORE_DOC_ERROR」を通知しなければならない。 ** ** by O.Kimoto 1999/03/08 ** */ ** StoreTaskMsg.Message = MSG_SCN_DOCSTORE_TOP_COVER_OPEN; #else StoreTaskMsg.Message = MSG_SCN_DOCSTORE_DOC_ERROR; #endif MEM_ClearBreak(&SCN_IndexData); /* 蓄積途中のファイルをクリア 1999/02/25 by T.Soneoka */ break; case MSG_DOCSTORE_FEED_ERROR: /* 繰込み不良 from WatchDocFeedTask */ StoreTaskMsg.Message = MSG_SCN_DOCSTORE_DOC_ERROR; MEM_ClearBreak(&SCN_IndexData); /* 蓄積途中のファイルをクリア 1999/02/25 by T.Soneoka */ break; default: /* not reached */ break; } } /* Page Loop End */ SYS_StorePause = FALSE; /* 表示用 1999/1/14 by T.Soneoka */ /* ** スキャンクローズで原稿排出中は回線引きっぱなしになる不具合 ** 1999/02/01 by T.Soneoka */ #if (0) ** /* 原稿排出処理 */ ** if (SCN_Close((UBYTE)0) != SCN_DOC_EXIT_OK) { ** StoreTaskMsg.Message = MSG_SCN_DOCSTORE_DOC_ERROR; ** }
VOID _CRTAPI1 main( UINT argc, UCHAR *argv[] ) { UINT API_Errors = 0 ; BOOL Test_Unsupported_Features = FALSE ; // Set default to FALSE DWORD Num_Test_Blocks = 10 ; // Set default to 10 UCHAR sw_cmdline[40] ; UINT i ; if(OpenScanner (0)) exit ; WriteScanner ( SCLReset, sizeof (SCLReset)-1, &Actual, TRUE); fprintf (stdout, "Wrote ESC E to scanner. %ld bytes sent.\n", Actual); WriteScanner ( InqXRes, sizeof (InqXRes)-1, &Actual, TRUE); fprintf (stdout, "Sent InqXres. %ld bytes sent.\n", Actual); ReadScanner ( ScanBuffer, sizeof (ScanBuffer), &Actual, TRUE); fprintf (stdout, "Rec'd InqXRes. %ld bytes Received.\n", Actual); fprintf (stdout, "Current XRes = ESC "); for (i=1; i<Actual; i++) { fprintf (stdout, "%c", ScanBuffer[i]); } fprintf (stdout, ".\n"); WriteScanner ( ScanCmd, sizeof (ScanCmd)-1, &Actual, TRUE); fprintf (stdout, "Wrote scan command to scanner. %ld bytes sent.\n", Actual); i=0; do { ReadScanner ( ScanData, sizeof (ScanData), &Actual, FALSE); if (Actual == sizeof (ScanData)) { i++; fprintf (stdout, "."); } } while (Actual == sizeof (ScanData)); fprintf (stdout, "\n Total Bytes = %ld.\n", (sizeof(ScanData))*i+Actual); } /* main */