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.
114 lines
4.0 KiB
114 lines
4.0 KiB
/***************************************************************************
|
|
* Copyright (C) 2005 Nicolas Hadacek <hadacek@kde.org> *
|
|
* Copyright (C) 2003-2004 Alain Gibaud <alain.gibaud@free.fr> *
|
|
* Copyright (C) 2002-2003 Stephen Landamore <stephen@landamore.com> *
|
|
* *
|
|
* 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. *
|
|
***************************************************************************/
|
|
#ifndef SERIAL_H
|
|
#define SERIAL_H
|
|
|
|
#include "common/global/global.h"
|
|
#ifdef Q_OS_UNIX
|
|
# include <termios.h>
|
|
#elif defined(Q_OS_WIN)
|
|
# include <io.h>
|
|
#endif
|
|
#include "port_base.h"
|
|
|
|
namespace Port
|
|
{
|
|
|
|
class Serial : public Base
|
|
{
|
|
public:
|
|
enum Speed { S0 = 0, S50, S75, S110, S134, S150, S200, S300, S600, S1200,
|
|
S1800, S2400, S4800, S9600, S19200, S38400, S57600, S115200,
|
|
Nb_Speeds };
|
|
static const uint SPEED_VALUES[Nb_Speeds];
|
|
struct SpeedData {
|
|
bool supported;
|
|
uint flag;
|
|
};
|
|
static const SpeedData SPEED_DATA[Nb_Speeds];
|
|
|
|
enum Property { NoProperty = 0, NeedDrain = 1, NeedFlush = 2, NeedBreak = 4,
|
|
Blocking = 8 };
|
|
TQ_DECLARE_FLAGS(Properties, Property)
|
|
|
|
Serial(const TQString &device, Properties properties, Log::Base &base);
|
|
virtual ~Serial() { close(); }
|
|
virtual Description description() const { return Description(PortType::Serial, _device); }
|
|
|
|
static const TQStringList &probedDeviceList();
|
|
static IODirs probe(const TQString &device);
|
|
static bool isAvailable() { return true; }
|
|
|
|
enum InputFlag { NoInputFlag = 0, IgnoreBreak = 1, IgnoreParity = 2 };
|
|
TQ_DECLARE_FLAGS(InputFlags, InputFlag)
|
|
enum ControlFlag { NoControlFlag = 0, ByteSize8 = 1, HardwareFlowControl = 2,
|
|
EnableReceiver = 4, IgnoreControlLines = 8 };
|
|
TQ_DECLARE_FLAGS(ControlFlags, ControlFlag)
|
|
bool setMode(InputFlags inputFlags, ControlFlags controlFlags, Speed speed, uint readTimeout); // in ms
|
|
bool drain(uint timeout);
|
|
bool flush(uint timeout);
|
|
bool doBreak(uint duration); // in ms
|
|
bool setHardwareFlowControl(bool on);
|
|
|
|
enum Pin { DCD = 0, RX, TX, DTR, SG, DSR, RTS, CTS, RI, Nb_Pins };
|
|
struct SPinData {
|
|
IODir dir;
|
|
const char *label;
|
|
};
|
|
static const SPinData PIN_DATA[Nb_Pins];
|
|
virtual bool setPinOn(uint pin, bool on, LogicType type);
|
|
virtual bool readPin(uint pin, LogicType type, bool &value);
|
|
virtual TQValueVector<PinData> pinData(IODir dir) const;
|
|
virtual bool isGroundPin(uint pin) const;
|
|
virtual uint groundPin() const { return SG; }
|
|
virtual IODir ioDir(uint pin) const;
|
|
|
|
private:
|
|
TQString _device;
|
|
Properties _properties;
|
|
#if defined(Q_OS_UNIX)
|
|
typedef int Handle;
|
|
typedef termios Parameters;
|
|
#elif defined(Q_OS_WIN)
|
|
typedef HANDLE Handle;
|
|
struct Parameters {
|
|
DCB dcb;
|
|
COMMTIMEOUTS comtmo;
|
|
};
|
|
#endif
|
|
Handle _fd;
|
|
Parameters _oldParameters;
|
|
|
|
bool setParameters(const Parameters ¶meters);
|
|
bool getParameters(Parameters ¶meters);
|
|
virtual bool internalOpen();
|
|
virtual void internalClose();
|
|
virtual bool internalSend(const char *data, uint size, uint timeout);
|
|
virtual bool internalReceive(uint size, char *data, uint timeout);
|
|
virtual void setSystemError(const TQString &message);
|
|
bool internalSetPinOn(Pin pin, bool on);
|
|
bool internalReadPin(Pin pin, LogicType type, bool &value);
|
|
|
|
static const Handle INVALID_HANDLE;
|
|
static Handle openHandle(const TQString &device, IODirs dirs);
|
|
static void closeHandle(Handle handle);
|
|
static TQStringList *_list;
|
|
static TQStringList deviceList();
|
|
static void setHardwareFlowControl(Parameters ¶meters, bool on);
|
|
};
|
|
TQ_DECLARE_OPERATORS_FOR_FLAGS(Serial::Properties)
|
|
TQ_DECLARE_OPERATORS_FOR_FLAGS(Serial::InputFlags)
|
|
TQ_DECLARE_OPERATORS_FOR_FLAGS(Serial::ControlFlags)
|
|
|
|
} // namespace
|
|
|
|
#endif
|