diff --git a/hal/src/main/native/athena/SerialPort.cpp b/hal/src/main/native/athena/SerialPort.cpp index 3867999c9a..ac7b581980 100644 --- a/hal/src/main/native/athena/SerialPort.cpp +++ b/hal/src/main/native/athena/SerialPort.cpp @@ -43,6 +43,13 @@ void HAL_InitializeSerialPort(HAL_SerialPort port, int32_t* status) { if (*status > 0) *status = 0; } +void HAL_InitializeSerialPortDirect(HAL_SerialPort port, const char* portName, + int32_t* status) { + *status = viOpen(resourceManagerHandle, const_cast(portName), VI_NULL, + VI_NULL, reinterpret_cast(&portHandles[port])); + if (*status > 0) *status = 0; +} + void HAL_SetSerialBaudRate(HAL_SerialPort port, int32_t baud, int32_t* status) { *status = viSetAttribute(portHandles[port], VI_ATTR_ASRL_BAUD, baud); if (*status > 0) *status = 0; diff --git a/hal/src/main/native/include/HAL/SerialPort.h b/hal/src/main/native/include/HAL/SerialPort.h index fa7b2c927f..7bc5ee5d25 100644 --- a/hal/src/main/native/include/HAL/SerialPort.h +++ b/hal/src/main/native/include/HAL/SerialPort.h @@ -21,6 +21,8 @@ extern "C" { #endif void HAL_InitializeSerialPort(HAL_SerialPort port, int32_t* status); +void HAL_InitializeSerialPortDirect(HAL_SerialPort port, const char* portName, + int32_t* status); void HAL_SetSerialBaudRate(HAL_SerialPort port, int32_t baud, int32_t* status); void HAL_SetSerialDataBits(HAL_SerialPort port, int32_t bits, int32_t* status); void HAL_SetSerialParity(HAL_SerialPort port, int32_t parity, int32_t* status); diff --git a/hal/src/main/native/sim/SerialPort.cpp b/hal/src/main/native/sim/SerialPort.cpp index b44157a6ed..efdc5be565 100644 --- a/hal/src/main/native/sim/SerialPort.cpp +++ b/hal/src/main/native/sim/SerialPort.cpp @@ -16,6 +16,9 @@ void InitializeSerialPort() {} extern "C" { void HAL_InitializeSerialPort(HAL_SerialPort port, int32_t* status) {} +void HAL_InitializeSerialPortDirect(HAL_SerialPort port, const char* portName, + int32_t* status) {} + void HAL_SetSerialBaudRate(HAL_SerialPort port, int32_t baud, int32_t* status) { } diff --git a/wpilibc/src/main/native/cpp/SerialPort.cpp b/wpilibc/src/main/native/cpp/SerialPort.cpp index 70262dbdb5..979004069f 100644 --- a/wpilibc/src/main/native/cpp/SerialPort.cpp +++ b/wpilibc/src/main/native/cpp/SerialPort.cpp @@ -61,6 +61,57 @@ SerialPort::SerialPort(int baudRate, Port port, int dataBits, HAL_Report(HALUsageReporting::kResourceType_SerialPort, 0); } +/** + * Create an instance of a Serial Port class. + * + * @param baudRate The baud rate to configure the serial port. + * @param port The physical port to use + * @param portName The direct port name to use + * @param dataBits The number of data bits per transfer. Valid values are + * between 5 and 8 bits. + * @param parity Select the type of parity checking to use. + * @param stopBits The number of stop bits to use as defined by the enum + * StopBits. + */ +SerialPort::SerialPort(int baudRate, llvm::StringRef portName, Port port, + int dataBits, SerialPort::Parity parity, + SerialPort::StopBits stopBits) { + int32_t status = 0; + + m_port = port; + + llvm::SmallVector buf; + const char* portNameC = portName.c_str(buf); + + HAL_InitializeSerialPortDirect(static_cast(port), portNameC, + &status); + wpi_setErrorWithContext(status, HAL_GetErrorMessage(status)); + // Don't continue if initialization failed + if (status < 0) return; + HAL_SetSerialBaudRate(static_cast(port), baudRate, &status); + wpi_setErrorWithContext(status, HAL_GetErrorMessage(status)); + HAL_SetSerialDataBits(static_cast(port), dataBits, &status); + wpi_setErrorWithContext(status, HAL_GetErrorMessage(status)); + HAL_SetSerialParity(static_cast(port), parity, &status); + wpi_setErrorWithContext(status, HAL_GetErrorMessage(status)); + HAL_SetSerialStopBits(static_cast(port), stopBits, &status); + wpi_setErrorWithContext(status, HAL_GetErrorMessage(status)); + + // Set the default timeout to 5 seconds. + SetTimeout(5.0); + + // Don't wait until the buffer is full to transmit. + SetWriteBufferMode(kFlushOnAccess); + + EnableTermination(); + + // viInstallHandler(m_portHandle, VI_EVENT_IO_COMPLETION, ioCompleteHandler, + // this); + // viEnableEvent(m_portHandle, VI_EVENT_IO_COMPLETION, VI_HNDLR, VI_NULL); + + HAL_Report(HALUsageReporting::kResourceType_SerialPort, 0); +} + /** * Destructor. */ diff --git a/wpilibc/src/main/native/include/SerialPort.h b/wpilibc/src/main/native/include/SerialPort.h index cfc0fe474a..0d43115d6a 100644 --- a/wpilibc/src/main/native/include/SerialPort.h +++ b/wpilibc/src/main/native/include/SerialPort.h @@ -10,6 +10,7 @@ #include #include +#include #include "ErrorBase.h" @@ -56,6 +57,10 @@ class SerialPort : public ErrorBase { SerialPort(int baudRate, Port port = kOnboard, int dataBits = 8, Parity parity = kParity_None, StopBits stopBits = kStopBits_One); + WPI_DEPRECATED("Will be removed for 2019") + SerialPort(int baudRate, llvm::StringRef portName, Port port = kOnboard, + int dataBits = 8, Parity parity = kParity_None, + StopBits stopBits = kStopBits_One); ~SerialPort(); SerialPort(const SerialPort&) = delete; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/SerialPort.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/SerialPort.java index 57cd2f2258..fabff3f474 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/SerialPort.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/SerialPort.java @@ -94,6 +94,42 @@ public class SerialPort { } } + /** + * Create an instance of a Serial Port class. + * + * @param baudRate The baud rate to configure the serial port. + * @param port The Serial port to use + * @param portName The direct portName to use + * @param dataBits The number of data bits per transfer. Valid values are between 5 and 8 bits. + * @param parity Select the type of parity checking to use. + * @param stopBits The number of stop bits to use as defined by the enum StopBits. + * @deprecated Will be removed for 2019 + */ + @Deprecated + public SerialPort(final int baudRate, String portName, Port port, final int dataBits, + Parity parity, StopBits stopBits) { + m_port = (byte) port.value; + + SerialPortJNI.serialInitializePortDirect(m_port, portName); + SerialPortJNI.serialSetBaudRate(m_port, baudRate); + SerialPortJNI.serialSetDataBits(m_port, (byte) dataBits); + SerialPortJNI.serialSetParity(m_port, (byte) parity.value); + SerialPortJNI.serialSetStopBits(m_port, (byte) stopBits.value); + + // Set the default read buffer size to 1 to return bytes immediately + setReadBufferSize(1); + + // Set the default timeout to 5 seconds. + setTimeout(5.0); + + // Don't wait until the buffer is full to transmit. + setWriteBufferMode(WriteBufferMode.kFlushOnAccess); + + disableTermination(); + + HAL.report(tResourceType.kResourceType_SerialPort, 0); + } + /** * Create an instance of a Serial Port class. * diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/hal/SerialPortJNI.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/hal/SerialPortJNI.java index f626dc05f3..7d9c6d5f05 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/hal/SerialPortJNI.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/hal/SerialPortJNI.java @@ -10,6 +10,8 @@ package edu.wpi.first.wpilibj.hal; public class SerialPortJNI extends JNIWrapper { public static native void serialInitializePort(byte port); + public static native void serialInitializePortDirect(byte port, String portName); + public static native void serialSetBaudRate(byte port, int baud); public static native void serialSetDataBits(byte port, byte bits); diff --git a/wpilibj/src/main/native/cpp/SerialPortJNI.cpp b/wpilibj/src/main/native/cpp/SerialPortJNI.cpp index 2d72505769..5634b0ed91 100644 --- a/wpilibj/src/main/native/cpp/SerialPortJNI.cpp +++ b/wpilibj/src/main/native/cpp/SerialPortJNI.cpp @@ -45,6 +45,25 @@ Java_edu_wpi_first_wpilibj_hal_SerialPortJNI_serialInitializePort( CheckStatusForceThrow(env, status); } +/* + * Class: edu_wpi_first_wpilibj_hal_SerialPortJNI + * Method: serialInitializePortDirect + * Signature: (BLjava/lang/String;)V + */ +JNIEXPORT void JNICALL +Java_edu_wpi_first_wpilibj_hal_SerialPortJNI_serialInitializePortDirect( + JNIEnv* env, jclass, jbyte port, jstring portName) { + SERIALJNI_LOG(logDEBUG) << "Calling Serial Initialize Direct"; + SERIALJNI_LOG(logDEBUG) << "Port = " << (jint)port; + JStringRef portNameRef{env, portName}; + SERIALJNI_LOG(logDEBUG) << "PortName = " << portNameRef.c_str(); + int32_t status = 0; + HAL_InitializeSerialPortDirect(static_cast(port), + portNameRef.c_str(), &status); + SERIALJNI_LOG(logDEBUG) << "Status = " << status; + CheckStatusForceThrow(env, status); +} + /* * Class: edu_wpi_first_wpilibj_hal_SerialPortJNI * Method: serialSetBaudRate @@ -247,7 +266,7 @@ JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_hal_SerialPortJNI_serialRead( llvm::SmallVector recvBuf; recvBuf.resize(size); int32_t status = 0; - jint retVal = HAL_ReadSerial(static_cast(port), recvBuf.data(), + jint retVal = HAL_ReadSerial(static_cast(port), recvBuf.data(), size, &status); env->SetByteArrayRegion(dataReceived, 0, size, reinterpret_cast(recvBuf.data()));