From 6e248add51f4c6155599c7828802955641671ea9 Mon Sep 17 00:00:00 2001 From: Holger Weber Date: Thu, 27 Nov 2025 16:52:08 +0100 Subject: [PATCH] Initial commit of version from 2015 --- .gitignore | 1 + CMakeLists.txt | 5 + CUsbRocket.cpp | 262 +++++++++++++++++++++++++++++++++++++++++++++++++ CUsbRocket.h | 55 +++++++++++ main.cpp | 121 +++++++++++++++++++++++ 5 files changed, 444 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 CUsbRocket.cpp create mode 100644 CUsbRocket.h create mode 100644 main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..4eb37db --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.5) +project (rocket_usb) +add_definitions( -DUSE_UNTESTED_LIBUSBPP_METHODS ) +add_executable(rocket CUsbRocket.cpp main.cpp) +target_link_libraries(rocket usb pthread) diff --git a/CUsbRocket.cpp b/CUsbRocket.cpp new file mode 100644 index 0000000..ea30fff --- /dev/null +++ b/CUsbRocket.cpp @@ -0,0 +1,262 @@ +#include "CUsbRocket.h" +#include +#include + +using namespace std; + +CUsbRocket::CUsbRocket() : +m_iMoveState(MOVE_STOP), m_iSpeed(SPEED_SLOW), m_hdlRock(NULL) +{ + +} + +CUsbRocket::~CUsbRocket() +{ + CloseUsbRocket(); +} + +int +CUsbRocket::InitUsbRocket() +{ + struct usb_bus *busses; + + usb_init(); + usb_find_busses(); + usb_find_devices(); + + busses = usb_get_busses(); + struct usb_bus *bus; + int c, i, a; + + /* ... */ + + for (bus = busses; bus; bus = bus->next) + { + struct usb_device *dev; + + for (dev = bus->devices; dev; dev = dev->next) + { + /* check for rocket */ + if (dev->descriptor.idVendor == VID && dev->descriptor.idProduct == PID) + { + m_hdlRock = usb_open(dev); + cout << "open: " << m_hdlRock << endl; + cout << "Num Config: " << (int) dev->descriptor.bNumConfigurations << endl; + cout << "Num If: " << (int) dev->config[0].bNumInterfaces << endl; + cout << "usb_detach_kernel_driver_np: " << usb_detach_kernel_driver_np(m_hdlRock, 0) << endl; + cout << "usb_set_configuration: " << usb_set_configuration(m_hdlRock, 1) << endl; + cout << "usb_claim_interface: " << usb_claim_interface(m_hdlRock, 0) << endl; + } + } + } + + /* + if (iRetval < 0) + { + cerr << "Init Error " << iRetval << endl; //there was an error + return -1; + + } + // cout << "Init usb session done...\n"; + + m_hdlRock = libusb_open_device_with_vid_pid(m_ctx, VID, PID); + + // check if device was found + if (m_hdlRock == NULL) + { + cerr << "Rocket device not found\n"; + return -1; + } + // cout << "Found Rocket\n"; + + // check if device is used by kernel and remove if it is + if (libusb_kernel_driver_active(m_hdlRock, 0)) + { + //cerr << "Detaching from kernel\n"; + libusb_detach_kernel_driver(m_hdlRock, 0); + } + + // setup configuration + + iRetval = libusb_set_configuration(m_hdlRock, 1); + if (iRetval) + { + cerr << "Error setting configuration.\n"; + } + // claim device + iRetval = libusb_claim_interface(m_hdlRock, 0); + if (iRetval) + { + cerr << "Error claiming device.\n"; + return -1; + } + */ + return 0; +} + +void +CUsbRocket::CloseUsbRocket() +{ + if (m_hdlRock) + { + m_iMoveState = MOVE_EXIT; + usleep(500000); + MoveStop(); + usleep(500000); + usb_close(m_hdlRock); + } + m_hdlRock = NULL; + + // if (m_ctx) + // libusb_exit(m_ctx); + // m_ctx = NULL; +} + +void +CUsbRocket::MoveUp() +{ + char ucData[] = {0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + if (m_hdlRock) + { + usb_control_msg(m_hdlRock, 0x21, 0x09, 0, 0, ucData, 8, 0); + } + + +} + +void +CUsbRocket::MoveDown() +{ + char ucData[] = {0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + if (m_hdlRock) + { + usb_control_msg(m_hdlRock, 0x21, 0x09, 0, 0, ucData, 8, 0); + } +} + +void +CUsbRocket::MoveLeft() +{ + char ucData[] = {0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + if (m_hdlRock) + { + usb_control_msg(m_hdlRock, 0x21, 0x09, 0, 0, ucData, 8, 0); + } +} + +void +CUsbRocket::MoveRight() +{ + char ucData[] = {0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + if (m_hdlRock) + { + usb_control_msg(m_hdlRock, 0x21, 0x09, 0, 0, ucData, 8, 0); + } +} + +void +CUsbRocket::Fire() +{ + char ucData[] = {0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + if (m_hdlRock) + { + usb_control_msg(m_hdlRock, 0x21, 0x09, 0, 0, ucData, 8, 0); + } +} + +void +CUsbRocket::MoveStop() +{ + char ucData[] = {0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + if (m_hdlRock) + { + usb_control_msg(m_hdlRock, 0x21, 0x09, 0, 0, ucData, 8, 0); + } +} + +int +CUsbRocket::StartMovement() +{ + if (InitUsbRocket() == 0) + { + pthread_create(&m_thread, NULL, &CUsbRocket::MoveThread, this); + return 0; + } + return -1; +} + +void* +CUsbRocket::MoveThread(void *ptr) +{ + //cout << "Running Move thread\n"; + CUsbRocket* pRocket = static_cast (ptr); + while (pRocket->m_iMoveState != MOVE_EXIT) + { + switch (pRocket->m_iMoveState) + { + case MOVE_UP: + pRocket->MoveUp(); + break; + case MOVE_DOWN: + pRocket->MoveDown(); + break; + case MOVE_LEFT: + pRocket->MoveLeft(); + break; + case MOVE_RIGHT: + pRocket->MoveRight(); + break; + case MOVE_STOP: + pRocket->MoveStop(); + break; + case MOVE_FIRE: + pRocket->MoveStop(); + pRocket->Fire(); + pRocket->m_iMoveState = MOVE_STOP; + sleep(3); + break; + + default: + pRocket->m_iMoveState = MOVE_STOP; + } + + + switch (pRocket->m_iSpeed) + { + case SPEED_SLOW: + usleep(2500); + pRocket->MoveStop(); + usleep(20000); + break; + + case SPEED_MEDIUM: + usleep(10000); + pRocket->MoveStop(); + usleep(20000); + break; + + case SPEED_FASTEST: + usleep(40000); + break; + + default: + pRocket->m_iSpeed = SPEED_SLOW; + } + + } + //cout << "Exiting Move thread\n"; + return NULL; +} + +void +CUsbRocket::SetMoveDirection(MOVESTATE iDir) +{ + m_iMoveState = iDir; +} + +void +CUsbRocket::SetMoveSpeed(MOVESPEED iSpeed) +{ + m_iSpeed = iSpeed; +} + diff --git a/CUsbRocket.h b/CUsbRocket.h new file mode 100644 index 0000000..919ce64 --- /dev/null +++ b/CUsbRocket.h @@ -0,0 +1,55 @@ +#ifndef _CUSB_ROCKET_H_ +#define _CUSB_ROCKET_H_ + +#include + +#define VID 0x2123 +#define PID 0x1010 + +class CUsbRocket +{ +public: + CUsbRocket(); + ~CUsbRocket(); + int InitUsbRocket(); + void CloseUsbRocket(); + + enum MOVESPEED + { + SPEED_SLOW, SPEED_MEDIUM, SPEED_FASTEST + }; + enum MOVESTATE + { + MOVE_STOP, + MOVE_UP, + MOVE_DOWN, + MOVE_LEFT, + MOVE_RIGHT, + MOVE_FIRE, + MOVE_EXIT + }; + + void SetMoveDirection(MOVESTATE iDir); + void SetMoveSpeed(MOVESPEED iSpeed); + int StartMovement(); + +private: + + static void* MoveThread( void *ptr ); + + void MoveUp(); + void MoveDown(); + void MoveLeft(); + void MoveRight(); + void Fire(); + void MoveStop(); + + + int m_iMoveState; + int m_iSpeed; + pthread_t m_thread; + usb_dev_handle* m_hdlRock; + +}; + +#endif /* _CUSB_ROCKET_H_ */ diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..2acf17b --- /dev/null +++ b/main.cpp @@ -0,0 +1,121 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "CUsbRocket.h" + +using namespace std; +bool HandleMsg(int newsockfd); +CUsbRocket g_Rocket; + +int main(int argc, char** argv) +{ + + + g_Rocket.StartMovement(); + bool bRunning = true; + + int sockfd, newsockfd, portno; + socklen_t clilen; + + struct sockaddr_in serv_addr, cli_addr; + int n; + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd < 0) + cerr << "ERROR opening socket\n"; + bzero((char *) &serv_addr, sizeof(serv_addr)); + portno = 8088; + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = INADDR_ANY; + serv_addr.sin_port = htons(portno); + if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) + cerr << "ERROR on binding\n"; + + n = 1; + + while (bRunning) + { + listen(sockfd, 5); + clilen = sizeof(cli_addr); + newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); + if (newsockfd < 0) + cerr << "ERROR on accept\n"; + else + cout << "Client connected\n"; + + bRunning = HandleMsg(newsockfd); + cout << "Client disconnected\n"; + } + + close(newsockfd); + close(sockfd); + + return 0; + +} + +bool HandleMsg(int newsockfd) +{ + bool bRunning = true; + int n = 1; + char buffer[2]; + + while (n > 0 && bRunning) + { + n = read(newsockfd, buffer, 1); + if (n > 0) + { + cout << buffer[0] << endl; + switch (buffer[0]) + { + case 'w': + g_Rocket.SetMoveDirection(CUsbRocket::MOVE_UP); + break; + + case 's': + g_Rocket.SetMoveDirection(CUsbRocket::MOVE_DOWN); + break; + + case 'a': + g_Rocket.SetMoveDirection(CUsbRocket::MOVE_LEFT); + break; + + case 'd': + g_Rocket.SetMoveDirection(CUsbRocket::MOVE_RIGHT); + break; + + case 'q': + g_Rocket.SetMoveDirection(CUsbRocket::MOVE_STOP); + break; + + case 'x': + g_Rocket.SetMoveDirection(CUsbRocket::MOVE_EXIT); + bRunning = false; + break; + + case 'r': + g_Rocket.SetMoveSpeed(CUsbRocket::SPEED_FASTEST); + break; + + case 'f': + g_Rocket.SetMoveSpeed(CUsbRocket::SPEED_MEDIUM); + break; + + case 'v': + g_Rocket.SetMoveSpeed(CUsbRocket::SPEED_SLOW); + break; + + case ' ': + g_Rocket.SetMoveDirection(CUsbRocket::MOVE_FIRE); + break; + + } + } + } + return bRunning; +}