Example #1
0
/* UBYTE SCD_DirectTx;*/
UBYTE SCD_DebugSwitch = 0;/*By Y.Suzuki 1998/01/20*/
void SCDC_MTxCodeConvertTask(void)
/* void SCDC_G3_MemTx(void) */
{
#if (PRO_COM_CODEC_TYPE == SOFTWARE)
	struct CdcBlk_t encdata,*Sedp;
	struct CdcBlk_t decdata,*Sddp;
	UBYTE	reduce_f;
	UBYTE	mode_skip,n;
	UBYTE	stop_on;
	WORD	status;
	UBYTE	next_line_no;
	UBYTE	first_line_encode;	/*	TTIを除く画データの先頭行をエンコードする直前まで1	*/
	/* RLバッファ */
	struct WorkBuf_t *a_buf;
	struct WorkBuf_t *b_buf;
	struct WorkBuf_t *c_buf;
	struct WorkBuf_t *tmp;
	struct reduction_t reduc_data,*rp;
	UWORD tsk_sw_line_no;
	UBYTE print_on;
	UBYTE scan_on;
	UBYTE panel_on;

	rp = &reduc_data;
	status = 0;/* OK */
	stop_on = 0;
	tsk_sw_line_no = 0;
/*	SCD_Debg_line_no = 0; */
	next_line_no = 0;
	print_on = 0;
	scan_on= 0;
	panel_on = 0;
	first_line_encode = 1;	/*	By Y.Suzuki 1997/08/25	*/

	/** コーデック初期化 */
	ScdcErrFlag = 0;
	Sedp = &encdata;
	Sddp = &decdata;
	CodecPageStatus = CDC_READY;
	EncodeDataCount = 0;
	Sedp->BufMode = ECM_BUF;
	Sddp->BufMode = MEM1;
	SoftEncodeInitial(Sedp);
	SoftDecodeInitial(Sddp);
	SCD_EOL_WriteCount = 0;		/*	By Y.Suzuki 1997/04/14	*/

	if (SCD_DebugSwitch) {
		SCD_SkipMrEol = 0; /*	By Y.Suzuki 1998/1/20	*/
	}

	/* タスクスイッチ調整用メンテナンスSW−Fをコピーする By Y.Suzuki 1997/10/17 */
	CopyFromMantSwF();

	/** RLバッファアドレスセット */
	/*EncRlBufInit(Sedp->Img_Size);縮小の場合もSrcのイメージサイズで初期化*/
	/*------3本のバッファを初期化する
	EncRlBufInit(Sddp->Img_Size);
	DecRlBufInit(Sddp->Img_Size);
	--------*/
	RlBufInit(Sddp->Img_Size);
	a_buf = &RL1;
	b_buf = &RL2;
	c_buf = &RL3;

	/*	SCD 大域変数ヘ移動 By Y.Suzuki 1997/03/07	*/
	SCD_TxMode = TxMode;

	/*	ダイレクト送信有無 By Y.Suzuki 1997/02/14	*/
	SCD_CheckDirectTx();
	if (SCD_DirectTx) {
		Sddp->Wp = Sedp->Wp;
		Sddp->Wp->Buf = Sedp->Wp->Buf;
		Sddp->Wp->Adr = Sedp->Wp->Adr;
		Sddp->Wp->Bit = Sedp->Wp->Bit;
	}

	/** 縮小制御 */
	mode_skip = GetModeSkip(SYS_DocBlock.Src.Mode,SYS_DocBlock.Dst.Mode);
	reduce_f = SetReduce(&(SYS_DocBlock.Src), &(SYS_DocBlock.Dst));
	if(reduce_f == 1) {
		SetSkip(A3_TO_A4,rp);
	}
	else if(reduce_f == 2) {
		SetSkip(A3_TO_B4,rp);
	}
	else if(reduce_f == 3) {
		SetSkip(B4_TO_A4,rp);
	}
	else {
		SetSkip(100,rp);
	}

	CodecPageStatus = CDC_CONTINUE;			/**	初期化 By Y.Suzuki 1997/09/19	*/
	/** キャラクタ送信 */
	if(FCM_PtnrChkTTI_TxAvailable() == TTI_TX_AVAILABLE) {/** TTI送信あり */
		SF_ECM_CharTx(Sedp,a_buf,b_buf);
		/* 参照ラインのクリア By Y.Suzuki 1997/08/26  */
		a_buf->Cout = 0;
		b_buf->Cout = 0;
		c_buf->Cout = 0;
		PutRL(a_buf,Sddp->Img_Size,0);
		PutRL(b_buf,Sddp->Img_Size,0);
		PutRL(c_buf,Sddp->Img_Size,0);
#if(0)	/*	By Y.Suzuki 1997/08/26	*/
		tmp = c_buf;
		c_buf = a_buf;
		a_buf = tmp;
#endif
		/* CodecPageStatus = CDC_CONTINUE;ここでは、遅い T3.1 になることがある */
		/* メモリ読み出し DMA 256 単位でよいか? */
	/*	if (CHK_UNI_TTI_Inside() == TTI_INSIDE) [* USA以外のため 96/05/16 By T.Yamaguchi */
		if ((CHK_UNI_TTI_Inside() == TTI_INSIDE) || (CommandFileOptionItem == SYS_CIPHER_TX)) {
			/* スクランブル送信時TTIアウトサイドにすると元に戻らない。By Y.Suzuki 1998/04/23 */
			/* 16ラインデコード読み飛ばし */
			if(SCD_DirectTx == 1) {	/*	TTIインサイドのときは、ダイレクト送信できない By Y.Suzuki 1997/08/13	*/
				SCD_DirectTx = 0;
			}
			n = (UBYTE)(16 * ModePara(SYS_DocBlock.Src.Mode));
			if (n > 64) {/* By Y.Suzuki 1997/08/28 */
				n = 64;
			}
			while (n--) {							/* dst -> src に変更	Mar 26 '93 */
				/* Caution! a_bufをデコード用,b_bufを参照用として使用する */
				status = Mem_Decode(Sddp,c_buf,a_buf);
				if(SCD_DBG_RLOVER == 2) {
					SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x04;
				}
				tmp = a_buf;
				a_buf = c_buf;
				c_buf = tmp;
			}
		}
	}
/* By Y.Suzuki 1997/10/17
*	if (SYS_FaxComTxType == SYS_SCANNER_TX) {
*		EcmBufferBaseWritePoint = 0x1000000 + Sedp->Wp->Adr;
*		return;
*	}
*/

	/*	コーデックステータス とりあえず By Y.Suzuki 1996/07/04	*/
	/* CodecPageStatus = CDC_CONTINUE;			*	初期化	*/
	n = 0;
	do {	/*1ラインごとの処理。RTC検出までループ*/
		if (SCD_DebugSwitch) {/*By Y.Suzuki 1998/01/20*/
			if (!SCD_SkipMrEol) {
				tmp = c_buf;
				c_buf = b_buf;
				b_buf = a_buf;
				a_buf = tmp;
			}
		}
		else {
			tmp = c_buf;
			c_buf = b_buf;
			b_buf = a_buf;
			a_buf = tmp;
		}
		/* 停止キー確認、極性反転チェック */
		/* if (SYS_FaxComStopSwitch() == 1) [	*	ストップSwONの時	*/
		if (MDM_TxStopSwFlag == 1) {	/**	ストップSwONの時	*/
			stop_on = 1;
			CodecPageStatus = CDC_STOPPED;
			break;
		}
		if (n != 1) {/* EFINE --> FINE への縮小ではない */
			n = mode_skip;
		}
		/* 自動タスクスイッチ時間調節の処理 By Y.Suzuki 1997/08/13 */
		/* パネル使用中追加 By Y.Suzuki 1997/10/08 */
#if (0)
**		scan_on = CMN_CheckScanEnable();
**		panel_on = CMN_CheckPanelBusy();
**		タスク id を直接参照 By Y.Suzuki 1997/12/04
#endif
		print_on = CMN_CheckPrinting();
		if (tskno_SCN_DocumentStoreTask != 0xFFFF) {
			scan_on = TRUE;
		}
		else {
			scan_on = 0;
		}
		if (tskno_OPR_KeyTimerTask != 0xFFFF) {
			panel_on = TRUE;
		}
		else {
			panel_on = 0;
		}
		if ((print_on == TRUE) && (scan_on == TRUE)) {
#if (PRO_CODEC_NUMBER == CDC_SINGLE)	/* By Y.Suzuki 1997/12/05  */
/*	ポプラLでB4−A4の縮小G3送信+コピープリント+コピースキャンでエラーラインがあったので
By Y.Suzuki 1997/12/05	*/
			SCD_MaintenanceSwitch[SCD_MNT_SW_F2] = 80;
#else
			SCD_MaintenanceSwitch[SCD_MNT_SW_F2] = 60;
#endif
	}
		else if ((print_on == TRUE) || (scan_on == TRUE)) {
			SCD_MaintenanceSwitch[SCD_MNT_SW_F2] = 30;
		}
		else {
			if (panel_on) {
				SCD_MaintenanceSwitch[SCD_MNT_SW_F2] = 15;
			}
			else {
				SCD_MaintenanceSwitch[SCD_MNT_SW_F2] = 0;
			}
		}
		if (reduce_f) {
#if (PRO_CODEC_NUMBER == CDC_SINGLE)	/* By Y.Suzuki 1997/12/05  */
/*	ポプラLでB4−A4の縮小G3送信+コピープリント+コピースキャンでエラーラインがあったので
By Y.Suzuki 1997/12/05	*/
			SCD_MaintenanceSwitch[SCD_MNT_SW_F2] += 40;
#else
			SCD_MaintenanceSwitch[SCD_MNT_SW_F2] += 30;
#endif
		}
		if (!SCD_DirectTx) {
			do {
				do {
					/** 1ラインデコード */
					/* Caution! a_bufをデコード用,b_bufを参照用として使用する */
					status = Mem_Decode(Sddp,a_buf,b_buf);
					if(SCD_DBG_RLOVER == 2) {
						SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x04;
					}
					/*For Debug By Y.Suzuki 1998/01/20*/
					if ((status == TX_MEM_ERR) && (SYS_DocBlock.Src.Code == SYS_MR_CODE) && SCD_DebugSwitch) {
						SCD_SkipMrEol = 1;
						PutRL(a_buf,Sddp->Img_Size,0);	/*	RLバッファ全白クリア By Y.Suzuki 1997/09/30	*/
						continue;/*	By Y.Suzuki 1997/02/17	*/
					}
					if ((status == TX_MEM_ERR) && (SYS_DocBlock.Src.Code == SYS_MMR_CODE)) {
						CodecPageStatus = CDC_DECODE_ERROR;
						ScdcErrFlag = 1;
						status = RTC;
						break;
					}
					if (status == RTC) {
						break;
					}
					if(n && ReductionFromR12 != 2) {/** モード変更による副走査間引き処理 */
						tmp = a_buf;
						a_buf = b_buf;
						b_buf = tmp;
					}
					else if (ReductionFromR12 == 2 && n == 2) {/* EFINEからFINEへの縮小あり 11.55-->7.7  */
						n--;
						break;
					}
					else if (n) {
						tmp = a_buf;
						a_buf = b_buf;
						b_buf = tmp;
					}
				}while(n--);
				if(!reduce_f){
					break;
				}
				else if (reduce_f == 6) {/** HFINEからのモード変更のみあり By Y.Suzuki 1997/01/17  */
					RedLine(Sddp,b_buf,reduce_f);
					if(SCD_DBG_OldRlSize) {
						SYB_MaintenanceSwitch[MNT_SW_F0] |= 1;
					}
					if(SCD_DBG_RLOVER == 4) {
						SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x10;
					}
					break;
				}
				else if (reduce_f == R12_TO_R8) {/** R12からR8のモード変更のみあり By Y.Suzuki 1997/11/13  */
					RedLineR12ToR8(Sddp,b_buf,reduce_f);
					if(SCD_DBG_OldRlSize) {
						SYB_MaintenanceSwitch[MNT_SW_F0] |= 1;
					}
					if(SCD_DBG_RLOVER == 4) {
						SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x10;
					}
					break;
				}
				else if(!Skip(rp)){/** 主走査縮小による副走査間引き処理 */
					/** 主走査縮小 */
#if (0) /* By Y.Suzuki 1997/01/16 */
					if (ReductionFromHfine) {/* R16 --> R8 の縮小を行う。縮小率50% By Y.Suzuki 1997/01/16 */
						RedLine(Sddp,b_buf,reduce_f);
					}
#endif
					if (ReductionFromR12) {/* R12からの縮小あり	By Y.Suzuki 1997/11/13	*/
						RedLineR12ToR8(Sddp,b_buf,reduce_f);
					}
					else {
						RedLine(Sddp,b_buf,reduce_f);
					}
					if(SCD_DBG_OldRlSize) {
						SYB_MaintenanceSwitch[MNT_SW_F0] |= 1;
					}
					if(SCD_DBG_RLOVER == 4) {
						SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x10;
					}
					break;
				}
				if (status == RTC) {
					next_line_no = 1;
					break;
				}
				tmp = a_buf;
				a_buf = b_buf;
				b_buf = tmp;
				if (n != 1) {/* EFINE --> FINE への縮小ではない */
					n = mode_skip;
				}
			}while(1);
			/*	ECMWrite()内で256バイトに1msタスク切替えする By Y.Suzuki 1996/08/23	*/
			/**	タスクスイッチング 5ms 100ライン毎 で256バイトデータがそろった場合	*/
#if(0)
//		/*	if((++tsk_sw_line_no > 10) && TxStartFlag) [ By Y.Suzuki 1996/08/16 */
//			if((++tsk_sw_line_no > 10) && SCD_DirectTx) {/* 復活 By Y.Suzuki 1997/08/13 */
//				/* ダイレクト送信時タスクスイッチ用 */
//				tsk_sw_line_no = 0; /* By Y.Suzuki 1996/07/06 */
//		/*	if((++SCD_Debg_line_no > 10) && TxStartFlag) [
//				SCD_Debg_line_no = 0; */
//				if (SYB_MaintenanceSwitch[MNT_SW_F2]) {
//					wai_oneshot(SYB_MaintenanceSwitch[MNT_SW_F2]);
//				}
//				else {
//					wai_oneshot(5);
//				}
//			}
#endif
			if (next_line_no) {/* 縮小送信のRTC検出時、最後のラインが読み飛ばしのとき */
				break;
			}
			/** 1ラインエンコード */
			/* Caution! enc_rl_aをエンコード用,enc_rl_bを参照用として使用する */
			SCD_EOL_WriteCount++;		/*	By Y.Suzuki 1997/04/14	*/
			if (reduce_f && first_line_encode) {/* 縮小送信時の参照ライン をセット By Y.Suzuki 1997/08/25 */
				c_buf->Cout = 0;
				PutRL(c_buf,Sedp->Img_Size,0);
				first_line_encode = 0;
			}
			Ecm_Encode(Sedp,b_buf,c_buf);
			if(SCD_DBG_PMODE == 5) {
				SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x80;
			}
			if(SCD_DBG_ENC_RLSIZE == 1) {
				SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x20;
			}
			if(SCD_DBG_ENC_RLSIZE == 3) {
				SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x40;
			}
		}
		else {/*	ダイレクト送信 By Y.Suzuki 1997/02/14	*/
			status = Mem_Decode(Sddp,a_buf,b_buf);
			if(SCD_DBG_RLOVER == 2) {
				SYB_MaintenanceSwitch[MNT_SW_F0] |= 0x04;
			}
			if ((status == TX_MEM_ERR) && (SYS_DocBlock.Src.Code == SYS_MMR_CODE)) {
				CodecPageStatus = CDC_DECODE_ERROR;
				ScdcErrFlag = 1;
				status = RTC;
				break;
			}
			if(++tsk_sw_line_no > 10) {/* 復活 By Y.Suzuki 1996/08/16 */
				/* ダイレクト送信時タスクスイッチ用 */
				tsk_sw_line_no = 0; /* By Y.Suzuki 1996/07/06 */
#if (0)/* EcmWrite でやってるので不要 By Y.Suzuki 1997/11/29 */
**				if (SYB_MaintenanceSwitch[MNT_SW_F2]) {
**					wai_oneshot(SYB_MaintenanceSwitch[MNT_SW_F2]);
**				}
**				else {
**					wai_oneshot(5);
**				}
#endif
			}
		}
	} while(status != RTC);
	/* rtc書き込み */
	if (SCD_DirectTx) {/*	ダイレクト送信 By Y.Suzuki 1997/02/15	*/
#if defined(DEU)
		WriteRtcToEcmByte(Sddp);
#else
		WriteRtcToEcm(Sddp);
#endif
	}
	else {
		SCD_EOL_WriteCount = 0xFFFF;		/*	By Y.Suzuki 1997/04/14	*/
#if defined(DEU)
		WriteRtcToEcmByte(Sedp);
#else
		WriteRtcToEcm(Sedp);
#endif
	}
	if((CodecPageStatus == CDC_CONTINUE) && !ScdcErrFlag) {
		CodecPageStatus = CDC_RTC_DET;
	}
	/* コーデック終了処理ソフトコーデックは、特にやることない */
	/* 戻り値セット、ページ終了、停止キー有り */
	else if(stop_on) {
		CodecPageStatus = CDC_STOPPED;
	}
	/* 送信開始フラグON */
	/*
	** 64K以上のPIX送出中に通信予約クリアするとループするので条件削除する
	** 1997/08/12  By T.Yamaguchi	*/
	/* if(!ScdcErrFlag & !stop_on) {  */
		if(!TxStartFlag) {
			TxStartFlag = 1;
		}
		/* エンコードデータ数セット */
	/* } */
	/* タスク終了 */
	/* exi_tsk(); By Y.Suzuki 1997/01/18 */
	wai_tsk(0xffff);
}
Example #2
0
static int FuncCompileIfElse( FUNC *func )
    {
    FUNC *table[100], *loop, *temp ;
    int i, j, count, unknown ;
    ifelsedir direction ;

    for( loop = func ; loop ; loop = loop->next )
	loop->unknown = 0 ;

/*
 *  First find an if/else tree
 *
 */

    count = 0 ;
    direction = DIR_UNKNOWN ;
    for( loop = func ; loop ; loop = loop->next )
	{
	if( !loop->ignore && ExprLabelEqual(loop->label, iif) )
	    {
	    if( count && (direction == DIR_FORWARD) )
		break ;
	    if( !count )
		direction = DIR_FORWARD ;
	    table[count] = loop ;
	    loop = SetSkip( loop ) ;
	    count++ ;
	    if( direction == DIR_REVERSE )
		break ;					/* final $if */
	    }
	else
	if( !loop->ignore &&
		( ExprLabelEqual( loop->label, ielse ) || ExprLabelEqual( loop->label, ielseif ) ) )
	    {
	    if( !count )
		direction = DIR_REVERSE ;
	    table[count] = loop ;
	    loop = SetSkip( loop ) ;
	    count++ ;
	    if( (direction == DIR_FORWARD) && ExprLabelEqual(loop->label, ielse) )
		break ;					/* final $else */
	    }
	else
	if( count && !ExprLabelEqual(loop->label, imacro) )
	    break ;
	}
    if( !count )
	return 0 ;

    if( count >= 100 )
	IOerror( FuncBomb, "FuncCompileIfElse", "internal table exceeded" ) ;

    if( direction == DIR_UNKNOWN )
	IOerror( FuncBomb, "FuncCompileIfElse", "cannot determine direction" ) ;

/*
 *  Swap ends if tree is reversed
 *
 */

    if( direction == DIR_REVERSE )
	{
	for( i = 0 ; i < count / 2 ; i++ )
	    {
	    temp = table[i] ;
	    table[i] = table[ count - i - 1 ] ;
	    table[ count - i - 1 ] = temp ;
	    }
    if( !ExprLabelEqual( table[0]->label, iif ) )
	IOerror( FuncBomb, "FuncCompileIfElse", "if/else tree has no if" ) ;
    }

/*
 *  Check some syntax
 *
 */

    if( FuncArgCount( table[0] ) != 1 )
	{
	IOerror( FuncBomb, "FuncCompileIfElse",
	    "wrong number of arguments to $if" ) ;
	}
    for( i = 1 ; i < count - 1 ; i++ )
	{
	if( FuncArgCount( table[i] ) != 1 )
	    {
	    IOerror( FuncBomb, "FuncCompileIfElse",
		"wrong number of arguments to $elseif" ) ;
	    }
	if( ExprLabelEqual( table[i]->label, ielse ) )
	    {
	    IOerror( FuncBomb, "FuncCompileIfElse",
		"$else embedded in $if/$else tree" ) ;
	    }
	}
    if( ExprLabelEqual(table[count - 1]->label, ielse) && (FuncArgCount( table[count - 1] ) != 0) )
	IOerror( FuncBomb, "FuncCompileIfElse",
	    "wrong number of arguments to $else" ) ;

/*
 *  Find the true branch
 *
 */

    unknown = 0 ;
    for( i = 0 ; i < count ; i++ )
	{
	if( ExprNonDepend( FuncArg( table[i], 0 ), VAR_SET, 0 ) )
	    {
	    unknown = 1 ;
	    break ;
	    }
	if( ExprLabelEqual( table[i]->label, ielse ) )			/* leftover */
	    break ;
	if( ExprValue( FuncArg( table[i], 0 ) ) )	/* true */
	    break ;
	}

/*
 *  Set the final state
 *
 */

    for( j = 0 ; j < count ; j++ )
	{
	if( unknown )
	    loop = SetUnknown( table[j] ) ;
	else
	    {
	    if( i == j )
		loop = SetTrue( table[j] ) ;
	    else
		loop = SetFalse( table[j] ) ;
	    }
	if( (direction == DIR_REVERSE) && (j == 0) )
	    func = loop ;
	if( (direction == DIR_FORWARD) && (j == count - 1) )
	    func = loop ;
	}

/*
 *  func is now the last FUNC of the tree
 *
 */

    if( func && func->next )
	return !unknown + FuncCompileIfElse( func->next ) ;
    else
	return !unknown ;
    }