You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kstars/kstars/indi/apogee/reb1100.cpp

196 lines
5.3 KiB

/***************************************************************************
reb1100.cpp - REB1100 communication class
-------------------
begin : Thu Mar 27 2003
copyright : (C) 2003 by Igor Izyumin
email : igor@mlug.missouri.edu
***************************************************************************/
/***************************************************************************
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA.
**********************************************************************/
#include "reb1100.h"
REB1100::REB1100(){
struct usb_bus *bus;
struct usb_device *dev;
usb_init();
usb_find_busses();
usb_find_devices();
char string[256];
int found = 0;
/* find ebook device */
for(bus = usb_busses; bus && !found; bus = bus->next) {
for(dev = bus->devices; dev && !found; dev = dev->next) {
if (dev->descriptor.idVendor == 0x993 && dev->descriptor.idProduct == 0x1) {
hDevice = usb_open(dev);
cerr << "Found eBook. Attempting to open... ";
found = 1;
if (hDevice) {
// if (!usb_get_string_simple(hDevice, dev->descriptor.iSerialNumber, string, sizeof(string))) throw DevOpenError();
cerr << "Success.\n";
// cerr << "Serial number: " << string << endl;
}
else throw DevOpenError();
}
}
}
if (!found) throw DevNotFoundError();
if (!usb_set_configuration(hDevice, 0x0)) throw DevOpenError();
if (!usb_claim_interface(hDevice, 0x1)) throw DevOpenError();
memTarget = INTERNAL;
}
REB1100::~REB1100(){
usb_release_interface(hDevice, 0x0);
usb_close(hDevice);
}
void REB1100::getFile(string filename, string &data) {
long flength = filename.length();
char buf[4096];
char zeros[4] = {0, 0, 0, 0};
int ret;
string request;
// first four bytes are the length of the filename
// (low-endian)
char *byte = reinterpret_cast<char*>(&flength);
request += *byte;
byte++;
request += *byte;
byte++;
request += *byte;
byte++;
request += *byte;
// the rest is the filename
request += filename;
// send a USB control request to tell the device what file we want
char *temp;
temp = new char[request.length()];
request.copy(temp, string::npos);
ret = usb_control_msg(hDevice, 0x42, 0x01, 0x00, 0x00, temp, request.length(), 300);
if (ret == -1) throw DevControlError();
delete temp;
temp = NULL;
// read the return code
ret = usb_control_msg(hDevice, 0xc2, 0x02, 0x00, 0x00, zeros, 4, 300);
if (ret == -1) throw DevControlError();
// read file from pipe
do {
ret = usb_bulk_read(hDevice, 2, buf, 4096, 1000);
if (ret == -1) throw DevReadError();
for(int i = 0; i < ret; i++) {
data += buf[i];
}
}
while(ret == 4096);
}
void REB1100::sendFile(string filename, string &data) {
string prefix = "";
if (memTarget == MEMCARD) { // prefix with \SM\ when sending to memory card
prefix = "\\SM\\";
}
filename = prefix + filename;
long flength = data.length();
long fnlength = filename.length();
// prepare initial request
string request;
// first four bytes are the length of the file
// (low-endian)
char *byte = reinterpret_cast<char*>(&flength);
request += *byte;
byte++;
request += *byte;
byte++;
request += *byte;
byte++;
request += *byte;
// next four bytes are the length of the filename
// (low-endian)
byte = reinterpret_cast<char*>(&fnlength);
request += *byte;
byte++;
request += *byte;
byte++;
request += *byte;
byte++;
request += *byte;
// append filename
request += filename;
// send message to device
int ret;
char *temp;
temp = new char[request.length()];
request.copy(temp, string::npos);
ret = usb_control_msg(hDevice, 0x42, 0x00, 0x00, 0x00, temp, request.length(), 3000);
delete temp;
temp = NULL;
if (ret == -1) throw DevControlError();
// read from device and check for error
char temp2[4] = {0, 0, 0, 0};
ret = usb_control_msg(hDevice, 0xc2, 0x03, 0x00, 0x00, temp2, 4, 3000);
if (ret == -1) throw DevControlError();
if (temp2[0] || temp2[1] || temp2[2] || temp2[3]) throw DevControlError();
// now start bulk writing to the device
string buf;
int n, offset = 0;
char *temp3;
do {
buf = data.substr(offset, 4096);
n = buf.length();
if (buf.length() > 0) {
temp3 = new char[buf.length()];
buf.copy(temp3, string::npos);
// cout << "Sending block (" << n << " bytes)\n";
ret = usb_bulk_write(hDevice, 2, temp3, n, 3000);
if (ret == -1) throw DevWriteError();
delete temp3;
temp3 = NULL;
offset += 4096;
}
}
while(offset + 1 < data.length());
// send empty packet to signify end of file
ret = usb_bulk_write(hDevice, 2, 0, 0, 3000);
if (ret == -1) throw DevWriteError();
}
void REB1100::setTarget(bool target) {
memTarget = target;
}