/*
╔═══════════════════╦══════════════════════════╤══════════════════════╗
║ SensorAndSwitch ║ (C) 2014-16 BlueDragon │ tempusb (sys) ║
╠═══════════════════╩══════════════════════════╪══════════════════════╣
║ Temperatur USB │ Modul C++ ║
╟──────────────────────────────────────────────┴──────────────────────╢
║ USB-Temperatursensor Lesemodul ║
║ ║
║ ┌───────────────┐ ║
╟─┤ Compilierung: ├───────────────────────────────────────────────────╢
║ ╘═══════════════╛ ║
║ g++ tempusb.cpp -otempusb -lusb-1.0 ║
║ ./tempusb ║
╚═════════════════════════════════════════════════════════════════════╝
*/
#include <cstdlib>
#include <cstdio>
#include <locale>
#include <iostream>
#include <libusb-1.0/libusb.h>
using namespace std;
int main(int argc, char *argv[]) {
/******************************/
char ver[] = "1.00.0264";
char cpr[] = "(C)2016 BlueDragon";
libusb_device_handle* handle;
libusb_device* dev;
struct libusb_device_descriptor desc;
struct libusb_config_descriptor *config;
int vid = 0x16c0;
int pid = 0x0480;
int interface = 0;
int in = 0x81;
int leng = 64;
unsigned int timeout = 5000;
int res;
int kernelDriverDetached;
int numBytes;
int bus;
int devadr;
unsigned char buffer[leng];
char temp[10];
char* p;
int itemp;
float ftemp;
bool fehler = false;
string help1 = "-h";
string help2 = "--help";
string info1 = "info";
string info2 = "-i";
string info3 = "--info";
string info4 = "-info";
setlocale(LC_ALL, "de_DE");
if (argc > 1 && ( argv[1] == help1 || argv[1] == help2)) {
fprintf(stdout, "┌──────────────────────────────────────────────┐\n");
fprintf(stdout, "│\e[45m\e[1m tempusb Version %s %s \e[0m│\n",
ver,
cpr);
fprintf(stdout, "├──────────────────────────────────────────────┤\n");
fprintf(stdout, "│ \e[1m\e[44mSyntax:\e[0m │\n");
fprintf(stdout, "│ tempusb │\n");
fprintf(stdout, "│ - liefert den Wert des USB-Temperatur-│\n");
fprintf(stdout, "│ sensors als 1/10 Grad Celsius │\n");
fprintf(stdout, "│ (Z. B. 245 = 24,5°C) │\n");
fprintf(stdout, "│ tempusb info │\n");
fprintf(stdout, "│ - zeigt den Wert aufbereitet als Grad │\n");
fprintf(stdout, "│ Celsius mit einer Kommastelle und │\n");
fprintf(stdout, "│ Informationen zum USB-Temperatur- │\n");
fprintf(stdout, "│ sensor an │\n");
fprintf(stdout, "│ tempusb -h|--help │\n");
fprintf(stdout, "│ - diese Hilfe │\n");
fprintf(stdout, "└──────────────────────────────────────────────┘\n");
return 1;
}
res = libusb_init(0);
if (res != 0) {
fehler = true;
fprintf(stderr, "Fehler: Init libusb (ggf. apt-get install libusb-1.0-0 libusb-1.0-0-dev)\n");
return 1;
}
handle = libusb_open_device_with_vid_pid(NULL, vid, pid);
if (!handle) {
fehler = true;
fprintf(stderr, "Fehler: Gerätezugriff; Gerät %04X:%04X USB-Temperatursensor nicht gefunden.\n",
vid,
pid);
return 1;
}
dev = libusb_get_device(handle);
res = libusb_get_device_descriptor(dev, &desc);
if (res != 0) {
fehler = true;
fprintf(stderr, "Fehler: Lesen der Geräte-Beschreibung fehlgeschlagen.\n");
return 1;
}
res = libusb_get_config_descriptor(dev, 0, &config);
if (res != 0) {
fehler = true;
fprintf(stderr, "Fehler: Lesen der Konfigurations-Beschreibung fehlgeschlagen.\n");
return 1;
}
if (libusb_kernel_driver_active(handle, interface)) {
res = libusb_detach_kernel_driver(handle, interface);
if (res == 0) {
kernelDriverDetached=1;
}
else {
fehler = true;
fprintf(stderr, "Fehler: Kerneltreibertrennung.\n");
return 1;
}
}
res = libusb_claim_interface(handle, interface);
if (res != 0) {
fehler = true;
fprintf(stderr, "Fehler: Interfacebelegung für Zugriff.\n");
return 1;
}
res = libusb_interrupt_transfer(handle, in, buffer, leng, &numBytes, timeout);
if (res == 0) {
if (numBytes == leng) {
itemp = buffer[4] + buffer[5] * 256;
if (itemp > 32768) {
itemp -= 65536;
}
sprintf(temp, "%d",
itemp);
}
else {
fehler = true;
fprintf(stderr, "Warnung: Empfangen %d Byte(s), anstelle von %d Bytes.\n",
numBytes,
leng);
if (numBytes >= 6) {
itemp = buffer[4] + buffer[5] * 256;
if (itemp > 32768) {
itemp -= 65536;
}
sprintf(temp, "%d",
itemp);
}
}
}
else
{
fehler = true;
fprintf(stderr, "Fehler: Datenübertragung.\n");
}
res = libusb_release_interface(handle, interface);
if (res != 0) {
fehler = true;
fprintf(stderr, "Fehler: Interfacefreigabe.\n");
}
bus = libusb_get_bus_number(dev);
devadr = libusb_get_device_address(dev);
if (kernelDriverDetached) {
libusb_attach_kernel_driver(handle, interface);
}
libusb_exit(0);
ftemp = itemp;
ftemp = ftemp /10;
if (argc > 1 && (argv[1] == info1 || argv[1] == info2 || argv[1] == info3 || argv[1] == info4)) {
fprintf(stdout, "┌──────────────────────────────────────────────┐\n");
fprintf(stdout, "│\e[45m\e[1m tempusb Version %s %s \e[0m│\n",
ver,
cpr);
fprintf(stdout, "├─────────────────────────────────────┬────────┤\n");
fprintf(stdout, "│ USB-Temperatursensor │\e[36m\e[1m%5.1f°C\e[0m │\n",
ftemp);
fprintf(stdout, "├─────────────────────────────────────┼────────┤\n");
fprintf(stdout, "│ Gerät \e[33m%04X:%04X\e[0m Bus:\e[33m%3u\e[0m Dev:\e[33m%3u\e[0m │ │\n",
desc.idVendor,
desc.idProduct,
bus,devadr);
fprintf(stdout, "│ MaxPower:\e[33m%4umA\e[0m Interfaces:\e[33m%3u\e[0m │ │\n",
config->MaxPower * 2,
config->bNumInterfaces);
fprintf(stdout, "│ \e[33m0x%02X\e[0m(IN):\e[33m%3u\e[0m Byte(s) von\e[33m%3u\e[0m Byte(s) │ ",
in,
numBytes,
leng);
if (fehler) {
fprintf(stdout, "\e[31m\e[1mFehler\e[0m │\n");
}
else {
fprintf(stdout, "\e[32m\e[1mOk \e[0m │\n");
}
fprintf(stdout, "└─────────────────────────────────────┴────────┘\n");
}
else {
fprintf(stdout, "%s\n",
temp);
}
return 0;
}