#include "stdafx.h" #include "serialparams.h" #include "debug.h" #include int DatabitsSpecToInt(TCHAR spec) { return spec-'0'; } TCHAR DatabitsSpecFromInt(int value) { return value+'0'; } int StopbitsSpecToInt(TCHAR spec) { switch(spec) { case '1': return ONESTOPBIT; case '2': return TWOSTOPBITS; default: debug("invalid stopbits spec %02x\n", spec); return ONESTOPBIT; } } TCHAR StopbitsSpecFromInt(int stopbits) { switch(stopbits) { case ONESTOPBIT: return '1'; case TWOSTOPBITS:return '2'; default: debug("invalid stopbits value %02x\n", stopbits); return '1'; } } int ParitySpecToInt(TCHAR spec) { switch(tolower(spec)) { case 'e': return EVENPARITY; case 'm': return MARKPARITY; case 'n': return NOPARITY; case 'o': return ODDPARITY; case 's': return SPACEPARITY; default: debug("invalid parity spec %02x\n", spec); return NOPARITY; } } TCHAR ParitySpecFromInt(int parity) { switch(parity) { case EVENPARITY: return 'e'; case MARKPARITY: return 'm'; case NOPARITY: return 'n'; case ODDPARITY: return 'o'; case SPACEPARITY: return 's'; default: debug("invalid parity value %02x\n", parity); return 'N'; } } void SerialParams::SetSpeed(DCB& dcb, const std::string &baud) { dcb.BaudRate= strtoul(baud.c_str(), 0, 0); } void SerialParams::SetBits(DCB& dcb, const std::string &bits) { dcb.ByteSize= DatabitsSpecToInt(bits[0]); dcb.Parity= ParitySpecToInt(bits[1]); dcb.StopBits= StopbitsSpecToInt(bits[2]); } void SerialParams::DumpState(DCB& dcb) { debug("Current settings: %d %c%c%c\n", dcb.BaudRate, DatabitsSpecFromInt(dcb.ByteSize), ParitySpecFromInt(dcb.Parity), StopbitsSpecFromInt(dcb.StopBits)); } bool add_devices(StringList& list, HKEY hKey, const TCHAR *path, const TCHAR *valuename, const TCHAR *indexname=NULL) { HKEY hActiveKey; LONG res= RegOpenKeyEx(hKey, path, 0, 0, &hActiveKey); if (ERROR_SUCCESS != res) { error(res, "failed to open registrykey %ls\n", path); return false; } // todo: figure out how to find what devices are bluetooth serial ports for (int iKey=0 ; ; iKey++) { TCHAR deviceNumber[256]; DWORD nrlen= 256; FILETIME tLast; res= RegEnumKeyEx(hActiveKey, iKey, deviceNumber, &nrlen, NULL, NULL, NULL, &tLast); if (ERROR_SUCCESS != res) break; HKEY hDeviceKey; res= RegOpenKeyEx(hActiveKey, deviceNumber, 0, 0, &hDeviceKey); if (ERROR_SUCCESS != res) { error(res, "failed to open registry key %ls\\%ls\n", path, deviceNumber); return false; } TCHAR deviceName[256]; DWORD namelen= 256; res= RegQueryValueEx(hDeviceKey, valuename, NULL, NULL, (BYTE*)deviceName, &namelen); if (ERROR_SUCCESS != res) { error(res, "failed to read registry key %ls\\%ls value %ls\n", path, deviceNumber, valuename); RegCloseKey(hDeviceKey); continue; } if (indexname) { DWORD index; DWORD indexlen=sizeof(DWORD); res= RegQueryValueEx(hDeviceKey, indexname, NULL, NULL, (BYTE*)&index, &indexlen); if (ERROR_SUCCESS != res) { error(res, "failed to read registry key %ls\\%ls value %ls\n", path, deviceNumber, indexname); RegCloseKey(hDeviceKey); continue; } _itot(index, deviceName+_tcslen(deviceName), 10); _tcscat(deviceName, _T(":")); } RegCloseKey(hDeviceKey); debug("found device: %ls\n", deviceName); list.push_back(ToString(deviceName)); } RegCloseKey(hActiveKey); return true; } StringList SerialParams::GetDeviceList() { StringList list; list.push_back("COM8:"); add_devices(list, HKEY_LOCAL_MACHINE, _T("Drivers\\Active"), _T("Name")); add_devices(list, HKEY_LOCAL_MACHINE, _T("Drivers\\USB\\FunctionDrivers"), _T("DeviceName")); add_devices(list, HKEY_LOCAL_MACHINE, _T("ExtModems"), _T("port")); add_devices(list, HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Bluetooth"), _T("BthPortName")); add_devices(list, HKEY_LOCAL_MACHINE, _T("Drivers\\RegisteredDevice"), _T("Prefix"), _T("Index")); std::sort(list.begin(), list.end()); StringList::iterator newend= std::unique(list.begin(), list.end()); if (newend!=list.end()) list.erase(newend, list.end()); return list; } StringList SerialParams::GetSpeedList() { StringList list; list.push_back("2400"); list.push_back("9600"); list.push_back("19200"); list.push_back("38400"); list.push_back("115200"); return list; } StringList SerialParams::GetBitsList() { StringList list; list.push_back("8n1"); list.push_back("7e1"); return list; } std::string SerialParams::GetDefaultSpeed() { return "115200"; } std::string SerialParams::GetDefaultBits() { return "8n1"; } std::string SerialParams::GetDefaultPort() { return "COM1:"; }