Thread: [Com0com-cvs] hub4com/plugins/serial comport.cpp, 1.4, 1.5 comport.h, 1.4, 1.5
The virtual serial port driver for Windows.
Brought to you by:
vfrolov
From: Vyacheslav F. <vf...@us...> - 2008-08-13 15:14:06
|
Update of /cvsroot/com0com/hub4com/plugins/serial In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv14975 Modified Files: comport.cpp comport.h Log Message: Print bit values in readable form Index: comport.cpp =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/serial/comport.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** comport.cpp 11 Aug 2008 07:15:34 -0000 1.4 --- comport.cpp 13 Aug 2008 15:14:02 -0000 1.5 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.5 2008/08/13 15:14:02 vfrolov + * Print bit values in readable form + * * Revision 1.4 2008/08/11 07:15:34 vfrolov * Replaced *************** *** 98,101 **** --- 101,173 ---- } + struct FIELD2NAME { + DWORD code; + DWORD mask; + const char *name; + }; + + static string FieldToName(const FIELD2NAME *pTable, DWORD mask, const char *pDelimiter = "|") + { + stringstream str; + int count = 0; + + if (pTable) { + while (pTable->name) { + DWORD m = (mask & pTable->mask); + + if (m == pTable->code) { + mask &= ~pTable->mask; + if (count) + str << pDelimiter; + str << pTable->name; + count++; + } + pTable++; + } + } + + if (mask) { + if (count) + str << pDelimiter; + str << "0x" << hex << (long)mask << dec; + } + + return str.str(); + } + + #define TOFIELD2NAME2(p, s) { (ULONG)p##s, (ULONG)p##s, #s } + + static FIELD2NAME codeNameTableModemStatus[] = { + TOFIELD2NAME2(MODEM_STATUS_, DCTS), + TOFIELD2NAME2(MODEM_STATUS_, DDSR), + TOFIELD2NAME2(MODEM_STATUS_, TERI), + TOFIELD2NAME2(MODEM_STATUS_, DDCD), + TOFIELD2NAME2(MODEM_STATUS_, CTS), + TOFIELD2NAME2(MODEM_STATUS_, DSR), + TOFIELD2NAME2(MODEM_STATUS_, RI), + TOFIELD2NAME2(MODEM_STATUS_, DCD), + {0, 0, NULL} + }; + + static FIELD2NAME codeNameTableLineStatus[] = { + TOFIELD2NAME2(LINE_STATUS_, DR), + TOFIELD2NAME2(LINE_STATUS_, OE), + TOFIELD2NAME2(LINE_STATUS_, PE), + TOFIELD2NAME2(LINE_STATUS_, FE), + TOFIELD2NAME2(LINE_STATUS_, BI), + TOFIELD2NAME2(LINE_STATUS_, THRE), + TOFIELD2NAME2(LINE_STATUS_, TEMT), + TOFIELD2NAME2(LINE_STATUS_, FIFOERR), + {0, 0, NULL} + }; + + static FIELD2NAME codeNameTableComEvents[] = { + TOFIELD2NAME2(EV_, CTS), + TOFIELD2NAME2(EV_, DSR), + TOFIELD2NAME2(EV_, RLSD), + TOFIELD2NAME2(EV_, RING), + {0, 0, NULL} + }; + BOOL ComPort::Start() { *************** *** 111,116 **** msg.u.pv.val = 0xFFFFFFFF; pOnRead(hHub, hMasterPort, &msg); ! optsLsr = GO_O2V_LINE_STATUS(options); ! optsMst = GO_O2V_MODEM_STATUS(options); if (optsLsr || optsMst) { --- 183,189 ---- msg.u.pv.val = 0xFFFFFFFF; pOnRead(hHub, hMasterPort, &msg); ! ! BYTE optsLsr = GO_O2V_LINE_STATUS(options); ! BYTE optsMst = GO_O2V_MODEM_STATUS(options); if (optsLsr || optsMst) { *************** *** 127,140 **** events |= EV_RING; ! if (optsMst & ~(MODEM_STATUS_CTS|MODEM_STATUS_DSR|MODEM_STATUS_DCD|MODEM_STATUS_RI)) { ! cout << name << " WARNING: Changing of MODEM STATUS bit(s) 0x" << hex ! << (unsigned)(optsMst & ~(MODEM_STATUS_CTS|MODEM_STATUS_DSR|MODEM_STATUS_DCD|MODEM_STATUS_RI)) ! << dec << " will be ignored" << endl; } if (optsLsr) { ! cout << name << " WARNING: Changing of LINE STATUS bit(s) 0x" << hex ! << (unsigned)optsLsr ! << dec << " will be ignored" << endl; } } --- 200,217 ---- events |= EV_RING; ! optsMst &= ~(MODEM_STATUS_CTS|MODEM_STATUS_DSR|MODEM_STATUS_DCD|MODEM_STATUS_RI); ! ! if (optsMst) { ! cout << name << " WARNING: Changing of MODEM STATUS bit(s) 0x" ! << hex << (unsigned)optsMst << dec << " [" ! << FieldToName(codeNameTableModemStatus, optsMst) ! << "] will be ignored" << endl; } if (optsLsr) { ! cout << name << " WARNING: Changing of LINE STATUS bit(s) 0x" ! << hex << (unsigned)optsLsr << dec << " [" ! << FieldToName(codeNameTableLineStatus, optsLsr) ! << "] will be ignored" << endl; } } *************** *** 147,151 **** return FALSE; ! cout << name << " Event(s) 0x" << hex << events << dec << " will be monitired" << endl; } --- 224,230 ---- return FALSE; ! cout << name << " Event(s) 0x" << hex << events << dec << " [" ! << FieldToName(codeNameTableComEvents, events) ! << "] will be monitired" << endl; } *************** *** 189,192 **** --- 268,280 ---- } + static FIELD2NAME codeNameTableSetPinState[] = { + TOFIELD2NAME2(PIN_STATE_, RTS), + TOFIELD2NAME2(PIN_STATE_, DTR), + TOFIELD2NAME2(PIN_STATE_, OUT1), + TOFIELD2NAME2(PIN_STATE_, OUT2), + TOFIELD2NAME2(PIN_STATE_, BREAK), + {0, 0, NULL} + }; + BOOL ComPort::Write(HUB_MSG *pMsg) { *************** *** 259,265 **** return FALSE; ! cout << name << " SET_PIN_STATE 0x" << hex << pMsg->u.val << dec << endl; ! WORD mask = (SPS_MASK2PIN(pMsg->u.val) & maskOutPins); if (mask & PIN_STATE_RTS) { --- 347,359 ---- return FALSE; ! WORD mask = SPS_MASK2PIN(pMsg->u.val); ! cout << name << " SET_PIN_STATE 0x" << hex << pMsg->u.val << dec << " SET[" ! << FieldToName(codeNameTableSetPinState, pMsg->u.val & mask) ! << "] CLR[" ! << FieldToName(codeNameTableSetPinState, ~pMsg->u.val & mask) ! << "]" << endl; ! ! mask &= maskOutPins; if (mask & PIN_STATE_RTS) { *************** *** 339,343 **** //cout << name << " Started WaitCommEvent " << countReadOverlapped ! // << " " << hex << events << dec << endl; return TRUE; --- 433,439 ---- //cout << name << " Started WaitCommEvent " << countReadOverlapped ! // << " " << hex << events << dec << " [" ! // << FieldToName(codeNameTableComEvents, events) ! // << "] << endl; return TRUE; *************** *** 420,423 **** --- 516,529 ---- } + static FIELD2NAME codeNameTableCommErrors[] = { + TOFIELD2NAME2(CE_, RXOVER), + TOFIELD2NAME2(CE_, OVERRUN), + TOFIELD2NAME2(CE_, RXPARITY), + TOFIELD2NAME2(CE_, FRAME), + TOFIELD2NAME2(CE_, BREAK), + TOFIELD2NAME2(CE_, TXFULL), + {0, 0, NULL} + }; + void ComPort::LostReport() { *************** *** 433,445 **** if (errors) { ! cout << "Error " << name << ":"; ! ! if (errors & CE_RXOVER) { cout << " RXOVER"; errors &= ~CE_RXOVER; } ! if (errors & CE_OVERRUN) { cout << " OVERRUN"; errors &= ~CE_OVERRUN; } ! if (errors & CE_RXPARITY) { cout << " RXPARITY"; errors &= ~CE_RXPARITY; } ! if (errors & CE_FRAME) { cout << " FRAME"; errors &= ~CE_FRAME; } ! if (errors & CE_BREAK) { cout << " BREAK"; errors &= ~CE_BREAK; } ! if (errors & CE_TXFULL) { cout << " TXFULL"; errors &= ~CE_TXFULL; } ! if (errors) { cout << " 0x" << hex << errors << dec; errors = 0; } #define IOCTL_SERIAL_GET_STATS CTL_CODE(FILE_DEVICE_SERIAL_PORT,35,METHOD_BUFFERED,FILE_ANY_ACCESS) --- 539,544 ---- if (errors) { ! cout << "Error " << name << ": " << FieldToName(codeNameTableCommErrors, errors, " "); ! errors = 0; #define IOCTL_SERIAL_GET_STATS CTL_CODE(FILE_DEVICE_SERIAL_PORT,35,METHOD_BUFFERED,FILE_ANY_ACCESS) Index: comport.h =================================================================== RCS file: /cvsroot/com0com/hub4com/plugins/serial/comport.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** comport.h 11 Aug 2008 07:15:34 -0000 1.4 --- comport.h 13 Aug 2008 15:14:02 -0000 1.5 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.5 2008/08/13 15:14:02 vfrolov + * Print bit values in readable form + * * Revision 1.4 2008/08/11 07:15:34 vfrolov * Replaced *************** *** 98,103 **** DWORD events; BYTE maskOutPins; - BYTE optsLsr; - BYTE optsMst; DWORD writeQueueLimit; --- 101,104 ---- |