Add support for .ini file,

Add support for extended messages (advanced protocol),
Add handy command lines for Power, Volume in db, and Mute.
This commit is contained in:
2026-01-31 14:39:37 -06:00
parent 936f71b737
commit 49edca0238
8 changed files with 368 additions and 195 deletions

View File

@@ -17,7 +17,7 @@
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif
@@ -25,23 +25,18 @@ static char THIS_FILE[]=__FILE__;
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSerialPort::CSerialPort()
: m_PortHandle(INVALID_HANDLE_VALUE)
{
CSerialPort::CSerialPort() : m_PortHandle(INVALID_HANDLE_VALUE) {
}
CSerialPort::~CSerialPort()
{
CSerialPort::~CSerialPort() {
Close();
}
BOOL CSerialPort::Open(LPCTSTR PortName, uint32_t BaudRate, BYTE ByteSize, BYTE Parity, BYTE StopBits, uint32_t DesiredAccess)
{
bool CSerialPort::Open(LPCTSTR PortName, uint32_t BaudRate, BYTE ByteSize, BYTE Parity, BYTE StopBits, uint32_t DesiredAccess) {
Close();
m_PortHandle = CreateFile(PortName, DesiredAccess, 0, NULL, OPEN_EXISTING, 0, 0);
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
if (m_PortHandle != INVALID_HANDLE_VALUE) {
DCB dcb;
CString s;
dcb.DCBlength = sizeof(dcb);
@@ -67,7 +62,7 @@ BOOL CSerialPort::Open(LPCTSTR PortName, uint32_t BaudRate, BYTE ByteSize, BYTE
dcb.fInX = 0;
dcb.fOutX = 0;
dcb.fDtrControl = DTR_CONTROL_DISABLE; //DTR and RTS 0
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
SetCommState(m_PortHandle, &dcb);
@@ -78,186 +73,116 @@ BOOL CSerialPort::Open(LPCTSTR PortName, uint32_t BaudRate, BYTE ByteSize, BYTE
touts.WriteTotalTimeoutConstant = 1;
touts.WriteTotalTimeoutMultiplier = 0;
SetCommTimeouts(m_PortHandle, &touts);
//SetCommMask (m_PortHandle, EV_CTS | EV_DSR | EV_RING | EV_RLSD);
PurgeComm(m_PortHandle, PURGE_TXCLEAR | PURGE_RXCLEAR);
return TRUE;
}
else
{
printf("Open COM Error: %i\n", GetLastError());
return FALSE; // Use GetLastError() to know the reason
return true;
} else {
return false; // Use GetLastError() to know the reason
}
}
void CSerialPort::Close()
{
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
void CSerialPort::Close() {
if (m_PortHandle != INVALID_HANDLE_VALUE) {
CloseHandle(m_PortHandle);
m_PortHandle = INVALID_HANDLE_VALUE;
}
}
BOOL CSerialPort::IsOpen()
{
bool CSerialPort::IsOpen() {
return (m_PortHandle != INVALID_HANDLE_VALUE);
}
uint32_t CSerialPort::Read(LPVOID Buffer, uint32_t BufferSize)
{
uint32_t CSerialPort::Read(LPVOID Buffer, uint32_t BufferSize) {
DWORD Res(0);
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
if (m_PortHandle != INVALID_HANDLE_VALUE) {
ReadFile(m_PortHandle, Buffer, BufferSize, &Res, NULL);
}
return Res;
return Res;
}
uint32_t CSerialPort::Write(const LPVOID Buffer, uint32_t BufferSize)
{
uint32_t CSerialPort::Write(const LPVOID Buffer, uint32_t BufferSize) {
DWORD Res(0);
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
if (m_PortHandle != INVALID_HANDLE_VALUE) {
(void)WriteFile(m_PortHandle, Buffer, BufferSize, &Res, NULL);
}
return Res;
}
BOOL CSerialPort::Get_CD_State()
{
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
bool CSerialPort::Get_CD_State() {
if (m_PortHandle != INVALID_HANDLE_VALUE) {
DWORD ModemStat;
if (GetCommModemStatus(m_PortHandle, &ModemStat))
{
if (GetCommModemStatus(m_PortHandle, &ModemStat)) {
return (ModemStat & MS_RLSD_ON) > 0; //Not sure
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
return false;
}
BOOL CSerialPort::Get_CTS_State()
{
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
bool CSerialPort::Get_CTS_State() {
if (m_PortHandle != INVALID_HANDLE_VALUE) {
DWORD ModemStat;
if (GetCommModemStatus(m_PortHandle, &ModemStat))
{
if (GetCommModemStatus(m_PortHandle, &ModemStat)) {
return (ModemStat & MS_CTS_ON) > 0;
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
return false;
}
BOOL CSerialPort::Get_DSR_State()
{
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
bool CSerialPort::Get_DSR_State() {
if (m_PortHandle != INVALID_HANDLE_VALUE) {
DWORD ModemStat;
if (GetCommModemStatus(m_PortHandle, &ModemStat))
{
if (GetCommModemStatus(m_PortHandle, &ModemStat)) {
return (ModemStat & MS_DSR_ON) > 0;
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
return false;
}
BOOL CSerialPort::Get_RI_State()
{
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
bool CSerialPort::Get_RI_State() {
if (m_PortHandle != INVALID_HANDLE_VALUE) {
DWORD ModemStat;
if (GetCommModemStatus(m_PortHandle, &ModemStat))
{
if (GetCommModemStatus(m_PortHandle, &ModemStat)) {
return (ModemStat & MS_RING_ON) > 0;
}
else
{
return FALSE;
}
return false;
}
bool CSerialPort::Set_DTR_State(bool state) {
if (m_PortHandle != INVALID_HANDLE_VALUE) {
if (0 == EscapeCommFunction(m_PortHandle, (state ? SETDTR : CLRDTR))) {
return false;
}
}
else
{
return FALSE;
}
return true;
}
void CSerialPort::Set_DTR_State(BOOL state)
{
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
EscapeCommFunction(m_PortHandle, (state ? SETDTR : CLRDTR));
}
}
BOOL CSerialPort::Get_DTR_State()
{
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
bool CSerialPort::Get_DTR_State() {
if (m_PortHandle != INVALID_HANDLE_VALUE) {
DWORD ModemStat;
if (GetCommModemStatus(m_PortHandle, &ModemStat))
{
if (GetCommModemStatus(m_PortHandle, &ModemStat)) {
return (ModemStat & MS_DSR_ON) > 0; //Not sure
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
return false;
}
void CSerialPort::Set_RTS_State(BOOL state)
{
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
bool CSerialPort::Set_RTS_State(bool state) {
if (m_PortHandle != INVALID_HANDLE_VALUE) {
if (0 == EscapeCommFunction(m_PortHandle, (state ? SETRTS : CLRRTS))) {
printf("Set_RTS_State(%d) failed.\n", state ? 1 : 0);
return false;
}
}
return true;
}
BOOL CSerialPort::Get_RTS_State()
{
if (m_PortHandle != INVALID_HANDLE_VALUE)
{
bool CSerialPort::Get_RTS_State() {
if (m_PortHandle != INVALID_HANDLE_VALUE) {
DWORD ModemStat;
if (GetCommModemStatus(m_PortHandle, &ModemStat))
{
if (GetCommModemStatus(m_PortHandle, &ModemStat)) {
return (ModemStat & MS_CTS_ON) > 0; //Not sure
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
return false;
}

View File

@@ -24,20 +24,20 @@
class CSerialPort
{
public:
void Set_RTS_State(BOOL state);
void Set_DTR_State(BOOL state);
BOOL Get_RTS_State();
BOOL Get_DTR_State();
BOOL Get_RI_State();
BOOL Get_DSR_State();
BOOL Get_CTS_State();
BOOL Get_CD_State();
bool Set_RTS_State(bool state);
bool Set_DTR_State(bool state);
bool Get_RTS_State();
bool Get_DTR_State();
bool Get_RI_State();
bool Get_DSR_State();
bool Get_CTS_State();
bool Get_CD_State();
virtual uint32_t Write(const LPVOID Buffer, uint32_t BufferSize);
virtual uint32_t Read(LPVOID Buffer, uint32_t BufferSize);
virtual BOOL IsOpen();
virtual bool IsOpen();
virtual void Close();
// Use PortName usually "COM1:" ... "COM4:" note that the name must end by ":"
virtual BOOL Open(LPCTSTR PortName, uint32_t BaudRate, BYTE ByteSize, BYTE Parity, BYTE StopBits, uint32_t DesiredAccess = GENERIC_READ|GENERIC_WRITE);
virtual bool Open(LPCTSTR PortName, uint32_t BaudRate, BYTE ByteSize, BYTE Parity, BYTE StopBits, uint32_t DesiredAccess = GENERIC_READ|GENERIC_WRITE);
CSerialPort();
virtual ~CSerialPort();