--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hti/PC_Tools/HTIGateway/HtiGateway/inc/SerialCommPlugin.h Tue Feb 02 01:57:15 2010 +0200
@@ -0,0 +1,202 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* This file contains headers of SerialComm communication channel plugin objects.
+* These classes are SerialComm, SerialCommPlugin and SerialCommIoThread classes.
+*/
+
+#ifndef SERIALCOMMPLUGIN_H
+#define SERIALCOMMPLUGIN_H
+
+#pragma warning ( disable : 4786 )
+#include <iostream>
+#include <process.h>
+#include <string>
+#include <map>
+#include <comdef.h>
+
+#include "common.h"
+#include "plugin.h"
+#include "safequeue.h"
+#include "thread.h"
+
+using namespace std;
+
+#define SERIAL_INI_FILE_NAME "serialplugin.ini"
+
+#define SERIAL_INI_INIT_PARAM "INIT_STRING"
+#define PARAM_SWITCH_INIT_PARAM "-INIT_STRING"
+#define SERIAL_INI_COMPORT_PARAM "COMPORT"
+#define PARAM_SWITCH_COMPORT_PARAM "-COMPORT"
+#define SERIAL_INI_COMPORT_TIMEOUT "TIMEOUT"
+#define PARAM_SWITCH_COMPORT_TIMEOUT "-TIMEOUT"
+#define SERIAL_INI_USE_HW_FLOW_CONTROL "HW_FLOWCONTROL"
+#define PARAM_SWITCH_USE_HW_FLOW_CONTROL "-HW_FLOWCONTROL"
+#define SERIAL_INI_SEND_SLEEP_PAUSE "SEND_PAUSE"
+#define PARAM_SWITCH_SEND_SLEEP_PAUSE "-SEND_PAUSE"
+#define SERIAL_INI_SEND_SIZE "SEND_SIZE"
+#define PARAM_SWITCH_SEND_SIZE "-SEND_SIZE"
+
+#define SERIAL_DEFAULT_INIT_STRING "115200,n,8,1"
+#define SERIAL_DEFAULT_COMPORT "COM2"
+
+const DWORD g_SerialCommDefaultTimeout = 40000; //ms
+const DWORD g_SerialPluginTimeout = 10000; //not used
+const long g_SerialCommDefaultSendPause = 0;
+
+// Maximum time to wait
+extern long g_MaximumShutdownWaitTime;
+
+//**********************************************************************************
+// Class SerialComm
+//
+// This class implements the actual serial communication
+//**********************************************************************************
+
+class SerialComm
+{
+public:
+ SerialComm();
+ ~SerialComm();
+ /*
+ * This method opens a communication device that uses serial communication and
+ * configures it according initialization parameters
+ */
+ WORD Open( const string& commPort, const string& initParameters, long timeout,
+ bool hwFlowControl, long sendPause, long sendMaxSize);
+ DWORD Close();
+ /*
+ * This method is used to send Data object using serial communication
+ */
+ DWORD Send(const Data& data_in);
+ /*
+ * This method reads all available data from communication media
+ * and returns it in the Data object given as parameter
+ */
+ DWORD Receive(Data* data_out);
+ /*
+ * This method returns number of bytes available in incoming queue or
+ * -1 if communication error has occurred
+ */
+ LONG GetRxBytesAvailable();
+private:
+ //handle to communication resource
+ HANDLE m_Com;
+ bool m_Open;
+ long m_SendPause;
+ long m_SendMaxSize;
+};
+
+//**********************************************************************************
+// Class SerialCommIoThread
+//
+// This thread is used to send data from outgoing queue to serial port
+// and read bytes from serial port and push it to incoming queue
+//**********************************************************************************
+
+class SerialCommIoThread : public Thread<SerialCommIoThread>
+{
+public:
+ SerialCommIoThread(SafeQueue<Data*>* in, SafeQueue<Data*>* out,
+ const string& init, const string& commPort, long timeout,
+ bool hwFlowControl, long sendPause, long sendMaxSize);
+ /*
+ * Main execution loop which is used to send Data from outgoing queue to serial port
+ * and read bytes from serial port, encapsulate it to Data objects and push them to incoming queue
+ */
+ void Run();
+ void Stop();
+ void SetTimeout(long timeout);
+ long GetTimeout() const;
+ Event GetOpenedEvent();
+private:
+ //incoming queue
+ SafeQueue<Data*>* m_InQueue;
+ //outgoing queue
+ SafeQueue<Data*>* m_OutQueue;
+ Event m_OpenedEvent;
+ bool m_Running;
+ long m_PropertySerialCommTimeout;
+ const string& m_InitString;
+ const string& m_CommPort;
+ long m_ProperySerialSendPause;
+ bool m_PropertySerialHwFlowControl;
+ long m_PropertySerialMaxSendSize;
+};
+
+//**********************************************************************************
+// Class SerialCommPlugin
+//
+// This class implements a CommChannelPlugin used in serial communication with device
+//**********************************************************************************
+
+class SerialCommPlugin : public CommChannelPlugin
+{
+public:
+ /*
+ * This method initializes SerialCommPlugin and starts SerialCommPluginIoThread
+ */
+ DWORD Init();
+ /*
+ * This method is used to:
+ * -push given data to outgoing queue
+ * -wait for data to become available in incoming queue
+ * -pop the first Data object from queue and store it to the Data object given as parameter
+ */
+ DWORD SendReceive(Data* data_in, Data** data_out, long timeout = g_SerialPluginTimeout);
+ /*
+ * This method pushes the given Data object(of type Data::EData) to outgoing queue
+ */
+ DWORD Send(Data* data_in, long timeout = g_SerialPluginTimeout);
+ /*
+ * This method is used to pop the first data object from incoming queue and store it to data object given as parameter
+ */
+ DWORD Receive(Data** data_out, long timeout = g_SerialPluginTimeout);
+ /*
+ * This method is used to wait for data to become available in incoming queue
+ * and then pop the first Data object from the queue and and store it to Data object given as parameter.
+ */
+ DWORD ReceiveWait(Data** data_out, long timeout = g_SerialPluginTimeout);
+ /*
+ * This method checks if data is available on incoming queue
+ */
+ bool IsDataAvailable();
+ DWORD Open();
+ /*
+ * This method stops SerialCommIoThread and waits for it to be in signaled state
+ */
+ DWORD Close();
+ SerialCommPlugin(const CommChannelPluginObserver* observer = NULL);
+ ~SerialCommPlugin();
+private:
+ void CheckProperties(map<string, string>& props);
+private:
+ //outgoing queue
+ SafeQueue<Data*> m_TxQueue;
+ //incoming queue
+ SafeQueue<Data*> m_RxQueue;
+ SerialCommIoThread* m_IoThread;
+ //map that properties are read to from ini file
+ map<string, string> m_SerialCommPluginProperties;
+ long m_PropertySerialCommTimeout;
+ string m_PropertySerialCommInitString;
+ string m_PropertySerialCommPort;
+ long m_ProperySerialSendPause;
+ bool m_PropertySerialHwFlowControl;
+ long m_PropertySerialMaxSendSize;
+};
+
+#endif
+
+// End of the file
\ No newline at end of file