Now you can download a copy of these docs so you can use them offline! Download now
SerialPort.cpp
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) FIRST 2008. All Rights Reserved. */
3 /* Open Source Software - may be modified and shared by FRC teams. The code */
4 /* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */
5 /*----------------------------------------------------------------------------*/
6 
7 #include "SerialPort.h"
8 
9 #include "NetworkCommunication/UsageReporting.h"
10 #include "visa/visa.h"
11 
12 //static ViStatus _VI_FUNCH ioCompleteHandler (ViSession vi, ViEventType eventType, ViEvent event, ViAddr userHandle);
13 
22 SerialPort::SerialPort(uint32_t baudRate, uint8_t dataBits, SerialPort::Parity parity, SerialPort::StopBits stopBits)
23  : m_resourceManagerHandle (0)
24  , m_portHandle (0)
25  , m_consoleModeEnabled (false)
26 {
27  ViStatus localStatus = VI_SUCCESS;
28  localStatus = viOpenDefaultRM((ViSession*)&m_resourceManagerHandle);
29  wpi_setError(localStatus);
30 
31  localStatus = viOpen(m_resourceManagerHandle, const_cast<char*>("ASRL1::INSTR"), VI_NULL, VI_NULL, (ViSession*)&m_portHandle);
32  wpi_setError(localStatus);
33  if (localStatus != 0)
34  {
35  m_consoleModeEnabled = true;
36  return;
37  }
38 
39  localStatus = viSetAttribute(m_portHandle, VI_ATTR_ASRL_BAUD, baudRate);
40  wpi_setError(localStatus);
41  localStatus = viSetAttribute(m_portHandle, VI_ATTR_ASRL_DATA_BITS, dataBits);
42  wpi_setError(localStatus);
43  localStatus = viSetAttribute(m_portHandle, VI_ATTR_ASRL_PARITY, parity);
44  wpi_setError(localStatus);
45  localStatus = viSetAttribute(m_portHandle, VI_ATTR_ASRL_STOP_BITS, stopBits);
46  wpi_setError(localStatus);
47 
48  // Set the default timeout to 5 seconds.
49  SetTimeout(5.0f);
50 
51  // Don't wait until the buffer is full to transmit.
52  SetWriteBufferMode(kFlushOnAccess);
53 
55 
56  //viInstallHandler(m_portHandle, VI_EVENT_IO_COMPLETION, ioCompleteHandler, this);
57  //viEnableEvent(m_portHandle, VI_EVENT_IO_COMPLETION, VI_HNDLR, VI_NULL);
58 
59  nUsageReporting::report(nUsageReporting::kResourceType_SerialPort, 0);
60 }
61 
66 {
67  if (!m_consoleModeEnabled)
68  {
69  //viUninstallHandler(m_portHandle, VI_EVENT_IO_COMPLETION, ioCompleteHandler, this);
70  viClose(m_portHandle);
71  }
72  viClose(m_resourceManagerHandle);
73 }
74 
80 void SerialPort::SetFlowControl(SerialPort::FlowControl flowControl)
81 {
82  if (!m_consoleModeEnabled)
83  {
84  ViStatus localStatus = viSetAttribute (m_portHandle, VI_ATTR_ASRL_FLOW_CNTRL, flowControl);
85  wpi_setError(localStatus);
86  }
87 }
88 
98 void SerialPort::EnableTermination(char terminator)
99 {
100  if (!m_consoleModeEnabled)
101  {
102  viSetAttribute(m_portHandle, VI_ATTR_TERMCHAR_EN, VI_TRUE);
103  viSetAttribute(m_portHandle, VI_ATTR_TERMCHAR, terminator);
104  viSetAttribute(m_portHandle, VI_ATTR_ASRL_END_IN, VI_ASRL_END_TERMCHAR);
105  }
106 }
107 
112 {
113  if (!m_consoleModeEnabled)
114  {
115  viSetAttribute(m_portHandle, VI_ATTR_TERMCHAR_EN, VI_FALSE);
116  viSetAttribute(m_portHandle, VI_ATTR_ASRL_END_IN, VI_ASRL_END_NONE);
117  }
118 }
119 
126 {
127  int32_t bytes = 0;
128  if (!m_consoleModeEnabled)
129  {
130  ViStatus localStatus = viGetAttribute(m_portHandle, VI_ATTR_ASRL_AVAIL_NUM, &bytes);
131  wpi_setError(localStatus);
132  }
133  return bytes;
134 }
135 
143 void SerialPort::Printf(const char *writeFmt, ...)
144 {
145  if (!m_consoleModeEnabled)
146  {
147  va_list args;
148  va_start (args, writeFmt);
149  ViStatus localStatus = viVPrintf(m_portHandle, (ViString)writeFmt, args);
150  va_end (args);
151  wpi_setError(localStatus);
152  }
153 }
154 
162 void SerialPort::Scanf(const char *readFmt, ...)
163 {
164  if (!m_consoleModeEnabled)
165  {
166  va_list args;
167  va_start (args, readFmt);
168  ViStatus localStatus = viVScanf(m_portHandle, (ViString)readFmt, args);
169  va_end (args);
170  wpi_setError(localStatus);
171  }
172 }
173 
181 uint32_t SerialPort::Read(char *buffer, int32_t count)
182 {
183  uint32_t retCount = 0;
184  if (!m_consoleModeEnabled)
185  {
186  ViStatus localStatus = viBufRead(m_portHandle, (ViPBuf)buffer, count, (ViPUInt32)&retCount);
187  switch (localStatus)
188  {
189  case VI_SUCCESS_TERM_CHAR:
190  case VI_SUCCESS_MAX_CNT:
191  case VI_ERROR_TMO: // Timeout
192  break;
193  default:
194  wpi_setError(localStatus);
195  }
196  }
197  return retCount;
198 }
199 
207 uint32_t SerialPort::Write(const char *buffer, int32_t count)
208 {
209  uint32_t retCount = 0;
210  if (!m_consoleModeEnabled)
211  {
212  ViStatus localStatus = viBufWrite(m_portHandle, (ViPBuf)buffer, count, (ViPUInt32)&retCount);
213  wpi_setError(localStatus);
214  }
215  return retCount;
216 }
217 
226 void SerialPort::SetTimeout(float timeout)
227 {
228  if (!m_consoleModeEnabled)
229  {
230  ViStatus localStatus = viSetAttribute(m_portHandle, VI_ATTR_TMO_VALUE, (uint32_t)(timeout * 1e3));
231  wpi_setError(localStatus);
232  }
233 }
234 
247 void SerialPort::SetReadBufferSize(uint32_t size)
248 {
249  if (!m_consoleModeEnabled)
250  {
251  ViStatus localStatus = viSetBuf(m_portHandle, VI_READ_BUF, size);
252  wpi_setError(localStatus);
253  }
254 }
255 
265 {
266  if (!m_consoleModeEnabled)
267  {
268  ViStatus localStatus = viSetBuf(m_portHandle, VI_WRITE_BUF, size);
269  wpi_setError(localStatus);
270  }
271 }
272 
284 void SerialPort::SetWriteBufferMode(SerialPort::WriteBufferMode mode)
285 {
286  if (!m_consoleModeEnabled)
287  {
288  ViStatus localStatus = viSetAttribute(m_portHandle, VI_ATTR_WR_BUF_OPER_MODE, mode);
289  wpi_setError(localStatus);
290  }
291 }
292 
300 {
301  if (!m_consoleModeEnabled)
302  {
303  ViStatus localStatus = viFlush(m_portHandle, VI_WRITE_BUF);
304  wpi_setError(localStatus);
305  }
306 }
307 
314 {
315  if (!m_consoleModeEnabled)
316  {
317  ViStatus localStatus = viClear(m_portHandle);
318  wpi_setError(localStatus);
319  }
320 }
321 
322 //void SerialPort::_internalHandler(uint32_t port, uint32_t eventType, uint32_t event)
323 //{
324 //}
325 
326 //ViStatus _VI_FUNCH ioCompleteHandler (ViSession vi, ViEventType eventType, ViEvent event, ViAddr userHandle)
327 //{
328 // ((SerialPort*) userHandle)->_internalHandler(vi, eventType, event);
329 // return VI_SUCCESS;
330 //}
331 
uint32_t Read(char *buffer, int32_t count)
Definition: SerialPort.cpp:181
void Reset()
Definition: SerialPort.cpp:313
void Flush()
Definition: SerialPort.cpp:299
void Printf(const char *writeFmt,...)
Definition: SerialPort.cpp:143
void SetFlowControl(FlowControl flowControl)
Definition: SerialPort.cpp:80
void SetWriteBufferMode(WriteBufferMode mode)
Definition: SerialPort.cpp:284
void EnableTermination(char terminator= '\n')
Definition: SerialPort.cpp:98
int32_t GetBytesReceived()
Definition: SerialPort.cpp:125
uint32_t Write(const char *buffer, int32_t count)
Definition: SerialPort.cpp:207
void SetTimeout(float timeout)
Definition: SerialPort.cpp:226
void Scanf(const char *readFmt,...)
Definition: SerialPort.cpp:162
SerialPort(uint32_t baudRate, uint8_t dataBits=8, Parity parity=kParity_None, StopBits stopBits=kStopBits_One)
Definition: SerialPort.cpp:22
void DisableTermination()
Definition: SerialPort.cpp:111
void SetWriteBufferSize(uint32_t size)
Definition: SerialPort.cpp:264
void SetReadBufferSize(uint32_t size)
Definition: SerialPort.cpp:247

Generated on Sat Apr 26 2014 12:26:45 for WPILibC++ by doxygen 1.8.6