diff options
Diffstat (limited to 'kstars/kstars/indi/apogee/reb1100.cpp')
-rw-r--r-- | kstars/kstars/indi/apogee/reb1100.cpp | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/kstars/kstars/indi/apogee/reb1100.cpp b/kstars/kstars/indi/apogee/reb1100.cpp new file mode 100644 index 00000000..cacf16eb --- /dev/null +++ b/kstars/kstars/indi/apogee/reb1100.cpp @@ -0,0 +1,195 @@ +/*************************************************************************** + 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; +} + |