1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
|
#pragma once
#include "Core/Object.h"
#include "Core/Array.h"
#include "HandleStream.h"
namespace storm {
STORM_PKG(core.io);
class SerialStream;
/**
* Serial parity.
*/
namespace parity {
enum SerialParity {
none,
even,
odd,
};
}
/**
* Stop bits.
*/
namespace stop {
enum SerialStopBits {
one,
two,
};
}
/**
* Options for serial communication.
*/
class SerialOptions : public Object {
STORM_CLASS;
public:
// Create default options (9600 baud, no parity, 1 stop bit).
STORM_CTOR SerialOptions();
// Create default options with custom baud rate, no parity, 1 stop bit.
STORM_CTOR SerialOptions(Nat baudrate);
// Create with all options.
STORM_CTOR SerialOptions(Nat baudrate, Nat byteSize, parity::SerialParity parity, stop::SerialStopBits stopBits);
// Baudrate.
Nat baudrate;
// Bits per byte.
Nat byteSize;
// Parity.
parity::SerialParity parity;
// Stop bits.
stop::SerialStopBits stopBits;
// To string.
void STORM_FN toS(StrBuf *to) const;
// Hash.
Nat STORM_FN hash() const;
// Equality.
Bool STORM_FN operator ==(const SerialOptions &o) const;
};
/**
* Input stream for a serial port.
*/
class SerialIStream : public HandleTimeoutIStream {
STORM_CLASS;
public:
// Not exposed to Storm. Created by the Socket.
SerialIStream(SerialStream *owner);
// Destroy.
virtual ~SerialIStream();
// Close this stream.
virtual void STORM_FN close();
private:
// Owner.
SerialStream *owner;
};
/**
* Output stream for a serial port.
*/
class SerialOStream : public HandleTimeoutOStream {
STORM_CLASS;
public:
// Not exposed to Storm. Created by the socket.
SerialOStream(SerialStream *owner);
// Destroy.
virtual ~SerialOStream();
// Close.
virtual void STORM_FN close();
private:
// Owner.
SerialStream *owner;
};
/**
* An open serial port. Use `SerialPort` to create.
*
* Contains two streams: an input and an output stream.
*/
class SerialStream : public Object {
STORM_CLASS;
public:
// Close.
virtual ~SerialStream();
// Get the input stream.
SerialIStream *STORM_FN input() const;
// Get the output stream.
SerialOStream *STORM_FN output() const;
// Close the stream. Also closes the input/output streams.
void STORM_FN close();
// Get options.
SerialOptions *STORM_FN options() const;
// Set options.
void STORM_ASSIGN options(SerialOptions *options);
private:
friend class SerialPort;
friend class SerialIStream;
friend class SerialOStream;
// Create. Called from SerialPort::open.
SerialStream(os::Handle handle, const os::Thread &attachedTo, SerialOptions *options, GcArray<char> *lockFile);
// Handle.
UNKNOWN(PTR_NOGC) os::Handle handle;
// Thread.
UNKNOWN(PTR_NOGC) os::Thread attachedTo;
// Pointer to the name of the lockfile used (on Linux), if any.
UNKNOWN(PTR_GC) GcArray<char> *lockFile;
// Options.
SerialOptions *opts;
// Input and output streams.
SerialIStream *in;
SerialOStream *out;
// Closed ends of the stream.
Nat closed;
enum {
closeRead = 0x1,
closeWrite = 0x2,
};
// Close one end of the socket.
void closeEnd(Nat which);
// Apply options in 'opts'.
void applyOptions();
// Acquire/release any locks on the device file.
static bool acquireLock(Str *port, os::Handle handle, GcArray<char> *&lockFile);
void releaseLock();
};
/**
* A description of a serial port.
*
* This class essentially encapsulates the name of a serial port to avoid confusing it with
* other strings. It provides an 'open' function to open the serial port.
*/
class SerialPort : public Object {
STORM_CLASS;
public:
// Create, with a OS-specific identifier.
STORM_CTOR SerialPort(Str *identifier);
// Open the serial port. Provide configuration options.
MAYBE(SerialStream *) STORM_FN open(SerialOptions *options);
// Get the name of the port.
Str *STORM_FN name() const {
return identifier;
}
// To string.
void STORM_FN toS(StrBuf *to) const;
// Hash.
Nat STORM_FN hash() const;
// Equality.
Bool STORM_FN operator ==(const SerialPort &other) const;
private:
// Name of the serial port. OS-specific.
Str *identifier;
};
// Find available serial ports.
Array<SerialPort *> *STORM_FN serialPorts(EnginePtr e);
}
|