Esempio n. 1
0
/*
 *	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;
**	}
Esempio n. 2
0
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 */