/*
*	UART(IRQ3) 受信割り込みモジュール
*
*	author:	nak@pluto.dti.ne.jp
*	date:	2000/09/01
*
*/

#include <sys/bios.h>
#include <stdio.h>
#include <string.h>
#include "std.h"
#include "protocol.h"

int rxd_status;
int rxd_buff[RXD_BUFF_SIZE];
int rxd_cnt;

void far rxd_callback(void);

/*
*  UART 受信割り込み処理
*/

/*
*  開始の $DLE は受信バッファに格納しない
*  終了の Checksum,$DLE,$ETX は受信バッファに格納しない
*  チェックサムはチェックしない、DLE Stuffは取り除く
*/
void far rxd_callback()
{
	static int dle_stuff;
	int c;
	
	switch( c = comm_receive_char() ){
	case ERR_SIO_CANCEL:
	case ERR_SIO_OVERRUN:
		break;
	default:
		switch(rxd_status){
		case COMM_STATE_BUSY:
			if( c == DLE ){
				if( ++dle_stuff >= 3 ) dle_stuff = 1;	/* $DLE,$DLE,$DLE,$DLE,… */
			}else{
				dle_stuff = 0;
			}
			if( dle_stuff != 1 ) rxd_buff[rxd_cnt++] = c;
			if( rxd_cnt>1 && rxd_cnt>rxd_buff[1]+2 ) rxd_status = COMM_STATE_BUSY_ETX;
			break;
		case COMM_STATE_BUSY_ETX:
			if( c == DLE || c == ETX ) rxd_status = COMM_STATE_WAIT;   /* メイン側で処理終了したらstatus戻す */
			break;
		case COMM_STATE_NONE:
			break;
		default:
			if( c == DLE && rxd_status == COMM_STATE_READY ){
				rxd_status = COMM_STATE_BUSY;
				rxd_cnt = 0;
				dle_stuff = 0;
			}
		}
	}
}

/*
*  UART 受信割り込み許可
*/
void comm_enable()
{
	static intvector_t vector;
	
	rxd_status = COMM_STATE_NONE;
#ifdef LSI_C
	vector.callback = (void (near *)())FP_OFF(rxd_callback);
#else
	vector.callback = (void (near *)())rxd_callback;
#endif
	vector.cs = _CS;
	vector.ds = _DS;
	sys_interrupt_set_hook(SYS_INT_RECEIVEREADY, &vector, NULL);
    comm_set_baudrate(COMM_SPEED_9600);
	comm_set_cancel_key(KEY_START);
	/* lcd_set_segments(LCDSEG_AUX2); */
}

/*
*  UART 受信割り込み禁止
*/
void comm_disable()
{
	comm_close();
	sys_interrupt_reset_hook(SYS_INT_RECEIVEREADY, NULL);
	rxd_status = COMM_STATE_NONE;
	/* lcd_set_segments(0); */
}

