void CDirectSerial::transmitByte (Bit8u val) { // mean bug: with break = 1, WriteFile will never return. ULONG bytesWritten = 0; APIRET rc = DosWrite (hCom, &val, 1, &bytesWritten); if (rc == NO_ERROR && bytesWritten > 0) { ByteTransmitted (); //LOG_MSG("UART 0x%x: TX 0x%x", base,val); } else { LOG_MSG ("UART 0x%x: NO BYTE WRITTEN!", base); } }
void CSerialLog::handleUpperEvent(Bit16u type) { if(type==SERIAL_TX_EVENT) { //LOG_MSG("SERIAL_TX_EVENT"); ByteTransmitted(); // tx timeout } else if(type==SERIAL_THR_EVENT){ //LOG_MSG("SERIAL_THR_EVENT"); ByteTransmitting(); setEvent(SERIAL_TX_EVENT,bytetime); } }
void CSerialDummy::handleUpperEvent(Bit16u type) { if(type==SERIAL_TX_EVENT) { //LOG_MSG("SERIAL_TX_EVENT"); #ifdef CHECKIT_TESTPLUG receiveByte(loopbackdata); #endif ByteTransmitted(); // tx timeout } else if(type==SERIAL_THR_EVENT){ //LOG_MSG("SERIAL_THR_EVENT"); ByteTransmitting(); setEvent(SERIAL_TX_EVENT,bytetime); } }
void CSerialModem::handleUpperEvent(Bit16u type) { switch (type) { case SERIAL_RX_EVENT: { // check for bytes to be sent to port if(CSerial::CanReceiveByte()) if(rqueue->inuse() && (CSerial::getRTS()||(flowcontrol!=3))) { Bit8u rbyte = rqueue->getb(); //LOG_MSG("Modem: sending byte %2x back to UART3",rbyte); CSerial::receiveByte(rbyte); } if(CSerial::CanReceiveByte()) setEvent(SERIAL_RX_EVENT, bytetime*0.98f); break; } case MODEM_TX_EVENT: { if (tqueue->left()) { tqueue->addb(waiting_tx_character); if (tqueue->left() < 2) { CSerial::setCTS(false); } } else { static Bits lcount=0; if (lcount<1000) { lcount++; LOG_MSG("MODEM: TX Buffer overflow!"); } } ByteTransmitted(); break; } case SERIAL_POLLING_EVENT: { if (rqueue->inuse()) { removeEvent(SERIAL_RX_EVENT); setEvent(SERIAL_RX_EVENT, (float)0.01); } Timer2(); setEvent(SERIAL_POLLING_EVENT,1); break; } case MODEM_RING_EVENT: { break; } } }
void CDirectSerial::handleUpperEvent(Bit16u type) { switch(type) { case SERIAL_POLLING_EVENT: { setEvent(SERIAL_POLLING_EVENT, 1.0f); // update Modem input line states switch(rx_state) { case D_RX_IDLE: if(CanReceiveByte()) { if(doReceive()) { // a byte was received rx_state=D_RX_WAIT; setEvent(SERIAL_RX_EVENT, bytetime*0.9f); } // else still idle } else { #if SERIAL_DEBUG if(!dbgmsg_poll_block) { log_ser(dbg_aux,"Directserial: block on polling."); dbgmsg_poll_block=true; } #endif rx_state=D_RX_BLOCKED; // have both delays (1ms + bytetime) setEvent(SERIAL_RX_EVENT, bytetime*0.9f); } break; case D_RX_BLOCKED: // one timeout tick if(!CanReceiveByte()) { rx_retry++; if(rx_retry>=rx_retry_max) { // it has timed out: rx_retry=0; removeEvent(SERIAL_RX_EVENT); if(doReceive()) { // read away everything // this will set overrun errors while(doReceive()); rx_state=D_RX_WAIT; setEvent(SERIAL_RX_EVENT, bytetime*0.9f); } else { // much trouble about nothing rx_state=D_RX_IDLE; } } // else wait further } else { // good: we can receive again #if SERIAL_DEBUG dbgmsg_poll_block=false; dbgmsg_rx_block=false; #endif removeEvent(SERIAL_RX_EVENT); rx_retry=0; if(doReceive()) { rx_state=D_RX_FASTWAIT; setEvent(SERIAL_RX_EVENT, bytetime*0.65f); } else { // much trouble about nothing rx_state=D_RX_IDLE; } } break; case D_RX_WAIT: case D_RX_FASTWAIT: break; } updateMSR(); break; } case SERIAL_RX_EVENT: { switch(rx_state) { case D_RX_IDLE: LOG_MSG("internal error in directserial"); break; case D_RX_BLOCKED: // try to receive case D_RX_WAIT: case D_RX_FASTWAIT: if(CanReceiveByte()) { // just works or unblocked rx_retry=0; // not waiting anymore if(doReceive()) { if(rx_state==D_RX_WAIT) setEvent(SERIAL_RX_EVENT, bytetime*0.9f); else { // maybe unblocked rx_state=D_RX_FASTWAIT; setEvent(SERIAL_RX_EVENT, bytetime*0.65f); } } else { // didn't receive anything rx_state=D_RX_IDLE; } } else { // blocking now or still blocked #if SERIAL_DEBUG if(rx_state==D_RX_BLOCKED) { if(!dbgmsg_rx_block) { log_ser(dbg_aux,"Directserial: rx still blocked (retry=%d)",rx_retry); dbgmsg_rx_block=true; } } else log_ser(dbg_aux,"Directserial: block on continued rx (retry=%d).",rx_retry); #endif setEvent(SERIAL_RX_EVENT, bytetime*0.65f); rx_state=D_RX_BLOCKED; } break; } updateMSR(); break; } case SERIAL_TX_EVENT: { // Maybe echo cirquit works a bit better this way if(rx_state==D_RX_IDLE && CanReceiveByte()) { if(doReceive()) { // a byte was received rx_state=D_RX_WAIT; setEvent(SERIAL_RX_EVENT, bytetime*0.9f); } } ByteTransmitted(); updateMSR(); break; } case SERIAL_THR_EVENT: { ByteTransmitting(); setEvent(SERIAL_TX_EVENT,bytetime*1.1f); break; } } }
void CDirectSerial::handleUpperEvent(Bit16u type) { switch(type) { case SERIAL_POLLING_EVENT: { DWORD dwRead = 0; Bit8u chRead = 0; setEvent(SERIAL_POLLING_EVENT, 1); if(!receiveblock) { if(((!(LSR&LSR_RX_DATA_READY_MASK)) || rx_retry>=rx_retry_max )) { rx_retry=0; if (ReadFile (hCom, &chRead, 1, &dwRead, NULL)) { if (dwRead) { receiveByte (chRead); setEvent(40, bytetime-0.03f); // receive timing receiveblock=true; } } } else rx_retry++; } // check for errors CheckErrors(); // update Modem input line states updateMSR (); break; } case 40: { // receive time is up DWORD dwRead = 0; Bit8u chRead = 0; receiveblock=false; // check if there is something to receive if(((!(LSR&LSR_RX_DATA_READY_MASK)) || rx_retry>=rx_retry_max )) { rx_retry=0; if (ReadFile (hCom, &chRead, 1, &dwRead, NULL)) { if (dwRead) { receiveByte (chRead); setEvent(40, bytetime-0.03f); // receive timing receiveblock=true; } } } else rx_retry++; break; } case SERIAL_TX_EVENT: { DWORD dwRead = 0; Bit8u chRead = 0; if(!receiveblock) { if(((!(LSR&LSR_RX_DATA_READY_MASK)) || rx_retry>=rx_retry_max )) { rx_retry=0; if (ReadFile (hCom, &chRead, 1, &dwRead, NULL)) { if (dwRead) { receiveByte (chRead); setEvent(40, bytetime-0.03f); // receive timing receiveblock=true; } } } else rx_retry++; } ByteTransmitted(); break; } case SERIAL_THR_EVENT: { ByteTransmitting(); setEvent(SERIAL_TX_EVENT,bytetime+0.03f); break; } } }
void CNullModem::handleUpperEvent(Bit16u type) { switch(type) { case SERIAL_POLLING_EVENT: { // periodically check if new data arrived, disconnect // if required. Add it back. setEvent(SERIAL_POLLING_EVENT, 1.0f); // update Modem input line states updateMSR(); switch(rx_state) { case N_RX_IDLE: if (CanReceiveByte()) { if (doReceive()) { // a byte was received rx_state=N_RX_WAIT; setEvent(SERIAL_RX_EVENT, bytetime*0.9f); } // else still idle } else { #if SERIAL_DEBUG log_ser(dbg_aux,"Nullmodem: block on polling."); #endif rx_state=N_RX_BLOCKED; // have both delays (1ms + bytetime) setEvent(SERIAL_RX_EVENT, bytetime*0.9f); } break; case N_RX_BLOCKED: // one timeout tick if (!CanReceiveByte()) { rx_retry++; if (rx_retry>=rx_retry_max) { // it has timed out: rx_retry=0; removeEvent(SERIAL_RX_EVENT); if (doReceive()) { // read away everything while(doReceive()); rx_state=N_RX_WAIT; setEvent(SERIAL_RX_EVENT, bytetime*0.9f); } else { // much trouble about nothing rx_state=N_RX_IDLE; #if SERIAL_DEBUG log_ser(dbg_aux,"Nullmodem: unblock due to no more data",rx_retry); #endif } } // else wait further } else { // good: we can receive again removeEvent(SERIAL_RX_EVENT); rx_retry=0; if (doReceive()) { rx_state=N_RX_FASTWAIT; setEvent(SERIAL_RX_EVENT, bytetime*0.65f); } else { // much trouble about nothing rx_state=N_RX_IDLE; } } break; case N_RX_WAIT: case N_RX_FASTWAIT: break; } break; } case SERIAL_RX_EVENT: { switch(rx_state) { case N_RX_IDLE: LOG_MSG("internal error in nullmodem"); break; case N_RX_BLOCKED: // try to receive case N_RX_WAIT: case N_RX_FASTWAIT: if (CanReceiveByte()) { // just works or unblocked if (doReceive()) { rx_retry=0; // not waiting anymore if (rx_state==N_RX_WAIT) setEvent(SERIAL_RX_EVENT, bytetime*0.9f); else { // maybe unblocked rx_state=N_RX_FASTWAIT; setEvent(SERIAL_RX_EVENT, bytetime*0.65f); } } else { // didn't receive anything rx_retry=0; rx_state=N_RX_IDLE; } } else { // blocking now or still blocked #if SERIAL_DEBUG if (rx_state==N_RX_BLOCKED) log_ser(dbg_aux,"Nullmodem: rx still blocked (retry=%d)",rx_retry); else log_ser(dbg_aux,"Nullmodem: block on continued rx (retry=%d).",rx_retry); #endif setEvent(SERIAL_RX_EVENT, bytetime*0.65f); rx_state=N_RX_BLOCKED; } break; } break; } case SERIAL_TX_EVENT: { // Maybe echo cirquit works a bit better this way if (rx_state==N_RX_IDLE && CanReceiveByte() && clientsocket) { if (doReceive()) { // a byte was received rx_state=N_RX_WAIT; setEvent(SERIAL_RX_EVENT, bytetime*0.9f); } } ByteTransmitted(); break; } case SERIAL_THR_EVENT: { ByteTransmitting(); // actually send it setEvent(SERIAL_TX_EVENT,bytetime+0.01f); break; } case SERIAL_SERVER_POLLING_EVENT: { // As long as nothing is connected to our server poll the // connection. if (!ServerConnect()) { // continue looking setEvent(SERIAL_SERVER_POLLING_EVENT, 50); } break; } case SERIAL_TX_REDUCTION: { // Flush the data in the transmitting buffer. if (clientsocket) clientsocket->FlushBuffer(); tx_block=false; break; } case SERIAL_NULLMODEM_DTR_EVENT: { if ((!DTR_delta) && getDTR()) { // DTR went positive. Try to connect. if (ClientConnect(new TCPClientSocket((char*)hostnamebuffer, (Bit16u)clientport))) break; // no more DTR wait event when connected } DTR_delta = getDTR(); setEvent(SERIAL_NULLMODEM_DTR_EVENT,50); break; } } }