Commit 6af9a170 authored by dogmaphobic's avatar dogmaphobic

More Android work...

parent db135056
...@@ -60,6 +60,7 @@ public class UsbDeviceJNI extends QtActivity ...@@ -60,6 +60,7 @@ public class UsbDeviceJNI extends QtActivity
// USED TO DETECT WHEN A DEVICE HAS BEEN UNPLUGGED // USED TO DETECT WHEN A DEVICE HAS BEEN UNPLUGGED
private BroadcastReceiver m_UsbReceiver = null; private BroadcastReceiver m_UsbReceiver = null;
private final static ExecutorService m_Executor = Executors.newSingleThreadExecutor(); private final static ExecutorService m_Executor = Executors.newSingleThreadExecutor();
private static final String TAG = "QGC_UsbDeviceJNI";
private final static UsbIoManager.Listener m_Listener = private final static UsbIoManager.Listener m_Listener =
new UsbIoManager.Listener() new UsbIoManager.Listener()
...@@ -67,6 +68,7 @@ public class UsbDeviceJNI extends QtActivity ...@@ -67,6 +68,7 @@ public class UsbDeviceJNI extends QtActivity
@Override @Override
public void onRunError(Exception eA, int userDataA) public void onRunError(Exception eA, int userDataA)
{ {
Log.e(TAG, "onRunError Exception");
nativeDeviceException(userDataA, eA.getMessage()); nativeDeviceException(userDataA, eA.getMessage());
} }
...@@ -77,7 +79,6 @@ public class UsbDeviceJNI extends QtActivity ...@@ -77,7 +79,6 @@ public class UsbDeviceJNI extends QtActivity
} }
}; };
private static final String TAG = "QGC_UsbDeviceJNI";
// NATIVE C++ FUNCTION THAT WILL BE CALLED IF THE DEVICE IS UNPLUGGED // NATIVE C++ FUNCTION THAT WILL BE CALLED IF THE DEVICE IS UNPLUGGED
private static native void nativeDeviceHasDisconnected(int userDataA); private static native void nativeDeviceHasDisconnected(int userDataA);
...@@ -120,7 +121,6 @@ public class UsbDeviceJNI extends QtActivity ...@@ -120,7 +121,6 @@ public class UsbDeviceJNI extends QtActivity
return true; return true;
} }
///////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// List all available devices that are not already open. It returns the serial port info // List all available devices that are not already open. It returns the serial port info
......
...@@ -54,8 +54,8 @@ QT_BEGIN_NAMESPACE ...@@ -54,8 +54,8 @@ QT_BEGIN_NAMESPACE
#define BAD_PORT 0 #define BAD_PORT 0
static const char V_jniClassName[] {"org/qgroundcontrol/qgchelper/UsbDeviceJNI"}; static const char kJniClassName[] {"org/qgroundcontrol/qgchelper/UsbDeviceJNI"};
static const char V_TAG[] {"QGC_QSerialPort"}; static const char kJTag[] {"QGC_QSerialPort"};
static void jniDeviceHasDisconnected(JNIEnv *envA, jobject thizA, jint userDataA) static void jniDeviceHasDisconnected(JNIEnv *envA, jobject thizA, jint userDataA)
{ {
...@@ -91,6 +91,15 @@ static void jniDeviceException(JNIEnv *envA, jobject thizA, jint userDataA, jstr ...@@ -91,6 +91,15 @@ static void jniDeviceException(JNIEnv *envA, jobject thizA, jint userDataA, jstr
} }
} }
void cleanJavaException()
{
QAndroidJniEnvironment env;
if (env->ExceptionCheck()) {
env->ExceptionDescribe();
env->ExceptionClear();
}
}
QSerialPortPrivate::QSerialPortPrivate(QSerialPort *q) QSerialPortPrivate::QSerialPortPrivate(QSerialPort *q)
: QSerialPortPrivateData(q) : QSerialPortPrivateData(q)
, descriptor(-1) , descriptor(-1)
...@@ -109,57 +118,75 @@ QSerialPortPrivate::QSerialPortPrivate(QSerialPort *q) ...@@ -109,57 +118,75 @@ QSerialPortPrivate::QSerialPortPrivate(QSerialPort *q)
bool QSerialPortPrivate::open(QIODevice::OpenMode mode) bool QSerialPortPrivate::open(QIODevice::OpenMode mode)
{ {
rwMode = mode; rwMode = mode;
__android_log_print(ANDROID_LOG_INFO, V_TAG, "Opening %s", systemLocation.toLatin1().data()); __android_log_print(ANDROID_LOG_INFO, kJTag, "Opening %s", systemLocation.toLatin1().data());
__android_log_print(ANDROID_LOG_INFO, kJTag, "Calling Java Open");
QAndroidJniObject jnameL = QAndroidJniObject::fromString(systemLocation);
cleanJavaException();
deviceId = QAndroidJniObject::callStaticMethod<jint>(
kJniClassName,
"open",
"(Ljava/lang/String;I)I",
jnameL.object<jstring>(),
(jint)this);
cleanJavaException();
isReadStopped = false;
if (deviceId == BAD_PORT)
{
__android_log_print(ANDROID_LOG_ERROR, kJTag, "Error opening %s", systemLocation.toLatin1().data());
q_ptr->setError(QSerialPort::DeviceNotFoundError);
return false;
}
if (!hasRegisteredFunctions) if (!hasRegisteredFunctions)
{ {
__android_log_print(ANDROID_LOG_INFO, kJTag, "Registering Native Functions");
// REGISTER THE C++ FUNCTION WITH JNI // REGISTER THE C++ FUNCTION WITH JNI
QAndroidJniEnvironment envL; JNINativeMethod javaMethods[] {
JNINativeMethod methodsL[] {
{"nativeDeviceHasDisconnected", "(I)V", reinterpret_cast<void *>(jniDeviceHasDisconnected)}, {"nativeDeviceHasDisconnected", "(I)V", reinterpret_cast<void *>(jniDeviceHasDisconnected)},
{"nativeDeviceNewData", "(I[B)V", reinterpret_cast<void *>(jniDeviceNewData)}, {"nativeDeviceNewData", "(I[B)V", reinterpret_cast<void *>(jniDeviceNewData)},
{"nativeDeviceException", "(ILjava/lang/String;)V", reinterpret_cast<void *>(jniDeviceException)} {"nativeDeviceException", "(ILjava/lang/String;)V", reinterpret_cast<void *>(jniDeviceException)}
}; };
QAndroidJniObject javaClassL(V_jniClassName); QAndroidJniEnvironment jniEnv;
jclass objectClassL = envL->GetObjectClass(javaClassL.object<jobject>()); if (jniEnv->ExceptionCheck()) {
jint valL = envL->RegisterNatives(objectClassL, methodsL, sizeof(methodsL) / sizeof(JNINativeMethod)); jniEnv->ExceptionDescribe();
envL->DeleteLocalRef(objectClassL); jniEnv->ExceptionClear();
hasRegisteredFunctions = true; }
if (envL->ExceptionCheck())
envL->ExceptionClear();
if(valL < 0) { QAndroidJniObject javaClass(kJniClassName);
__android_log_print(ANDROID_LOG_ERROR, V_TAG, "Error registering methods"); if(!javaClass.isValid()) {
q_ptr->setError(QSerialPort::OpenError); __android_log_print(ANDROID_LOG_ERROR, kJTag, "Java class %s not valid", kJniClassName);
return false; return false;
} }
} jclass objectClass = jniEnv->GetObjectClass(javaClass.object<jobject>());
jint val = jniEnv->RegisterNatives(objectClass, javaMethods, sizeof(javaMethods) / sizeof(javaMethods[0]));
QAndroidJniObject jnameL = QAndroidJniObject::fromString(systemLocation); jniEnv->DeleteLocalRef(objectClass);
deviceId = QAndroidJniObject::callStaticMethod<jint>( hasRegisteredFunctions = true;
V_jniClassName, __android_log_print(ANDROID_LOG_INFO, kJTag, "Native Functions Registered");
"open",
"(Ljava/lang/String;I)I",
jnameL.object<jstring>(),
(jint)this);
isReadStopped = false; if (jniEnv->ExceptionCheck()) {
jniEnv->ExceptionDescribe();
jniEnv->ExceptionClear();
}
if (deviceId == BAD_PORT) if(val < 0) {
{ __android_log_print(ANDROID_LOG_ERROR, kJTag, "Error registering methods");
__android_log_print(ANDROID_LOG_ERROR, V_TAG, "Error opening %s", systemLocation.toLatin1().data()); q_ptr->setError(QSerialPort::OpenError);
q_ptr->setError(QSerialPort::DeviceNotFoundError);
return false; return false;
} }
}
__android_log_print(ANDROID_LOG_INFO, kJTag, "Calling Java getDeviceHandle");
cleanJavaException();
descriptor = QAndroidJniObject::callStaticMethod<jint>( descriptor = QAndroidJniObject::callStaticMethod<jint>(
V_jniClassName, kJniClassName,
"getDeviceHandle", "getDeviceHandle",
"(I)I", "(I)I",
deviceId); deviceId);
cleanJavaException();
if (rwMode == QIODevice::WriteOnly) if (rwMode == QIODevice::WriteOnly)
stopReadThread(); stopReadThread();
...@@ -172,12 +199,14 @@ void QSerialPortPrivate::close() ...@@ -172,12 +199,14 @@ void QSerialPortPrivate::close()
if (deviceId == BAD_PORT) if (deviceId == BAD_PORT)
return; return;
__android_log_print(ANDROID_LOG_INFO, V_TAG, "Closing %s", systemLocation.toLatin1().data()); __android_log_print(ANDROID_LOG_INFO, kJTag, "Closing %s", systemLocation.toLatin1().data());
cleanJavaException();
jboolean resultL = QAndroidJniObject::callStaticMethod<jboolean>( jboolean resultL = QAndroidJniObject::callStaticMethod<jboolean>(
V_jniClassName, kJniClassName,
"close", "close",
"(I)Z", "(I)Z",
deviceId); deviceId);
cleanJavaException();
descriptor = -1; descriptor = -1;
isCustomBaudRateSupported = false; isCustomBaudRateSupported = false;
...@@ -196,7 +225,9 @@ bool QSerialPortPrivate::setParameters(int baudRateA, int dataBitsA, int stopBit ...@@ -196,7 +225,9 @@ bool QSerialPortPrivate::setParameters(int baudRateA, int dataBitsA, int stopBit
return false; return false;
} }
jboolean resultL = QAndroidJniObject::callStaticMethod<jboolean>(V_jniClassName, cleanJavaException();
jboolean resultL = QAndroidJniObject::callStaticMethod<jboolean>(
kJniClassName,
"setParameters", "setParameters",
"(IIIII)Z", "(IIIII)Z",
deviceId, deviceId,
...@@ -204,6 +235,7 @@ bool QSerialPortPrivate::setParameters(int baudRateA, int dataBitsA, int stopBit ...@@ -204,6 +235,7 @@ bool QSerialPortPrivate::setParameters(int baudRateA, int dataBitsA, int stopBit
dataBitsA, dataBitsA,
stopBitsA, stopBitsA,
parityA); parityA);
cleanJavaException();
if(resultL) if(resultL)
{ {
...@@ -223,11 +255,13 @@ void QSerialPortPrivate::stopReadThread() ...@@ -223,11 +255,13 @@ void QSerialPortPrivate::stopReadThread()
{ {
if (isReadStopped) if (isReadStopped)
return; return;
cleanJavaException();
QAndroidJniObject::callStaticMethod<void>(V_jniClassName, QAndroidJniObject::callStaticMethod<void>(
kJniClassName,
"stopIoManager", "stopIoManager",
"(I)V", "(I)V",
deviceId); deviceId);
cleanJavaException();
isReadStopped = true; isReadStopped = true;
} }
...@@ -237,26 +271,21 @@ void QSerialPortPrivate::startReadThread() ...@@ -237,26 +271,21 @@ void QSerialPortPrivate::startReadThread()
{ {
if (!isReadStopped) if (!isReadStopped)
return; return;
cleanJavaException();
QAndroidJniObject::callStaticMethod<void>(V_jniClassName, QAndroidJniObject::callStaticMethod<void>(
kJniClassName,
"startIoManager", "startIoManager",
"(I)V", "(I)V",
deviceId); deviceId);
cleanJavaException();
isReadStopped = false; isReadStopped = false;
} }
QSerialPort::PinoutSignals QSerialPortPrivate::pinoutSignals() QSerialPort::PinoutSignals QSerialPortPrivate::pinoutSignals()
{ {
return QSerialPort::NoSignal; return QSerialPort::NoSignal;
} }
bool QSerialPortPrivate::setDataTerminalReady(bool set) bool QSerialPortPrivate::setDataTerminalReady(bool set)
{ {
if (deviceId == BAD_PORT) if (deviceId == BAD_PORT)
...@@ -264,17 +293,17 @@ bool QSerialPortPrivate::setDataTerminalReady(bool set) ...@@ -264,17 +293,17 @@ bool QSerialPortPrivate::setDataTerminalReady(bool set)
q_ptr->setError(QSerialPort::NotOpenError); q_ptr->setError(QSerialPort::NotOpenError);
return false; return false;
} }
cleanJavaException();
return QAndroidJniObject::callStaticMethod<jboolean>(V_jniClassName, bool res = QAndroidJniObject::callStaticMethod<jboolean>(
kJniClassName,
"setDataTerminalReady", "setDataTerminalReady",
"(IZ)Z", "(IZ)Z",
deviceId, deviceId,
set); set);
cleanJavaException();
return res;
} }
bool QSerialPortPrivate::setRequestToSend(bool set) bool QSerialPortPrivate::setRequestToSend(bool set)
{ {
if (deviceId == BAD_PORT) if (deviceId == BAD_PORT)
...@@ -282,25 +311,22 @@ bool QSerialPortPrivate::setRequestToSend(bool set) ...@@ -282,25 +311,22 @@ bool QSerialPortPrivate::setRequestToSend(bool set)
q_ptr->setError(QSerialPort::NotOpenError); q_ptr->setError(QSerialPort::NotOpenError);
return false; return false;
} }
cleanJavaException();
return QAndroidJniObject::callStaticMethod<jboolean>(V_jniClassName, bool res = QAndroidJniObject::callStaticMethod<jboolean>(
kJniClassName,
"setRequestToSend", "setRequestToSend",
"(IZ)Z", "(IZ)Z",
deviceId, deviceId,
set); set);
cleanJavaException();
return res;
} }
bool QSerialPortPrivate::flush() bool QSerialPortPrivate::flush()
{ {
return writeDataOneShot(); return writeDataOneShot();
} }
bool QSerialPortPrivate::clear(QSerialPort::Directions directions) bool QSerialPortPrivate::clear(QSerialPort::Directions directions)
{ {
if (deviceId == BAD_PORT) if (deviceId == BAD_PORT)
...@@ -323,16 +349,18 @@ bool QSerialPortPrivate::clear(QSerialPort::Directions directions) ...@@ -323,16 +349,18 @@ bool QSerialPortPrivate::clear(QSerialPort::Directions directions)
outputL = true; outputL = true;
} }
return QAndroidJniObject::callStaticMethod<jboolean>(V_jniClassName, cleanJavaException();
bool res = QAndroidJniObject::callStaticMethod<jboolean>(
kJniClassName,
"purgeBuffers", "purgeBuffers",
"(IZZ)Z", "(IZZ)Z",
deviceId, deviceId,
inputL, inputL,
outputL); outputL);
}
cleanJavaException();
return res;
}
bool QSerialPortPrivate::sendBreak(int duration) bool QSerialPortPrivate::sendBreak(int duration)
{ {
...@@ -340,26 +368,17 @@ bool QSerialPortPrivate::sendBreak(int duration) ...@@ -340,26 +368,17 @@ bool QSerialPortPrivate::sendBreak(int duration)
return true; return true;
} }
bool QSerialPortPrivate::setBreakEnabled(bool set) bool QSerialPortPrivate::setBreakEnabled(bool set)
{ {
Q_UNUSED(set); Q_UNUSED(set);
return true; return true;
} }
void QSerialPortPrivate::startWriting() void QSerialPortPrivate::startWriting()
{ {
writeDataOneShot(); writeDataOneShot();
} }
bool QSerialPortPrivate::waitForReadyRead(int msecs) bool QSerialPortPrivate::waitForReadyRead(int msecs)
{ {
int origL = readBuffer.size(); int origL = readBuffer.size();
...@@ -378,41 +397,26 @@ bool QSerialPortPrivate::waitForReadyRead(int msecs) ...@@ -378,41 +397,26 @@ bool QSerialPortPrivate::waitForReadyRead(int msecs)
return false; return false;
} }
bool QSerialPortPrivate::waitForBytesWritten(int msecs) bool QSerialPortPrivate::waitForBytesWritten(int msecs)
{ {
internalWriteTimeoutMsec = msecs; internalWriteTimeoutMsec = msecs;
bool retL = writeDataOneShot(); bool retL = writeDataOneShot();
internalWriteTimeoutMsec = 0; internalWriteTimeoutMsec = 0;
return retL; return retL;
} }
bool QSerialPortPrivate::setBaudRate() bool QSerialPortPrivate::setBaudRate()
{ {
setBaudRate(inputBaudRate, QSerialPort::AllDirections); setBaudRate(inputBaudRate, QSerialPort::AllDirections);
return true; return true;
} }
bool QSerialPortPrivate::setBaudRate(qint32 baudRate, QSerialPort::Directions directions) bool QSerialPortPrivate::setBaudRate(qint32 baudRate, QSerialPort::Directions directions)
{ {
Q_UNUSED(directions); Q_UNUSED(directions);
return setParameters(baudRate, jniDataBits, jniStopBits, jniParity); return setParameters(baudRate, jniDataBits, jniStopBits, jniParity);
} }
bool QSerialPortPrivate::setDataBits(QSerialPort::DataBits dataBits) bool QSerialPortPrivate::setDataBits(QSerialPort::DataBits dataBits)
{ {
int numBitsL = 8; int numBitsL = 8;
...@@ -436,17 +440,12 @@ bool QSerialPortPrivate::setDataBits(QSerialPort::DataBits dataBits) ...@@ -436,17 +440,12 @@ bool QSerialPortPrivate::setDataBits(QSerialPort::DataBits dataBits)
numBitsL = 8; numBitsL = 8;
break; break;
} }
return setParameters(inputBaudRate, numBitsL, jniStopBits, jniParity); return setParameters(inputBaudRate, numBitsL, jniStopBits, jniParity);
} }
bool QSerialPortPrivate::setParity(QSerialPort::Parity parity) bool QSerialPortPrivate::setParity(QSerialPort::Parity parity)
{ {
int parL = 0; int parL = 0;
switch (parity) switch (parity)
{ {
case QSerialPort::SpaceParity: case QSerialPort::SpaceParity:
...@@ -470,17 +469,12 @@ bool QSerialPortPrivate::setParity(QSerialPort::Parity parity) ...@@ -470,17 +469,12 @@ bool QSerialPortPrivate::setParity(QSerialPort::Parity parity)
parL = 0; parL = 0;
break; break;
} }
return setParameters(inputBaudRate, jniDataBits, jniStopBits, parL); return setParameters(inputBaudRate, jniDataBits, jniStopBits, parL);
} }
bool QSerialPortPrivate::setStopBits(QSerialPort::StopBits stopBits) bool QSerialPortPrivate::setStopBits(QSerialPort::StopBits stopBits)
{ {
int stopL = 1; int stopL = 1;
switch (stopBits) switch (stopBits)
{ {
case QSerialPort::TwoStop: case QSerialPort::TwoStop:
...@@ -496,29 +490,21 @@ bool QSerialPortPrivate::setStopBits(QSerialPort::StopBits stopBits) ...@@ -496,29 +490,21 @@ bool QSerialPortPrivate::setStopBits(QSerialPort::StopBits stopBits)
stopL = 1; stopL = 1;
break; break;
} }
return setParameters(inputBaudRate, jniDataBits, stopL, jniParity); return setParameters(inputBaudRate, jniDataBits, stopL, jniParity);
} }
bool QSerialPortPrivate::setFlowControl(QSerialPort::FlowControl flowControl) bool QSerialPortPrivate::setFlowControl(QSerialPort::FlowControl flowControl)
{ {
Q_UNUSED(flowControl); Q_UNUSED(flowControl);
return true; return true;
} }
bool QSerialPortPrivate::setDataErrorPolicy(QSerialPort::DataErrorPolicy policy) bool QSerialPortPrivate::setDataErrorPolicy(QSerialPort::DataErrorPolicy policy)
{ {
this->policy = policy; this->policy = policy;
return true; return true;
} }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void QSerialPortPrivate::newDataArrived(char *bytesA, int lengthA) void QSerialPortPrivate::newDataArrived(char *bytesA, int lengthA)
{ {
...@@ -550,8 +536,6 @@ void QSerialPortPrivate::exceptionArrived(QString strA) ...@@ -550,8 +536,6 @@ void QSerialPortPrivate::exceptionArrived(QString strA)
q_ptr->setErrorString(strA); q_ptr->setErrorString(strA);
} }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool QSerialPortPrivate::writeDataOneShot() bool QSerialPortPrivate::writeDataOneShot()
{ {
...@@ -580,8 +564,6 @@ bool QSerialPortPrivate::writeDataOneShot() ...@@ -580,8 +564,6 @@ bool QSerialPortPrivate::writeDataOneShot()
return (pendingBytesWritten < 0)? false: true; return (pendingBytesWritten < 0)? false: true;
} }
QSerialPort::SerialPortError QSerialPortPrivate::decodeSystemError() const QSerialPort::SerialPortError QSerialPortPrivate::decodeSystemError() const
{ {
QSerialPort::SerialPortError error; QSerialPort::SerialPortError error;
...@@ -611,8 +593,6 @@ QSerialPort::SerialPortError QSerialPortPrivate::decodeSystemError() const ...@@ -611,8 +593,6 @@ QSerialPort::SerialPortError QSerialPortPrivate::decodeSystemError() const
return error; return error;
} }
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
qint64 QSerialPortPrivate::writeToPort(const char *data, qint64 maxSize) qint64 QSerialPortPrivate::writeToPort(const char *data, qint64 maxSize)
{ {
...@@ -622,32 +602,30 @@ qint64 QSerialPortPrivate::writeToPort(const char *data, qint64 maxSize) ...@@ -622,32 +602,30 @@ qint64 QSerialPortPrivate::writeToPort(const char *data, qint64 maxSize)
return 0; return 0;
} }
QAndroidJniEnvironment envL; QAndroidJniEnvironment jniEnv;
jbyteArray jarrayL = envL->NewByteArray(maxSize); jbyteArray jarrayL = jniEnv->NewByteArray(maxSize);
envL->SetByteArrayRegion(jarrayL, 0, maxSize, (jbyte *)data); jniEnv->SetByteArrayRegion(jarrayL, 0, maxSize, (jbyte *)data);
int resultL = QAndroidJniObject::callStaticMethod<jint>(V_jniClassName, if (jniEnv->ExceptionCheck())
jniEnv->ExceptionClear();
int resultL = QAndroidJniObject::callStaticMethod<jint>(
kJniClassName,
"write", "write",
"(I[BI)I", "(I[BI)I",
deviceId, deviceId,
jarrayL, jarrayL,
internalWriteTimeoutMsec); internalWriteTimeoutMsec);
if (envL->ExceptionCheck()) if (jniEnv->ExceptionCheck())
{ {
envL->ExceptionClear(); jniEnv->ExceptionClear();
q_ptr->setErrorString(QStringLiteral("Writing to the device threw an exception")); q_ptr->setErrorString(QStringLiteral("Writing to the device threw an exception"));
envL->DeleteLocalRef(jarrayL); jniEnv->DeleteLocalRef(jarrayL);
return 0; return 0;
} }
jniEnv->DeleteLocalRef(jarrayL);
envL->DeleteLocalRef(jarrayL);
return resultL; return resultL;
} }
static inline bool evenParity(quint8 c) static inline bool evenParity(quint8 c)
{ {
c ^= c >> 4; //(c7 ^ c3)(c6 ^ c2)(c5 ^ c1)(c4 ^ c0) c ^= c >> 4; //(c7 ^ c3)(c6 ^ c2)(c5 ^ c1)(c4 ^ c0)
...@@ -803,42 +781,27 @@ static const BaudRateMap createStandardBaudRateMap() ...@@ -803,42 +781,27 @@ static const BaudRateMap createStandardBaudRateMap()
return baudRateMap; return baudRateMap;
} }
static const BaudRateMap& standardBaudRateMap() static const BaudRateMap& standardBaudRateMap()
{ {
static const BaudRateMap baudRateMap = createStandardBaudRateMap(); static const BaudRateMap baudRateMap = createStandardBaudRateMap();
return baudRateMap; return baudRateMap;
} }
qint32 QSerialPortPrivate::baudRateFromSetting(qint32 setting) qint32 QSerialPortPrivate::baudRateFromSetting(qint32 setting)
{ {
return standardBaudRateMap().key(setting); return standardBaudRateMap().key(setting);
} }
qint32 QSerialPortPrivate::settingFromBaudRate(qint32 baudRate) qint32 QSerialPortPrivate::settingFromBaudRate(qint32 baudRate)
{ {
return standardBaudRateMap().value(baudRate); return standardBaudRateMap().value(baudRate);
} }
QList<qint32> QSerialPortPrivate::standardBaudRates() QList<qint32> QSerialPortPrivate::standardBaudRates()
{ {
return standardBaudRateMap().keys(); return standardBaudRateMap().keys();
} }
QSerialPort::Handle QSerialPort::handle() const QSerialPort::Handle QSerialPort::handle() const
{ {
Q_D(const QSerialPort); Q_D(const QSerialPort);
......
...@@ -48,6 +48,8 @@ QT_BEGIN_NAMESPACE ...@@ -48,6 +48,8 @@ QT_BEGIN_NAMESPACE
static const char V_jniClassName[] {"org/qgroundcontrol/qgchelper/UsbDeviceJNI"}; static const char V_jniClassName[] {"org/qgroundcontrol/qgchelper/UsbDeviceJNI"};
static const char V_TAG[] {"QGC_QSerialPortInfo"}; static const char V_TAG[] {"QGC_QSerialPortInfo"};
extern void cleanJavaException();
QList<QSerialPortInfo> availablePortsByFiltersOfDevices(bool &ok) QList<QSerialPortInfo> availablePortsByFiltersOfDevices(bool &ok)
{ {
QList<QSerialPortInfo> serialPortInfoList; QList<QSerialPortInfo> serialPortInfoList;
...@@ -117,22 +119,26 @@ QList<qint32> QSerialPortInfo::standardBaudRates() ...@@ -117,22 +119,26 @@ QList<qint32> QSerialPortInfo::standardBaudRates()
bool QSerialPortInfo::isBusy() const bool QSerialPortInfo::isBusy() const
{ {
QAndroidJniObject jstrL = QAndroidJniObject::fromString(d_ptr->portName); QAndroidJniObject jstrL = QAndroidJniObject::fromString(d_ptr->portName);
cleanJavaException();
jboolean resultL = QAndroidJniObject::callStaticMethod<jboolean>( jboolean resultL = QAndroidJniObject::callStaticMethod<jboolean>(
V_jniClassName, V_jniClassName,
"isDeviceNameOpen", "isDeviceNameOpen",
"(Ljava/lang/String;)Z", "(Ljava/lang/String;)Z",
jstrL.object<jstring>()); jstrL.object<jstring>());
cleanJavaException();
return resultL; return resultL;
} }
bool QSerialPortInfo::isValid() const bool QSerialPortInfo::isValid() const
{ {
QAndroidJniObject jstrL = QAndroidJniObject::fromString(d_ptr->portName); QAndroidJniObject jstrL = QAndroidJniObject::fromString(d_ptr->portName);
cleanJavaException();
jboolean resultL = QAndroidJniObject::callStaticMethod<jboolean>( jboolean resultL = QAndroidJniObject::callStaticMethod<jboolean>(
V_jniClassName, V_jniClassName,
"isDeviceNameValid", "isDeviceNameValid",
"(Ljava/lang/String;)Z", "(Ljava/lang/String;)Z",
jstrL.object<jstring>()); jstrL.object<jstring>());
cleanJavaException();
return resultL; return resultL;
} }
......
...@@ -104,7 +104,9 @@ QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting) : ...@@ -104,7 +104,9 @@ QGCApplication::QGCApplication(int &argc, char* argv[], bool unitTesting) :
_app = this; _app = this;
// This prevents usage of QQuickWidget to fail since it doesn't support native widget siblings // This prevents usage of QQuickWidget to fail since it doesn't support native widget siblings
#ifndef __android__
setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
#endif
#ifdef QT_DEBUG #ifdef QT_DEBUG
// First thing we want to do is set up the qtlogging.ini file. If it doesn't already exist we copy // First thing we want to do is set up the qtlogging.ini file. If it doesn't already exist we copy
......
...@@ -217,10 +217,10 @@ void QGCFileDialog::_validate(Options& options) ...@@ -217,10 +217,10 @@ void QGCFileDialog::_validate(Options& options)
Q_ASSERT(qgcApp()); Q_ASSERT(qgcApp());
Q_ASSERT_X(QThread::currentThread() == qgcApp()->thread(), "Threading issue", "QGCFileDialog can only be called from main thread"); Q_ASSERT_X(QThread::currentThread() == qgcApp()->thread(), "Threading issue", "QGCFileDialog can only be called from main thread");
#ifndef __android__
// On OSX native dialog can hang so we always use Qt dialogs // On OSX native dialog can hang so we always use Qt dialogs
options |= DontUseNativeDialog; options |= DontUseNativeDialog;
#endif
if (MainWindow::instance()) { if (MainWindow::instance()) {
MainWindow::instance()->hideSplashScreen(); MainWindow::instance()->hideSplashScreen();
} }
......
...@@ -183,8 +183,10 @@ MainWindow::MainWindow(QSplashScreen* splashScreen) ...@@ -183,8 +183,10 @@ MainWindow::MainWindow(QSplashScreen* splashScreen)
// Qt 4 on Ubuntu does place the native menubar correctly so on Linux we revert back to in-window menu bar. // Qt 4 on Ubuntu does place the native menubar correctly so on Linux we revert back to in-window menu bar.
// TODO: Check that this is still necessary on Qt5 on Ubuntu // TODO: Check that this is still necessary on Qt5 on Ubuntu
#ifdef Q_OS_LINUX #ifdef Q_OS_LINUX
#ifndef __android__
menuBar()->setNativeMenuBar(false); menuBar()->setNativeMenuBar(false);
#endif #endif
#endif
#ifdef UNITTEST_BUILD #ifdef UNITTEST_BUILD
QAction* qmlTestAction = new QAction("Test QML palette and controls", NULL); QAction* qmlTestAction = new QAction("Test QML palette and controls", NULL);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment