⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hw_serial.c

📁 toppers操作系统源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	while((work = WaitForSingleObject(cb->Handle, INFINITE)) != WAIT_FAILED)	{		assert(work == WAIT_OBJECT_0);	/* オブジェクトはシグナル觉轮になった */		ReadConsoleInput(stdin, &input_record, 1, &work);		if(input_record.EventType == KEY_EVENT && input_record.Event.KeyEvent.bKeyDown == TRUE)		{			cb->ReceiveBuffer = (char)input_record.Event.KeyEvent.uChar.AsciiChar;			BITSET(cb->Flag, SIO_STA_INTRCV);			HALInterruptRequest(INHNO_SERIAL);		}	}	return 0;}static void WinConsole_CreatePort(SIOPCB * cb){	BOOL result;	result = AllocConsole();	FatalAssertion(result != 0, "WinConsole_CreatePort failed to allocate its own console.");	cb->Handle = GetStdHandle(STD_OUTPUT_HANDLE);	SetConsoleTitle("TOPPERS/JSP SerialConsole");		/* 减慨バッファ雌浑脱スレッドを侯喇 */	CreateThread(NULL,0,WinConsole_ReceiverThread,(LPVOID)cb,0,NULL);}static BOOL WinConsole_PutChar(SIOPCB * cb, INT chr, BOOL rasint){	BOOL  result;	DWORD written;	char  word;	assert(cb != NULL);	assert(BITTEST(cb->Flag, SIO_TYP_TTY));	assert(cb->Handle != NULL && cb->Handle != 0);		/* 筛洁叫蜗に办矢机流慨 */	word   = (char)chr;	result = WriteFile(cb->Handle, &word, 1, &written, NULL);		/* 充哈み券栏フラグが惟っていたら、流慨窗位充哈み妥滇を弹こす */	if(result != 0 && rasint == TRUE)	{		BITSET(cb->Flag, SIO_STA_INTSND);		HALInterruptRequest(INHNO_SERIAL);	}	return result != 0 ? TRUE : FALSE;}static void WinConsole_ClosePort(SIOPCB * cb){	assert(cb != NULL);	assert(BITTEST(cb->Flag, SIO_TYP_TTY));	if(cb->Handle != NULL && cb->Handle != 0)	{		FreeConsole();		cb->Handle = NULL;	}}/*===========================================================================*//* *   Windowsのコンソ〖ルを蝗脱したシリアル掐叫蜗 *//* 庙 : CreateConsoleScreenBufferは己窃箕にINVALID_HANDLE_VALUEを手すが、          戮のシリアル掐叫蜗婶と鼎奶かするためにNULLを脱いる。 */static DWORD WINAPI ScreenBuffer_ReceiverThread(LPVOID param){	SIOPCB *		cb = (SIOPCB *)param;	DWORD			work;	INPUT_RECORD	input_record;	assert(cb != NULL);	assert(cb->Handle != NULL && cb->Handle != 0);	while((work = WaitForSingleObject(cb->Handle, INFINITE)) != WAIT_FAILED)	{		assert(work == WAIT_OBJECT_0);	/* オブジェクトはシグナル觉轮になった */		ReadConsoleInput(cb->Handle, &input_record, 1, &work);		if(input_record.EventType == KEY_EVENT && input_record.Event.KeyEvent.bKeyDown == TRUE)		{			cb->ReceiveBuffer = (char)input_record.Event.KeyEvent.uChar.AsciiChar;			BITSET(cb->Flag, SIO_STA_INTRCV);			HALInterruptRequest(INHNO_SERIAL);		}	}	return 0;}static void ScreenBuffer_CreatePort(SIOPCB * cb){	cb->Handle = CreateConsoleScreenBuffer(GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);        /* cb->Handle should not be compared with NULL because CreateConsoleScreenBuffer returns INVALID_HANDLE_VALUE if it failed */    FatalAssertion(cb->Handle != INVALID_HANDLE_VALUE && cb->Handle != NULL,        "ScreenBuffer_CreatePort failed to allocate its own console.");	SetConsoleActiveScreenBuffer(cb->Handle);	SetConsoleTitle("TOPPERS/JSP SerialConsole");		/* 减慨バッファ雌浑脱スレッドを侯喇 */	CreateThread(NULL,0,ScreenBuffer_ReceiverThread,(LPVOID)cb,0,NULL);}static BOOL ScreenBuffer_PutChar(SIOPCB * cb, INT chr, BOOL rasint){	BOOL  result;	DWORD written;	char  word;	assert(cb != NULL);	assert(BITTEST(cb->Flag, SIO_TYP_SCRBUF));	assert(cb->Handle != NULL && cb->Handle != 0);		/* 筛洁叫蜗に办矢机流慨 */	word   = (char)chr;	result = WriteFile(cb->Handle, &word, 1, &written, NULL);		/* 充哈み券栏フラグが惟っていたら、流慨窗位充哈み妥滇を弹こす */	if(result != 0 && rasint == TRUE)	{		BITSET(cb->Flag, SIO_STA_INTSND);		HALInterruptRequest(INHNO_SERIAL);	}	return result != 0 ? TRUE : FALSE;}static void ScreenBuffer_ClosePort(SIOPCB * cb){	assert(cb != NULL);	assert(BITTEST(cb->Flag, SIO_TYP_SCRBUF));	if(cb->Handle != NULL && cb->Handle != 0)	{		CloseHandle(cb->Handle);		cb->Handle = NULL;	}}/*===========================================================================*//* *   ほんとにシリアル叫蜗 */static DWORD WINAPI RawSerial_ReceiverThread(LPVOID param){	SIOPCB *	cb = (SIOPCB *)param;	DWORD		work;	char	    buffer;	assert(cb != NULL);	assert(cb->Handle != NULL && cb->Handle != 0);	while((work = WaitForSingleObject(cb->Handle, INFINITE)) != WAIT_FAILED)	{		assert(work == WAIT_OBJECT_0);	/* オブジェクトはシグナル觉轮になった */		ReadFile(cb->Handle, &buffer, 1, &work, NULL);		cb->ReceiveBuffer = (char)buffer;		BITSET(cb->Flag, SIO_STA_INTRCV);		HALInterruptRequest(INHNO_SERIAL);	}	return 0;}static void RawSerial_CreatePort(SIOPCB * cb){    cb->Handle = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);	FatalAssertion( cb->Handle != INVALID_HANDLE_VALUE && cb->Handle != NULL,                     "RawSerial_CreatePort failed to open the port 'COM1'.");		/* 减慨バッファ雌浑脱スレッドを侯喇 */	CreateThread(NULL, 0, RawSerial_ReceiverThread, (LPVOID)cb, 0, NULL);}static BOOL RawSerial_PutChar(SIOPCB * cb, INT chr, BOOL rasint){	BOOL  result;	DWORD written;	char  word;	assert(cb != NULL);	assert(BITTEST(cb->Flag, SIO_TYP_RAWSIO));	assert(cb->Handle != NULL && cb->Handle != 0);		/* 筛洁叫蜗に办矢机流慨 */	word   = (char)chr;	result = WriteFile(cb->Handle, &word, 1, &written, NULL);		/* 充哈み券栏フラグが惟っていたら、流慨窗位充哈み妥滇を弹こす */	if(result != 0 && rasint == TRUE)	{		BITSET(cb->Flag, SIO_STA_INTSND);		HALInterruptRequest(INHNO_SERIAL);	}	return result != 0 ? TRUE : FALSE;}static void RawSerial_ClosePort(SIOPCB * cb){	assert(cb != NULL);	assert(BITTEST(cb->Flag, SIO_TYP_RAWSIO));	if(cb->Handle != NULL && cb->Handle != 0)	{		CloseHandle(cb->Handle);		cb->Handle = NULL;	}}/* *  SIOドライバの介袋步ル〖チン */void sio_initialize(void){	int i;	for(i=0; i<TNUM_PORT; ++i)	{		siopcb_table[i].Flag = SIO_TYP_CONSOLE;		siopcb_table[i].Handle = NULL;		siopcb_table[i].ReceiveBuffer = -1;		siopcb_table[i].versatile = NULL;	}}/* *  シリアルI/Oポ〖トのオ〖プン */SIOPCB * sio_opn_por(ID siopid, VP_INT exinf){	BOOL     success;	SIOPCB * siopcb = GET_SIOPCB(siopid);	assert(siopcb != NULL);	siopcb->exinf = exinf;	success = TRUE;	switch(SIO_TYP(siopcb->Flag))	{	case SIO_TYP_CONSOLE:		HALExecuteProcedure(CreateSerialConsole,siopcb);		break;	case SIO_TYP_TTY:		WinConsole_CreatePort(siopcb);		break;	case SIO_TYP_SCRBUF:		HALExecuteProcedure(ScreenBuffer_CreatePort,siopcb);		break;	case SIO_TYP_RAWSIO:		HALExecuteProcedure(RawSerial_CreatePort,siopcb);		break;	default:		success = FALSE;	}	if(success == TRUE)		BITSET(siopcb->Flag, SIO_STA_OPEN);	return siopcb;}/* *  シリアルI/Oポ〖トのクロ〖ズ */void sio_cls_por(SIOPCB *siopcb){	assert(siopcb != NULL);	switch(SIO_TYP(siopcb->Flag))	{	case SIO_TYP_CONSOLE:		HALExecuteProcedure(SerialConsole_FinalRelease,siopcb);		break;	case SIO_TYP_TTY:		WinConsole_ClosePort(siopcb);		break;	case SIO_TYP_SCRBUF:		HALExecuteProcedure(ScreenBuffer_ClosePort,siopcb);		break;	case SIO_TYP_RAWSIO:		HALExecuteProcedure(RawSerial_ClosePort,siopcb);		break;	}}/* *  シリアルI/Oポ〖トへの矢机流慨 */BOOL sio_snd_chr(SIOPCB *siopcb, INT chr){	BOOL result;	assert(siopcb != NULL);	switch(SIO_TYP(siopcb->Flag))	{	case SIO_TYP_CONSOLE:		result = SerialConsole_PushChar(siopcb, chr);		break;	case SIO_TYP_TTY:		result = WinConsole_PutChar(siopcb, chr, TRUE);		break;	case SIO_TYP_SCRBUF:		result = ScreenBuffer_PutChar(siopcb, chr, TRUE);		break;	case SIO_TYP_RAWSIO:		result = RawSerial_PutChar(siopcb, chr, TRUE);		break;	}		return result;}/* *  シリアルI/Oポ〖トからの矢机减慨 */INT sio_rcv_chr(SIOPCB * siopcb){	INT result;	result = siopcb->ReceiveBuffer;	siopcb->ReceiveBuffer = -1;	return result;}/* *  シリアルI/Oポ〖トからのコ〖ルバック钓材 */void sio_ena_cbr(SIOPCB * siopcb, UINT cbrtn){}/* *  シリアルI/Oポ〖トからのコ〖ルバック敦贿 */void sio_dis_cbr(SIOPCB * siopcb, UINT cbrtn){}/* *  シリアルI/Oポ〖ト充哈みハンドラ */void sio_handler(void){	int port;	for(port = 0; port < TNUM_PORT; ++ port)	{		if(BITTEST(siopcb_table[port].Flag, SIO_STA_OPEN))		{				/* 减慨窗位充哈み */			if(BITTEST(siopcb_table[port].Flag, SIO_STA_INTRCV))			{					/* 减慨した矢机を艰り叫し */				BITCLEAR(siopcb_table[port].Flag, SIO_STA_INTRCV);				sio_ierdy_rcv(GET_SIOPCB(ID_PORT(port))->exinf);			}				/* 流慨窗位充哈み */			if(BITTEST(siopcb_table[port].Flag, SIO_STA_INTSND))			{				BITCLEAR(siopcb_table[port].Flag, SIO_STA_INTSND);				sio_ierdy_snd(GET_SIOPCB(ID_PORT(port))->exinf);			}		}	}}/* *  コンソ〖ルポ〖トへの动扩办矢机叫蜗 (充哈みなし) */void SerialRawPutc(INT chr){	SIOPCB * siopcb = &siopcb_table[CONSOLE_PORTID - 1];	assert(siopcb != NULL);	if(!BITTEST(siopcb->Flag, SIO_STA_OPEN))		return;	switch(SIO_TYP(siopcb->Flag))	{	case SIO_TYP_CONSOLE:		SerialConsole_PutChar(siopcb, chr, FALSE);		break;	case SIO_TYP_TTY:		WinConsole_PutChar(siopcb, chr, FALSE);		break;	case SIO_TYP_SCRBUF:		ScreenBuffer_PutChar(siopcb, chr, FALSE);		break;	case SIO_TYP_RAWSIO:		RawSerial_PutChar(siopcb, chr, FALSE);		break;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -