Exemple #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;
		}
	}
}
Exemple #2
0
/*
 *  シリアルポートからの受信通知コールバック
 */
void
sio_ierdy_rcv(VP_INT exinf)
{
    SPCB	*spcb;
    char	c;

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

        /*
         *  STOP を送信する.
         */
        if ((spcb->ioctl & IOCTL_FCRCV) != 0 && !(spcb->rcv_stopped)
                && (spcb->rcv_count >= BUFCNT_STOP)) {
            if (!serial_snd_chr(spcb, FC_STOP)) {
                spcb->rcv_fc_chr = FC_STOP;
            }
            spcb->rcv_stopped = TRUE;
        }
    }
}