aboutsummaryrefslogtreecommitdiff
path: root/SrcShared/EmTransportSerial.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SrcShared/EmTransportSerial.cpp')
-rw-r--r--SrcShared/EmTransportSerial.cpp696
1 files changed, 696 insertions, 0 deletions
diff --git a/SrcShared/EmTransportSerial.cpp b/SrcShared/EmTransportSerial.cpp
new file mode 100644
index 0000000..190ca69
--- /dev/null
+++ b/SrcShared/EmTransportSerial.cpp
@@ -0,0 +1,696 @@
+/* -*- mode: C++; tab-width: 4 -*- */
+/* ===================================================================== *\
+ Copyright (c) 1999-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 "EmTransportSerial.h"
+
+#include "EmErrCodes.h" // kError_CommOpen
+#include "Logging.h" // LogSerial
+
+
+EmTransportSerial::OpenPortList EmTransportSerial::fgOpenPorts;
+
+#define PRINTF if (!LogSerial ()) ; else LogAppendMsg
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial c'tor
+ *
+ * DESCRIPTION: Constructor. Initialize our data members.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+EmTransportSerial::EmTransportSerial (void) :
+ fHost (NULL),
+ fConfig (),
+ fCommEstablished (false)
+{
+ this->HostConstruct ();
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial c'tor
+ *
+ * DESCRIPTION: Constructor. Initialize our data members.
+ *
+ * PARAMETERS: desc - descriptor information used when opening
+ * the serial port.
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+EmTransportSerial::EmTransportSerial (const EmTransportDescriptor& desc) :
+ fHost (NULL),
+ fConfig (),
+ fCommEstablished (false)
+{
+ ConfigSerial config;
+
+ config.fPort = desc.GetSchemeSpecific ();
+
+ this->HostConstruct ();
+ this->SetConfig (config);
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial c'tor
+ *
+ * DESCRIPTION: Constructor. Initialize our data members.
+ *
+ * PARAMETERS: config - configuration information used when opening
+ * the serial port.
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+EmTransportSerial::EmTransportSerial (const ConfigSerial& config) :
+ fHost (NULL),
+ fConfig (),
+ fCommEstablished (false)
+{
+ this->HostConstruct ();
+ this->SetConfig (config);
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial d'tor
+ *
+ * DESCRIPTION: Destructor. Delete our data members.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+EmTransportSerial::~EmTransportSerial (void)
+{
+ this->Close ();
+
+ this->HostDestruct ();
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::Open
+ *
+ * DESCRIPTION: Open the transport using the information provided
+ * either in the constructor or with SetConfig.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: 0 if no error.
+ *
+ ***********************************************************************/
+
+ErrCode EmTransportSerial::Open (void)
+{
+ PRINTF ("EmTransportSerial::Open...");
+
+ // Exit if communications have already been established.
+
+ if (fCommEstablished)
+ {
+ PRINTF ("EmTransportSerial::Open: Serial port already open...leaving...");
+ return kError_CommOpen;
+ }
+
+ EmAssert (fgOpenPorts.find (fConfig.fPort) == fgOpenPorts.end ());
+
+ ErrCode err = this->HostOpen ();
+
+ if (!err)
+ err = this->HostSetConfig (fConfig);
+
+ if (err)
+ {
+ this->HostClose ();
+ }
+ else
+ {
+ fCommEstablished = true;
+ fgOpenPorts[fConfig.fPort] = this;
+ }
+
+ if (err)
+ PRINTF ("EmTransportSerial::Open: err = %ld", err);
+
+ return err;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::Close
+ *
+ * DESCRIPTION: Close the transport.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: 0 if no error.
+ *
+ ***********************************************************************/
+
+ErrCode EmTransportSerial::Close (void)
+{
+ PRINTF ("EmTransportSerial::Close...");
+
+ if (!fCommEstablished)
+ {
+ PRINTF ("EmTransportSerial::Close: Serial port not open...leaving...");
+ return kError_CommNotOpen;
+ }
+
+ fCommEstablished = false;
+ fgOpenPorts.erase (fConfig.fPort);
+
+ ErrCode err = this->HostClose ();
+
+ if (err)
+ PRINTF ("EmTransportSerial::Close: err = %ld", err);
+
+ return err;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::Read
+ *
+ * DESCRIPTION: Read up to the given number of bytes, storing them in
+ * the given buffer.
+ *
+ * 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 EmTransportSerial::Read (long& len, void* data)
+{
+ PRINTF ("EmTransportSerial::Read...");
+
+ if (!fCommEstablished)
+ {
+ PRINTF ("EmTransportSerial::Read: port not open, leaving");
+ return kError_CommNotOpen;
+ }
+
+ ErrCode err = this->HostRead (len, data);
+
+ if (err)
+ PRINTF ("EmTransportSerial::Read: err = %ld", err);
+ else
+ if (LogSerialData ())
+ LogAppendData (data, len, "EmTransportSerial::Read: reading %ld bytes.", len);
+ else
+ PRINTF ("EmTransportSerial::Read: reading %ld bytes", len);
+
+ return err;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::Write
+ *
+ * DESCRIPTION: Write up the the given number of bytes, using the data
+ * in the given buffer.
+ *
+ * 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 EmTransportSerial::Write (long& len, const void* data)
+{
+ PRINTF ("EmTransportSerial::Write...");
+
+ if (!fCommEstablished)
+ {
+ PRINTF ("EmTransportSerial::Write: port not open, leaving");
+ return kError_CommNotOpen;
+ }
+
+ ErrCode err = this->HostWrite (len, data);
+
+ if (err)
+ PRINTF ("EmTransportSerial::Write: err = %ld", err);
+ else
+ if (LogSerialData ())
+ LogAppendData (data, len, "EmTransportSerial::Write: writing %ld bytes.", len);
+ else
+ PRINTF ("EmTransportSerial::Write: writing %ld bytes", len);
+
+ return err;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::CanRead
+ *
+ * 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 EmTransportSerial::CanRead (void)
+{
+ return fCommEstablished;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::CanWrite
+ *
+ * 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 EmTransportSerial::CanWrite (void)
+{
+ return fCommEstablished;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::BytesInBuffer
+ *
+ * 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: minBytes - try to buffer at least this many bytes.
+ * Return when we have this many bytes buffered, or
+ * until some small timeout has occurred.
+ *
+ * RETURNED: Number of bytes that can be read.
+ *
+ ***********************************************************************/
+
+long EmTransportSerial::BytesInBuffer (long minBytes)
+{
+ if (!fCommEstablished)
+ return 0;
+
+ return this->HostBytesInBuffer (minBytes);
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::GetSpecificName
+ *
+ * DESCRIPTION: Returns the port name, or host address, depending on the
+ * transport in question.
+ *
+ * PARAMETERS:
+ *
+ * RETURNED: string, appropriate to the transport in question.
+ *
+ ***********************************************************************/
+
+ string EmTransportSerial::GetSpecificName (void)
+ {
+ return fConfig.fPort;
+ }
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::SetConfig
+ *
+ * DESCRIPTION: Set the configuration to be used when opening the port,
+ * or to reconfigure a currently open port.
+ *
+ * PARAMETERS: config - the configuration to use.
+ *
+ * RETURNED: 0 if no error.
+ *
+ ***********************************************************************/
+
+ErrCode EmTransportSerial::SetConfig (const ConfigSerial& config)
+{
+ PRINTF ("EmTransportSerial::SetConfig...");
+
+ if (config == fConfig)
+ {
+ PRINTF ("EmTransportSerial::SetConfig: Config unchanged, so not setting settings...");
+ return errNone;
+ }
+
+ fConfig = config;
+
+ // Exit if communications have not been established.
+
+ if (!fCommEstablished)
+ {
+ PRINTF ("EmTransportSerial::SetConfig: Serial port closed, so not setting settings...");
+ return kError_CommNotOpen;
+ }
+
+ ErrCode err = this->HostSetConfig (fConfig);
+
+ if (err)
+ PRINTF ("EmTransportSerial::SetConfig: err = %ld", err);
+
+ return err;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::GetConfig
+ *
+ * DESCRIPTION: Return the configuration specified in the constructor
+ * or in the last call to SetConfig.
+ *
+ * PARAMETERS: config - config object to receive the settings.
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+void EmTransportSerial::GetConfig (ConfigSerial& config)
+{
+ config = fConfig;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::SetRTS
+ *
+ * DESCRIPTION: .
+ *
+ * PARAMETERS: .
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+void EmTransportSerial::SetRTS (RTSControl state)
+{
+ this->HostSetRTS (state);
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::SetDTR
+ *
+ * DESCRIPTION: .
+ *
+ * PARAMETERS: .
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+void EmTransportSerial::SetDTR (Bool state)
+{
+ this->HostSetDTR (state);
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::SetBreak
+ *
+ * DESCRIPTION: .
+ *
+ * PARAMETERS: .
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+void EmTransportSerial::SetBreak (Bool state)
+{
+ this->HostSetBreak (state);
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::GetCTS
+ *
+ * DESCRIPTION: .
+ *
+ * PARAMETERS: .
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+Bool EmTransportSerial::GetCTS (void)
+{
+ return this->HostGetCTS ();
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::GetDSR
+ *
+ * DESCRIPTION: .
+ *
+ * PARAMETERS: .
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+Bool EmTransportSerial::GetDSR (void)
+{
+ return this->HostGetDSR ();
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::GetTransport
+ *
+ * DESCRIPTION: Return any transport object currently using the port
+ * specified in the given configuration.
+ *
+ * PARAMETERS: config - The configuration object containing information
+ * on a port in which we're interested. All or some
+ * of the information in this object is used when
+ * searching for a transport object already utilizing
+ * the port.
+ *
+ * RETURNED: Any found transport object. May be NULL.
+ *
+ ***********************************************************************/
+
+EmTransportSerial* EmTransportSerial::GetTransport (const ConfigSerial& config)
+{
+ OpenPortList::iterator iter = fgOpenPorts.find (config.fPort);
+
+ if (iter == fgOpenPorts.end ())
+ return NULL;
+
+ return iter->second;
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::GetDescriptorList
+ *
+ * DESCRIPTION: Return the list of serial ports on this computer. Used
+ * to prepare a menu of serial port choices.
+ *
+ * PARAMETERS: nameList - port names are added to this list.
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+void EmTransportSerial::GetDescriptorList (EmTransportDescriptorList& descList)
+{
+ PortNameList portList;
+ HostGetPortNameList (portList);
+
+ descList.clear ();
+
+ PortNameList::iterator iter = portList.begin ();
+ while (iter != portList.end ())
+ {
+ descList.push_back (EmTransportDescriptor (kTransportSerial, *iter));
+ ++iter;
+ }
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::GetSerialBaudList
+ *
+ * DESCRIPTION: Return the list of baud rates support by this computer.
+ * Used to prepare a menu of baud rate choices.
+ *
+ * PARAMETERS: baudList - baud rates are added to this list.
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+void EmTransportSerial::GetSerialBaudList (BaudList& baudList)
+{
+ HostGetSerialBaudList (baudList);
+}
+
+
+#pragma mark -
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::ConfigSerial c'tor
+ *
+ * DESCRIPTION: Constructor. Initialize our data members.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+EmTransportSerial::ConfigSerial::ConfigSerial (void) :
+ fPort (),
+ fBaud (57600),
+ fParity (kNoParity),
+ fStopBits (1),
+ fDataBits (8),
+ fHwrHandshake (true)
+{
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::ConfigSerial d'tor
+ *
+ * DESCRIPTION: Destructor. Delete our data members.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: Nothing
+ *
+ ***********************************************************************/
+
+EmTransportSerial::ConfigSerial::~ConfigSerial (void)
+{
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::ConfigSerial::NewTransport
+ *
+ * DESCRIPTION: Create a new transport object based on the configuration
+ * information in this object.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: The new transport object.
+ *
+ ***********************************************************************/
+
+EmTransport* EmTransportSerial::ConfigSerial::NewTransport (void)
+{
+ return new EmTransportSerial (*this);
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::ConfigSerial::GetTransport
+ *
+ * DESCRIPTION: Return any transport object currently using the port
+ * specified in the given configuration.
+ *
+ * PARAMETERS: None
+ *
+ * RETURNED: Any found transport object. May be NULL.
+ *
+ ***********************************************************************/
+
+EmTransport* EmTransportSerial::ConfigSerial::GetTransport (void)
+{
+ return EmTransportSerial::GetTransport (*this);
+}
+
+
+/***********************************************************************
+ *
+ * FUNCTION: EmTransportSerial::ConfigSerial::operator==
+ *
+ * DESCRIPTION: Compare two Config objects to each other
+ *
+ * PARAMETERS: other - the object to compare "this" to.
+ *
+ * RETURNED: True if the objects are equivalent.
+ *
+ ***********************************************************************/
+
+bool EmTransportSerial::ConfigSerial::operator==(const ConfigSerial& other) const
+{
+ return
+ fPort == other.fPort &&
+ fBaud == other.fBaud &&
+ fParity == other.fParity &&
+ fStopBits == other.fStopBits &&
+ fDataBits == other.fDataBits &&
+ fHwrHandshake == other.fHwrHandshake;
+}