Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
DeniedAccessLife authored Jul 12, 2024
1 parent e1aaac0 commit 16a071d
Show file tree
Hide file tree
Showing 9 changed files with 399 additions and 329 deletions.
238 changes: 123 additions & 115 deletions ArduinoStrike/ArduinoStrike/Arduino.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,138 +2,146 @@

Arduino::~Arduino()
{
CloseHandle(m_hArduino);
if (m_arduinoHandle != INVALID_HANDLE_VALUE)
{
CloseHandle(m_arduinoHandle);
}
}

Arduino::Arduino(LPCSTR device_name)
Arduino::Arduino(LPCSTR device_name) : m_arduinoHandle(INVALID_HANDLE_VALUE)
{
char port[100] = "\\.\\";

while (!Arduino::get_device(device_name, port))
{
Sleep(1000);
}

m_hArduino = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);

if (m_hArduino == INVALID_HANDLE_VALUE)
{
printf("Error opening port: %d\n", GetLastError());
return;
}

DCB dcb = { };
dcb.DCBlength = sizeof(dcb);
if (!GetCommState(m_hArduino, &dcb))
return;

dcb.BaudRate = CBR_9600;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
dcb.Parity = NOPARITY;

if (!SetCommState(m_hArduino, &dcb))
return;

COMMTIMEOUTS cto = { };
cto.ReadIntervalTimeout = 50;
cto.ReadTotalTimeoutConstant = 50;
cto.ReadTotalTimeoutMultiplier = 10;
cto.WriteTotalTimeoutConstant = 50;
cto.WriteTotalTimeoutMultiplier = 10;
if (!SetCommTimeouts(m_hArduino, &cto))
return;

printf("Successfully connected!\n");
char port[100] = "\\.\\";

while (!this->GetDevice(device_name, port))
{
sleep_for(milliseconds(1000));
}

m_arduinoHandle = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);

if (m_arduinoHandle == INVALID_HANDLE_VALUE)
{
cerr << "Error opening port: " << GetLastError() << endl;
return;
}

DCB dcb = {};
dcb.DCBlength = sizeof(dcb);

if (!GetCommState(m_arduinoHandle, &dcb))
return;

dcb.BaudRate = CBR_9600;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
dcb.Parity = NOPARITY;

if (!SetCommState(m_arduinoHandle, &dcb))
return;

COMMTIMEOUTS cto = {};
cto.ReadIntervalTimeout = 50;
cto.ReadTotalTimeoutConstant = 50;
cto.ReadTotalTimeoutMultiplier = 10;
cto.WriteTotalTimeoutConstant = 50;
cto.WriteTotalTimeoutMultiplier = 10;

if (!SetCommTimeouts(m_arduinoHandle, &cto))
return;

cout << "Successfully connected!" << endl;
}

bool Arduino::get_device(LPCSTR friendly_name, LPSTR com_port)
bool Arduino::IsAvailable() const
{
const char com[] = "COM";

HDEVINFO device_info = SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, nullptr, nullptr, DIGCF_PRESENT);
if (device_info == INVALID_HANDLE_VALUE)
return false;

SP_DEVINFO_DATA dev_info_data = { };
dev_info_data.cbSize = sizeof(dev_info_data);

DWORD device_count = 0;
while (SetupDiEnumDeviceInfo(device_info, device_count++, &dev_info_data))
{
BYTE buff[256] = { 0 };
if (SetupDiGetDeviceRegistryProperty(device_info, &dev_info_data, SPDRP_FRIENDLYNAME, nullptr, buff, sizeof(buff), nullptr))
{
DWORD out_buff_len = strlen(com_port);
LPCSTR port_name_pos = strstr(reinterpret_cast<LPCSTR>(buff), com);
if (port_name_pos == nullptr)
continue;

DWORD len = out_buff_len + strlen(port_name_pos);
if (strstr(reinterpret_cast<LPCSTR>(buff), friendly_name))
{
for (DWORD i = 0; i < len; i++, out_buff_len++)
com_port[out_buff_len] = port_name_pos[i];

com_port[strlen(com_port) - 1] = 0;
return true;
}
}
}

return false;
DWORD errors;
COMSTAT status;

if (!ClearCommError(m_arduinoHandle, &errors, &status))
{
cerr << "Error checking available data: " << GetLastError() << endl;
return false;
}

return status.cbInQue > 0;
}

bool Arduino::send_data(const string &message) const
bool Arduino::GetDevice(LPCSTR friendly_name, LPSTR com_port)
{
DWORD bw = 0;
BOOL result = WriteFile(m_hArduino, message.c_str(), message.size() + 1, &bw, nullptr);
const char com[] = "COM";
HDEVINFO device_info = SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, nullptr, nullptr, DIGCF_PRESENT);

if (result == 0 || bw != message.size() + 1)
{
printf("Failed to send message!\n");
exit(1);
}
if (device_info == INVALID_HANDLE_VALUE)
return false;

return true;
SP_DEVINFO_DATA dev_info_data = {};
dev_info_data.cbSize = sizeof(dev_info_data);

DWORD device_count = 0;

while (SetupDiEnumDeviceInfo(device_info, device_count++, &dev_info_data))
{
BYTE buff[256] = { 0 };

if (SetupDiGetDeviceRegistryProperty(device_info, &dev_info_data, SPDRP_FRIENDLYNAME, nullptr, buff, sizeof(buff), nullptr))
{
LPCSTR port_name_pos = strstr(reinterpret_cast<LPCSTR>(buff), com);

if (port_name_pos == nullptr)
continue;

if (strstr(reinterpret_cast<LPCSTR>(buff), friendly_name))
{
strncpy_s(com_port, 100, port_name_pos, strlen(port_name_pos) - 1);
com_port[strlen(port_name_pos) - 1] = '\0';
SetupDiDestroyDeviceInfoList(device_info);

return true;
}
}
}

SetupDiDestroyDeviceInfoList(device_info);
return false;
}

bool Arduino::available() const
bool Arduino::WriteMessage(const string& message) const
{
DWORD errors;
COMSTAT status;
DWORD bw = 0;
BOOL result = WriteFile(m_arduinoHandle, message.c_str(), message.size() + 1, &bw, nullptr);

if (!ClearCommError(m_hArduino, &errors, &status))
{
printf("Error checking available data: %d\n", GetLastError());
return false;
}
if (result == 0 || bw != message.size() + 1)
{
cerr << "Failed to send message!" << endl;
return false;
}

return status.cbInQue > 0;
return true;
}

string Arduino::readStringUntil(char delimiter) const
string Arduino::ReceiveMessage(char delimiter) const
{
string result;
char buffer[256];
DWORD bytesRead = 0;

while (this->available())
{
memset(buffer, 0, sizeof(buffer));

if (!ReadFile(m_hArduino, buffer, sizeof(buffer), &bytesRead, nullptr))
break;

for (DWORD i = 0; i < bytesRead; i++)
{
if (buffer[i] == delimiter)
{
return result;
}

result += buffer[i];
}
}
return result;
string result;
char buffer[256];
DWORD bytesRead = 0;

while (this->IsAvailable())
{
memset(buffer, 0, sizeof(buffer));

if (!ReadFile(m_arduinoHandle, buffer, sizeof(buffer), &bytesRead, nullptr))
break;

for (DWORD i = 0; i < bytesRead; i++)
{
if (buffer[i] == delimiter)
{
return result;
}

result += buffer[i];
}
}

return result;
}
21 changes: 13 additions & 8 deletions ArduinoStrike/ArduinoStrike/Arduino.h
Original file line number Diff line number Diff line change
@@ -1,22 +1,27 @@
#pragma once
#pragma comment(lib, "Setupapi.lib")
#include <Windows.h>

#include <thread>
#include <iostream>
#include <windows.h>
#include <devguid.h>
#include <SetupAPI.h>

using namespace std;
using namespace chrono;
using namespace this_thread;

class Arduino
{
public:
Arduino(LPCSTR device_name);
~Arduino();
bool send_data(const string& message) const;
bool available() const;
string readStringUntil(char delimiter) const;
static bool get_device(LPCSTR friendly_name, LPSTR com_port);
~Arduino();
Arduino(LPCSTR device_name);

bool WriteMessage(const string& message) const;
string ReceiveMessage(char delimiter) const;

private:
HANDLE m_hArduino;
HANDLE m_arduinoHandle;
bool IsAvailable() const;
bool GetDevice(LPCSTR friendly_name, LPSTR com_port);
};
Loading

0 comments on commit 16a071d

Please sign in to comment.