Ejemplo n.º 1
0
/*
 *  シリアルポートからの受信通知コールバック
 */
void
sio_irdy_rcv(intptr_t exinf)
{
	SPCB	*p_spcb;
	char	c;

	p_spcb = (SPCB *) exinf;
	c = (char) sio_rcv_chr(p_spcb->p_siopcb);
	if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_STOP) {
		/*
		 *  送信を一時停止する.送信中の文字はそのまま送信する.
		 */
		p_spcb->snd_stopped = true;
	}
	else if (p_spcb->snd_stopped && (c == FC_START
				|| (p_spcb->ioctl & IOCTL_FCANY) != 0U)) {
		/*
		 *  送信を再開する.
		 */
		p_spcb->snd_stopped = false;
		if (p_spcb->snd_count > 0U) {
			c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr];
			if (serial_snd_chr(p_spcb, c)) {
				INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
				if (p_spcb->snd_count == p_spcb->p_spinib->snd_bufsz) {
					if (isig_sem(p_spcb->p_spinib->snd_semid) < 0) {
						p_spcb->errorflag = true;
					}
				}
				p_spcb->snd_count--;
			}
		}
	}
	else if ((p_spcb->ioctl & IOCTL_FCSND) != 0U && c == FC_START) {
		/*
		 *  送信に対してフロー制御している場合,START は捨てる.
		 */
	}
	else if (p_spcb->rcv_count == p_spcb->p_spinib->rcv_bufsz) {
		/*
		 *  バッファフルの場合,受信した文字を捨てる.
		 */
	}
	else {
		/*
		 *  受信した文字を受信バッファに入れる.
		 */
		p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_write_ptr] = c;
		INC_PTR(p_spcb->rcv_write_ptr, p_spcb->p_spinib->rcv_bufsz);
		if (p_spcb->rcv_count == 0U) {
			if (isig_sem(p_spcb->p_spinib->rcv_semid) < 0) {
				p_spcb->errorflag = true;
			}
		}
		p_spcb->rcv_count++;

		/*
		 *  STOPを送信する.
		 */
		if ((p_spcb->ioctl & IOCTL_FCRCV) != 0U && !(p_spcb->rcv_stopped)
						&& p_spcb->rcv_count
							>= BUFCNT_STOP(p_spcb->p_spinib->rcv_bufsz)) {
			if (!serial_snd_chr(p_spcb, FC_STOP)) {
				p_spcb->rcv_fc_chr = FC_STOP;
			}
			p_spcb->rcv_stopped = true;
		}
	}
}
/*
 *  シリアルポートからの受信通知コールバック(受け口関数)
 */
void
eiSIOCBR_readyReceive(CELLIDX idx)
{
	CELLCB	*p_cellcb;
	char	c;

	assert(VALID_IDX(idx));
	p_cellcb = GET_CELLCB(idx);
	c = (char) cSIOPort_getChar();
	if ((VAR_ioControl & IOCTL_FCSND) != 0U && c == FC_STOP) {
		/*
		 *  送信を一時停止する.送信中の文字はそのまま送信する.
		 */
		VAR_sendStopped = true;
	}
	else if (VAR_sendStopped && (c == FC_START
				|| (VAR_ioControl & IOCTL_FCANY) != 0U)) {
		/*
		 *  送信を再開する.
		 */
		VAR_sendStopped = false;
		if (VAR_sendCount > 0U) {
			c = VAR_sendBuffer[VAR_sendReadPointer];
			if (serialPort_sendChar(p_cellcb, c)) {
				INC_PTR(VAR_sendReadPointer, ATTR_sendBufferSize);
				if (VAR_sendCount == ATTR_sendBufferSize) {
					if (ciSendSemaphore_signal() < 0) {
						VAR_errorFlag = true;
					}
				}
				VAR_sendCount--;
			}
		}
	}
	else if ((VAR_ioControl & IOCTL_FCSND) != 0U && c == FC_START) {
		/*
		 *  送信に対してフロー制御している場合,START は捨てる.
		 */
	}
	else if (VAR_receiveCount == ATTR_receiveBufferSize) {
		/*
		 *  バッファフルの場合,受信した文字を捨てる.
		 */
	}
	else {
		/*
		 *  受信した文字を受信バッファに入れる.
		 */
		VAR_receiveBuffer[VAR_receiveWritePointer] = c;
		INC_PTR(VAR_receiveWritePointer, ATTR_receiveBufferSize);
		if (VAR_receiveCount == 0U) {
			if (ciReceiveSemaphore_signal() < 0) {
				VAR_errorFlag = true;
			}
		}
		VAR_receiveCount++;

		/*
		 *  STOPを送信する.
		 */
		if ((VAR_ioControl & IOCTL_FCRCV) != 0U && !VAR_receiveStopped
				&& VAR_receiveCount >= BUFCNT_STOP(ATTR_receiveBufferSize)) {
			if (!serialPort_sendChar(p_cellcb, FC_STOP)) {
				VAR_receiveFlowControl = FC_STOP;
			}
			VAR_receiveStopped = true;
		}
	}
}