aboutsummaryrefslogtreecommitdiff
path: root/SrcUnix/EmTransportUSBUnix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SrcUnix/EmTransportUSBUnix.cpp')
-rw-r--r--SrcUnix/EmTransportUSBUnix.cpp394
1 files changed, 394 insertions, 0 deletions
diff --git a/SrcUnix/EmTransportUSBUnix.cpp b/SrcUnix/EmTransportUSBUnix.cpp
new file mode 100644
index 0000000..f8867a0
--- /dev/null
+++ b/SrcUnix/EmTransportUSBUnix.cpp
@@ -0,0 +1,394 @@
+/* -*- mode: C++; tab-width: 4 -*- */
+/* ===================================================================== *\
+ Copyright (c) 2001 Palm, Inc. or its subsidiaries.
+ All rights reserved.
+
+ This file is part of the Palm OS Emulator.
+
+ 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.
+\* ===================================================================== */
+
+#include "EmCommon.h"
+#include "EmTransportUSBUnix.h"
+
+#include "EmTransportSerial.h" // EmTransportSerial
+#include "Logging.h" // LogSerial, LogAppendMsg
+
+#define PRINTF if (!LogSerial ()) ; else LogAppendMsg
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportUSB::HostHasUSB
+ *
+ * DESCRIPTION: Return whether or not USB facilities are available.
+ *
+ * PARAMETERS: None.
+ *
+ * RETURNED: True if the host has a USB port and we can use it.
+ * False otherwise.
+ *
+ ***********************************************************************/
+
+Bool EmTransportUSB::HostHasUSB (void)
+{
+ return false;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportUSB::HostConstruct
+ *
+ * DESCRIPTION: Construct platform-specific objects/data.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: The platform-specific serial object.
+ *
+ ***********************************************************************/
+
+void EmTransportUSB::HostConstruct (void)
+{
+ fHost = new EmHostTransportUSB;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportUSB::HostDestruct
+ *
+ * DESCRIPTION: Destroy platform-specific objects/data.
+ *
+ * PARAMETERS: None.
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+void EmTransportUSB::HostDestruct (void)
+{
+ delete fHost;
+ fHost = NULL;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportUSB::HostOpen
+ *
+ * DESCRIPTION: Open the serial port in a platform-specific fashion.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: 0 if no error.
+ *
+ ***********************************************************************/
+
+ErrCode EmTransportUSB::HostOpen (void)
+{
+ fHost->fOpenLocally = true;
+
+ fHost->UpdateOpenState ();
+
+ return errNone;
+
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportUSB::HostClose
+ *
+ * DESCRIPTION: Close the serial port in a platform-specific fashion.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: 0 if no error.
+ *
+ ***********************************************************************/
+
+ErrCode EmTransportUSB::HostClose (void)
+{
+ fHost->fOpenLocally = false;
+ fHost->fOpenRemotely = false;
+
+ ErrCode err = fHost->fSerialTransport->Close ();
+
+ return err;
+
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportUSB::HostRead
+ *
+ * DESCRIPTION: Read bytes from the port in a platform-specific fashion.
+ *
+ * PARAMETERS: len - maximum number of bytes to read.
+ * data - buffer to receive the bytes.
+ *
+ * RETURNED: 0 if no error. The number of bytes actually read is
+ * returned in len if there was no error.
+ *
+ ***********************************************************************/
+
+ErrCode EmTransportUSB::HostRead (long& len, void* data)
+{
+ ErrCode err = serErrTimeOut;
+ len = 0;
+
+ fHost->UpdateOpenState ();
+
+ if (!fHost->FakeOpenConnection ())
+ {
+ err = fHost->fSerialTransport->Read (len, data);
+
+ if (err)
+ {
+ fHost->fOpenRemotely = false;
+ fHost->fSerialTransport->Close (); // Close it
+ }
+ }
+
+ return err;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportUSB::HostWrite
+ *
+ * DESCRIPTION: Write bytes to the port in a platform-specific fashion.
+ *
+ * PARAMETERS: len - number of bytes in the buffer.
+ * data - buffer containing the bytes.
+ *
+ * RETURNED: 0 if no error. The number of bytes actually written is
+ * returned in len if there was no error.
+ *
+ ***********************************************************************/
+
+ErrCode EmTransportUSB::HostWrite (long& len, const void* data)
+{
+ ErrCode err = errNone;
+ len = 0;
+
+ fHost->UpdateOpenState ();
+
+ if (!fHost->FakeOpenConnection ())
+ {
+ err = fHost->fSerialTransport->Write (len, data);
+
+ if (err)
+ {
+ fHost->fOpenRemotely = false;
+ fHost->fSerialTransport->Close (); // Close it
+ }
+ }
+
+ return err;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportUSB::HostCanRead
+ *
+ * DESCRIPTION: Return whether or not the transport is available for
+ * a read operation (that is, it's connected to another
+ * entity). Does NOT indicate whether or not there are
+ * actually any bytes available to be read.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: True if so.
+ *
+ ***********************************************************************/
+
+Bool EmTransportUSB::HostCanRead (void)
+{
+ return fHost->fOpenLocally && fHost->fOpenRemotely;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportUSB::HostCanWrite
+ *
+ * DESCRIPTION: Return whether or not the transport is available for
+ * a write operation (that is, it's connected to another
+ * entity). Does NOT indicate whether or not there is
+ * actually any room in the transport's internal buffer
+ * for the data being written.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: True if so.
+ *
+ ***********************************************************************/
+
+Bool EmTransportUSB::HostCanWrite (void)
+{
+ return fHost->fOpenLocally && fHost->fOpenRemotely;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportUSB::HostBytesInBuffer
+ *
+ * DESCRIPTION: Returns the number of bytes that can be read with the
+ * Read method. Note that bytes may be received in
+ * between the time BytesInBuffer is called and the time
+ * Read is called, so calling the latter with the result
+ * of the former is not guaranteed to fetch all received
+ * and buffered bytes.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: Number of bytes that can be read.
+ *
+ ***********************************************************************/
+
+long EmTransportUSB::HostBytesInBuffer (long minBytes)
+{
+ long bytesRead = 0;
+
+ fHost->UpdateOpenState ();
+
+ if (!fHost->FakeOpenConnection ())
+ {
+ try
+ {
+ bytesRead = fHost->fSerialTransport->BytesInBuffer (minBytes);
+ }
+ catch (ErrCode)
+ {
+ fHost->fOpenRemotely = false;
+ fHost->fSerialTransport->Close ();
+ }
+ }
+
+ return bytesRead;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportUSB::HostSetConfig
+ *
+ * DESCRIPTION: Configure the serial port in a platform-specific
+ * fasion. The port is assumed to be open.
+ *
+ * PARAMETERS: config - configuration information.
+ *
+ * RETURNED: 0 if no error.
+ *
+ ***********************************************************************/
+
+ErrCode EmTransportUSB::HostSetConfig (const ConfigUSB& /*config*/)
+{
+ ErrCode result = errNone;
+
+ return result;
+}
+
+
+#pragma mark -
+
+/***********************************************************************
+ *
+ * FUNCTION: EmHostTransportUSB c'tor
+ *
+ * DESCRIPTION: Constructor. Initialize our data members.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+EmHostTransportUSB::EmHostTransportUSB (void) :
+ fOpenLocally (false),
+ fOpenRemotely (false),
+ fSerialTransport (NULL)
+{
+ EmTransportSerial::ConfigSerial config;
+
+ config.fPort = "USB";
+
+ fSerialTransport = dynamic_cast<EmTransportSerial*> (config.NewTransport ());
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmHostTransportUSB d'tor
+ *
+ * DESCRIPTION: Destructor. Delete our data members.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+EmHostTransportUSB::~EmHostTransportUSB (void)
+{
+ delete fSerialTransport;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmHostTransportUSB::UpdateOpenState
+ *
+ * DESCRIPTION: If we want the serial port transport open, and it's not
+ * open, then try opening it.
+ *
+ * PARAMETERS: None.
+ *
+ * RETURNED: 0 if no error.
+ *
+ ***********************************************************************/
+
+void EmHostTransportUSB::UpdateOpenState (void)
+{
+ // If we need to open the USB driver and haven't done so, yet, then
+ // try to do so.
+
+ if (fOpenLocally && // Do we need the USB driver open?
+ !fOpenRemotely && // Is it closed?
+ fSerialTransport->Open () == errNone) // Could we open it?
+ {
+ fOpenRemotely = true; // Say it's open
+ }
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmHostTransportUSB::FakeOpenConnection
+ *
+ * DESCRIPTION: If we've asked the driver to be open, but could not do
+ * so because the USB device is not online, then try to
+ * pretend that we're talking with a non-responsive serial
+ * device.
+ *
+ * PARAMETERS: None.
+ *
+ * RETURNED: True if HostOpen has been called, but the USB device is
+ * not yet online and we haven't been able to call Open on
+ * the underlying serial transport. False otherwise.
+ *
+ ***********************************************************************/
+
+Bool EmHostTransportUSB::FakeOpenConnection (void)
+{
+ return fOpenLocally && !fOpenRemotely;
+}