From b853550cd3fc6b63774386f12af9dbade5bcc6c6 Mon Sep 17 00:00:00 2001 From: Michael Rochelle Date: Sun, 18 Sep 2016 20:02:28 -0700 Subject: [PATCH 1/4] Fixed issue where the JVM crashes when Manager.removeWatcher function is called. --- .gitignore | 23 ++++++++++++----------- src/main/cpp/org_zwave4j_Manager.cpp | 19 +++++++++++++++---- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 19db0c7..238ff4b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,12 @@ -/.idea/ -/.gradle/ -/build/ -/native_libs/ -/gradle.properties -/OZW_Log.txt -/zwscene.xml -/zwcfg_*.xml -*.iml -*.ipr -*.iws +/.idea/ +/.gradle/ +/build/ +/native_libs/ +/gradle.properties +/OZW_Log.txt +/zwscene.xml +/zwcfg_*.xml +*.iml +*.ipr +*.iws +/.nb-gradle/ \ No newline at end of file diff --git a/src/main/cpp/org_zwave4j_Manager.cpp b/src/main/cpp/org_zwave4j_Manager.cpp index 208a250..e54dc41 100644 --- a/src/main/cpp/org_zwave4j_Manager.cpp +++ b/src/main/cpp/org_zwave4j_Manager.cpp @@ -2125,7 +2125,12 @@ JNIEXPORT void JNICALL Java_org_zwave4j_Manager_addWatcher env->NewGlobalRef(notificationWatcher), env->NewGlobalRef(context) ); - notificationWatchers[std::pair(notificationWatcher, context)] = pair; + + // This key is deallocated after this scope closes causing numerous issues. + //notificationWatchers[std::pair(notificationWatcher, context)] = pair; + + notificationWatchers[*pair] = pair; + OpenZWave::Manager::Get()->AddWatcher(onNotification, pair); } @@ -2138,9 +2143,15 @@ JNIEXPORT void JNICALL Java_org_zwave4j_Manager_removeWatcher (JNIEnv * env, jobject object, jobject notificationWatcher, jobject context) { std::pair * pair = notificationWatchers[std::pair(notificationWatcher, context)]; - OpenZWave::Manager::Get()->RemoveWatcher(onNotification, pair); - env->DeleteGlobalRef(pair->first); - env->DeleteGlobalRef(pair->second); + notificationWatchers.erase(std::pair(notificationWatcher, context)); + + if (pair->first != NULL) + env->DeleteGlobalRef(pair->first); + + if (pair->second != NULL) + env->DeleteGlobalRef(pair->second); + + OpenZWave::Manager::Get()->RemoveWatcher(onNotification, pair); delete pair; } From 9a541ae204f95d3a59bbb62ab9d129f315d8cfc6 Mon Sep 17 00:00:00 2001 From: Michael Rochelle Date: Wed, 30 Nov 2016 23:50:31 -0800 Subject: [PATCH 2/4] Fixed bug where an exception was thrown if getValueAsRaw returned an error Fixed issue where Manager and Options instance was not cleared after calling destroy Added functions: - requestNodeNeighborUpdate - deleteAllReturnRoutes - assignReturnRoute - addNode - removeNode - removeFailedNode - hasNodeFailed - replaceFailedNode --- src/main/cpp/org_zwave4j_Manager.cpp | 584 ++++++++++++++----------- src/main/java/org/zwave4j/Manager.java | 17 + src/main/java/org/zwave4j/Options.java | 1 + 3 files changed, 345 insertions(+), 257 deletions(-) diff --git a/src/main/cpp/org_zwave4j_Manager.cpp b/src/main/cpp/org_zwave4j_Manager.cpp index e54dc41..c543d79 100644 --- a/src/main/cpp/org_zwave4j_Manager.cpp +++ b/src/main/cpp/org_zwave4j_Manager.cpp @@ -9,96 +9,96 @@ jobject getNotificationType(JNIEnv * env, OpenZWave::Notification::NotificationT const char * name; switch(ozwNotificationType) { - case OpenZWave::Notification::Type_ValueAdded: - name = "VALUE_ADDED"; - break; - case OpenZWave::Notification::Type_ValueRemoved: - name = "VALUE_REMOVED"; - break; - case OpenZWave::Notification::Type_ValueChanged: - name = "VALUE_CHANGED"; - break; - case OpenZWave::Notification::Type_ValueRefreshed: - name = "VALUE_REFRESHED"; - break; - case OpenZWave::Notification::Type_Group: - name = "GROUP"; - break; - case OpenZWave::Notification::Type_NodeNew: - name = "NODE_NEW"; - break; - case OpenZWave::Notification::Type_NodeAdded: - name = "NODE_ADDED"; - break; - case OpenZWave::Notification::Type_NodeRemoved: - name = "NODE_REMOVED"; - break; - case OpenZWave::Notification::Type_NodeProtocolInfo: - name = "NODE_PROTOCOL_INFO"; - break; - case OpenZWave::Notification::Type_NodeNaming: - name = "NODE_NAMING"; - break; - case OpenZWave::Notification::Type_NodeEvent: - name = "NODE_EVENT"; - break; - case OpenZWave::Notification::Type_PollingDisabled: - name = "POLLING_DISABLED"; - break; - case OpenZWave::Notification::Type_PollingEnabled: - name = "POLLING_ENABLED"; - break; - case OpenZWave::Notification::Type_SceneEvent: - name = "SCENE_EVENT"; - break; - case OpenZWave::Notification::Type_CreateButton: - name = "CREATE_BUTTON"; - break; - case OpenZWave::Notification::Type_DeleteButton: - name = "DELETE_BUTTON"; - break; - case OpenZWave::Notification::Type_ButtonOn: - name = "BUTTON_ON"; - break; - case OpenZWave::Notification::Type_ButtonOff: - name = "BUTTON_OFF"; - break; - case OpenZWave::Notification::Type_DriverReady: - name = "DRIVER_READY"; - break; - case OpenZWave::Notification::Type_DriverFailed: - name = "DRIVER_FAILED"; - break; - case OpenZWave::Notification::Type_DriverReset: - name = "DRIVER_RESET"; - break; - case OpenZWave::Notification::Type_EssentialNodeQueriesComplete: - name = "ESSENTIAL_NODE_QUERIES_COMPLETE"; - break; - case OpenZWave::Notification::Type_NodeQueriesComplete: - name = "NODE_QUERIES_COMPLETE"; - break; - case OpenZWave::Notification::Type_AwakeNodesQueried: - name = "AWAKE_NODES_QUERIED"; - break; - case OpenZWave::Notification::Type_AllNodesQueriedSomeDead: - name = "ALL_NODES_QUERIED_SOME_DEAD"; - break; - case OpenZWave::Notification::Type_AllNodesQueried: - name = "ALL_NODES_QUERIED"; - break; - case OpenZWave::Notification::Type_Notification: - name = "NOTIFICATION"; - break; - case OpenZWave::Notification::Type_ControllerCommand: - name = "CONTROLLER_COMMAND"; - break; - case OpenZWave::Notification::Type_DriverRemoved: - name = "DRIVER_REMOVED"; - break; - default: - name = "NOT_SUPPORTED"; - break; + case OpenZWave::Notification::Type_ValueAdded: + name = "VALUE_ADDED"; + break; + case OpenZWave::Notification::Type_ValueRemoved: + name = "VALUE_REMOVED"; + break; + case OpenZWave::Notification::Type_ValueChanged: + name = "VALUE_CHANGED"; + break; + case OpenZWave::Notification::Type_ValueRefreshed: + name = "VALUE_REFRESHED"; + break; + case OpenZWave::Notification::Type_Group: + name = "GROUP"; + break; + case OpenZWave::Notification::Type_NodeNew: + name = "NODE_NEW"; + break; + case OpenZWave::Notification::Type_NodeAdded: + name = "NODE_ADDED"; + break; + case OpenZWave::Notification::Type_NodeRemoved: + name = "NODE_REMOVED"; + break; + case OpenZWave::Notification::Type_NodeProtocolInfo: + name = "NODE_PROTOCOL_INFO"; + break; + case OpenZWave::Notification::Type_NodeNaming: + name = "NODE_NAMING"; + break; + case OpenZWave::Notification::Type_NodeEvent: + name = "NODE_EVENT"; + break; + case OpenZWave::Notification::Type_PollingDisabled: + name = "POLLING_DISABLED"; + break; + case OpenZWave::Notification::Type_PollingEnabled: + name = "POLLING_ENABLED"; + break; + case OpenZWave::Notification::Type_SceneEvent: + name = "SCENE_EVENT"; + break; + case OpenZWave::Notification::Type_CreateButton: + name = "CREATE_BUTTON"; + break; + case OpenZWave::Notification::Type_DeleteButton: + name = "DELETE_BUTTON"; + break; + case OpenZWave::Notification::Type_ButtonOn: + name = "BUTTON_ON"; + break; + case OpenZWave::Notification::Type_ButtonOff: + name = "BUTTON_OFF"; + break; + case OpenZWave::Notification::Type_DriverReady: + name = "DRIVER_READY"; + break; + case OpenZWave::Notification::Type_DriverFailed: + name = "DRIVER_FAILED"; + break; + case OpenZWave::Notification::Type_DriverReset: + name = "DRIVER_RESET"; + break; + case OpenZWave::Notification::Type_EssentialNodeQueriesComplete: + name = "ESSENTIAL_NODE_QUERIES_COMPLETE"; + break; + case OpenZWave::Notification::Type_NodeQueriesComplete: + name = "NODE_QUERIES_COMPLETE"; + break; + case OpenZWave::Notification::Type_AwakeNodesQueried: + name = "AWAKE_NODES_QUERIED"; + break; + case OpenZWave::Notification::Type_AllNodesQueriedSomeDead: + name = "ALL_NODES_QUERIED_SOME_DEAD"; + break; + case OpenZWave::Notification::Type_AllNodesQueried: + name = "ALL_NODES_QUERIED"; + break; + case OpenZWave::Notification::Type_Notification: + name = "NOTIFICATION"; + break; + case OpenZWave::Notification::Type_ControllerCommand: + name = "CONTROLLER_COMMAND"; + break; + case OpenZWave::Notification::Type_DriverRemoved: + name = "DRIVER_REMOVED"; + break; + default: + name = "NOT_SUPPORTED"; + break; } jclass clazz = findClass(env, "org/zwave4j/NotificationType"); @@ -110,30 +110,30 @@ jobject getNotificationCode(JNIEnv * env, OpenZWave::Notification::NotificationC const char * name; switch(ozwNotificationCode) { - case OpenZWave::Notification::Code_MsgComplete: - name = "MSG_COMPLETE"; - break; - case OpenZWave::Notification::Code_Timeout: - name = "TIMEOUT"; - break; - case OpenZWave::Notification::Code_NoOperation: - name = "NO_OPERATION"; - break; - case OpenZWave::Notification::Code_Awake: - name = "AWAKE"; - break; - case OpenZWave::Notification::Code_Sleep: - name = "SLEEP"; - break; - case OpenZWave::Notification::Code_Dead: - name = "DEAD"; - break; - case OpenZWave::Notification::Code_Alive: - name = "ALIVE"; - break; - default: - name = "NOT_SUPPORTED"; - break; + case OpenZWave::Notification::Code_MsgComplete: + name = "MSG_COMPLETE"; + break; + case OpenZWave::Notification::Code_Timeout: + name = "TIMEOUT"; + break; + case OpenZWave::Notification::Code_NoOperation: + name = "NO_OPERATION"; + break; + case OpenZWave::Notification::Code_Awake: + name = "AWAKE"; + break; + case OpenZWave::Notification::Code_Sleep: + name = "SLEEP"; + break; + case OpenZWave::Notification::Code_Dead: + name = "DEAD"; + break; + case OpenZWave::Notification::Code_Alive: + name = "ALIVE"; + break; + default: + name = "NOT_SUPPORTED"; + break; } jclass clazz = findClass(env, "org/zwave4j/NotificationCode"); return env->GetStaticObjectField(clazz, env->GetStaticFieldID(clazz, name, "Lorg/zwave4j/NotificationCode;")); @@ -144,39 +144,39 @@ jobject getValueType(JNIEnv * env, OpenZWave::ValueID::ValueType ozwValueType) const char * name; switch(ozwValueType) { - case OpenZWave::ValueID::ValueType_Bool: - name = "BOOL"; - break; - case OpenZWave::ValueID::ValueType_Byte: - name = "BYTE"; - break; - case OpenZWave::ValueID::ValueType_Decimal: - name = "DECIMAL"; - break; - case OpenZWave::ValueID::ValueType_Int: - name = "INT"; - break; - case OpenZWave::ValueID::ValueType_List: - name = "LIST"; - break; - case OpenZWave::ValueID::ValueType_Schedule: - name = "SCHEDULE"; - break; - case OpenZWave::ValueID::ValueType_Short: - name = "SHORT"; - break; - case OpenZWave::ValueID::ValueType_String: - name = "STRING"; - break; - case OpenZWave::ValueID::ValueType_Button: - name = "BUTTON"; - break; - case OpenZWave::ValueID::ValueType_Raw: - name = "RAW"; - break; - default: - name = "NOT_SUPPORTED"; - break; + case OpenZWave::ValueID::ValueType_Bool: + name = "BOOL"; + break; + case OpenZWave::ValueID::ValueType_Byte: + name = "BYTE"; + break; + case OpenZWave::ValueID::ValueType_Decimal: + name = "DECIMAL"; + break; + case OpenZWave::ValueID::ValueType_Int: + name = "INT"; + break; + case OpenZWave::ValueID::ValueType_List: + name = "LIST"; + break; + case OpenZWave::ValueID::ValueType_Schedule: + name = "SCHEDULE"; + break; + case OpenZWave::ValueID::ValueType_Short: + name = "SHORT"; + break; + case OpenZWave::ValueID::ValueType_String: + name = "STRING"; + break; + case OpenZWave::ValueID::ValueType_Button: + name = "BUTTON"; + break; + case OpenZWave::ValueID::ValueType_Raw: + name = "RAW"; + break; + default: + name = "NOT_SUPPORTED"; + break; } jclass clazz = findClass(env, "org/zwave4j/ValueType"); return env->GetStaticObjectField(clazz, env->GetStaticFieldID(clazz, name, "Lorg/zwave4j/ValueType;")); @@ -187,24 +187,24 @@ jobject getValueGenre(JNIEnv * env, OpenZWave::ValueID::ValueGenre ozwValueGenre const char * name; switch(ozwValueGenre) { - case OpenZWave::ValueID::ValueGenre_Basic: - name = "BASIC"; - break; - case OpenZWave::ValueID::ValueGenre_User: - name = "USER"; - break; - case OpenZWave::ValueID::ValueGenre_Config: - name = "CONFIG"; - break; - case OpenZWave::ValueID::ValueGenre_System: - name = "SYSTEM"; - break; - case OpenZWave::ValueID::ValueGenre_Count: - name = "COUNT"; - break; - default: - name = "NOT_SUPPORTED"; - break; + case OpenZWave::ValueID::ValueGenre_Basic: + name = "BASIC"; + break; + case OpenZWave::ValueID::ValueGenre_User: + name = "USER"; + break; + case OpenZWave::ValueID::ValueGenre_Config: + name = "CONFIG"; + break; + case OpenZWave::ValueID::ValueGenre_System: + name = "SYSTEM"; + break; + case OpenZWave::ValueID::ValueGenre_Count: + name = "COUNT"; + break; + default: + name = "NOT_SUPPORTED"; + break; } jclass clazz = findClass(env, "org/zwave4j/ValueGenre"); return env->GetStaticObjectField(clazz, env->GetStaticFieldID(clazz, name, "Lorg/zwave4j/ValueGenre;")); @@ -215,18 +215,18 @@ jobject getControllerInterface(JNIEnv * env, OpenZWave::Driver::ControllerInterf const char * name; switch(ozwControllerInterface) { - case OpenZWave::Driver::ControllerInterface_Unknown: - name = "UNKNOWN"; - break; - case OpenZWave::Driver::ControllerInterface_Serial: - name = "SERIAL"; - break; - case OpenZWave::Driver::ControllerInterface_Hid: - name = "HID"; - break; - default: - name = "NOT_SUPPORTED"; - break; + case OpenZWave::Driver::ControllerInterface_Unknown: + name = "UNKNOWN"; + break; + case OpenZWave::Driver::ControllerInterface_Serial: + name = "SERIAL"; + break; + case OpenZWave::Driver::ControllerInterface_Hid: + name = "HID"; + break; + default: + name = "NOT_SUPPORTED"; + break; } jclass clazz = findClass(env, "org/zwave4j/ControllerInterface"); return env->GetStaticObjectField(clazz, env->GetStaticFieldID(clazz, name, "Lorg/zwave4j/ControllerInterface;")); @@ -237,42 +237,42 @@ jobject getControllerState(JNIEnv * env, OpenZWave::Driver::ControllerState ozwC const char * name; switch(ozwControllerState) { - case OpenZWave::Driver::ControllerState_Normal: - name = "NORMAL"; - break; - case OpenZWave::Driver::ControllerState_Starting: - name = "STARTING"; - break; - case OpenZWave::Driver::ControllerState_Cancel: - name = "CANCEL"; - break; - case OpenZWave::Driver::ControllerState_Error: - name = "ERROR"; - break; - case OpenZWave::Driver::ControllerState_Waiting: - name = "WAITING"; - break; - case OpenZWave::Driver::ControllerState_Sleeping: - name = "SLEEPING"; - break; - case OpenZWave::Driver::ControllerState_InProgress: - name = "IN_PROGRESS"; - break; - case OpenZWave::Driver::ControllerState_Completed: - name = "COMPLETED"; - break; - case OpenZWave::Driver::ControllerState_Failed: - name = "FAILED"; - break; - case OpenZWave::Driver::ControllerState_NodeOK: - name = "NODE_OK"; - break; - case OpenZWave::Driver::ControllerState_NodeFailed: - name = "NODE_FAILED"; - break; - default: - name = "NOT_SUPPORTED"; - break; + case OpenZWave::Driver::ControllerState_Normal: + name = "NORMAL"; + break; + case OpenZWave::Driver::ControllerState_Starting: + name = "STARTING"; + break; + case OpenZWave::Driver::ControllerState_Cancel: + name = "CANCEL"; + break; + case OpenZWave::Driver::ControllerState_Error: + name = "ERROR"; + break; + case OpenZWave::Driver::ControllerState_Waiting: + name = "WAITING"; + break; + case OpenZWave::Driver::ControllerState_Sleeping: + name = "SLEEPING"; + break; + case OpenZWave::Driver::ControllerState_InProgress: + name = "IN_PROGRESS"; + break; + case OpenZWave::Driver::ControllerState_Completed: + name = "COMPLETED"; + break; + case OpenZWave::Driver::ControllerState_Failed: + name = "FAILED"; + break; + case OpenZWave::Driver::ControllerState_NodeOK: + name = "NODE_OK"; + break; + case OpenZWave::Driver::ControllerState_NodeFailed: + name = "NODE_FAILED"; + break; + default: + name = "NOT_SUPPORTED"; + break; } jclass clazz = findClass(env, "org/zwave4j/ControllerState"); return env->GetStaticObjectField(clazz, env->GetStaticFieldID(clazz, name, "Lorg/zwave4j/ControllerState;")); @@ -283,48 +283,48 @@ jobject getControllerError(JNIEnv * env, OpenZWave::Driver::ControllerError ozwC const char * name; switch(ozwControllerError) { - case OpenZWave::Driver::ControllerError_None: - name = "NONE"; - break; - case OpenZWave::Driver::ControllerError_ButtonNotFound: - name = "BUTTON_NOT_FOUND"; - break; - case OpenZWave::Driver::ControllerError_NodeNotFound: - name = "NODE_NOT_FOUND"; - break; - case OpenZWave::Driver::ControllerError_NotBridge: - name = "NOT_BRIDGE"; - break; - case OpenZWave::Driver::ControllerError_NotSUC: - name = "NOT_SUC"; - break; - case OpenZWave::Driver::ControllerError_NotSecondary: - name = "NOT_SECONDARY"; - break; - case OpenZWave::Driver::ControllerError_NotPrimary: - name = "NOT_PRIMARY"; - break; - case OpenZWave::Driver::ControllerError_IsPrimary: - name = "IS_PRIMARY"; - break; - case OpenZWave::Driver::ControllerError_NotFound: - name = "NOT_FOUND"; - break; - case OpenZWave::Driver::ControllerError_Busy: - name = "BUSY"; - break; - case OpenZWave::Driver::ControllerError_Failed: - name = "FAILED"; - break; - case OpenZWave::Driver::ControllerError_Disabled: - name = "DISABLED"; - break; - case OpenZWave::Driver::ControllerError_Overflow: - name = "OVERFLOW"; - break; - default: - name = "NOT_SUPPORTED"; - break; + case OpenZWave::Driver::ControllerError_None: + name = "NONE"; + break; + case OpenZWave::Driver::ControllerError_ButtonNotFound: + name = "BUTTON_NOT_FOUND"; + break; + case OpenZWave::Driver::ControllerError_NodeNotFound: + name = "NODE_NOT_FOUND"; + break; + case OpenZWave::Driver::ControllerError_NotBridge: + name = "NOT_BRIDGE"; + break; + case OpenZWave::Driver::ControllerError_NotSUC: + name = "NOT_SUC"; + break; + case OpenZWave::Driver::ControllerError_NotSecondary: + name = "NOT_SECONDARY"; + break; + case OpenZWave::Driver::ControllerError_NotPrimary: + name = "NOT_PRIMARY"; + break; + case OpenZWave::Driver::ControllerError_IsPrimary: + name = "IS_PRIMARY"; + break; + case OpenZWave::Driver::ControllerError_NotFound: + name = "NOT_FOUND"; + break; + case OpenZWave::Driver::ControllerError_Busy: + name = "BUSY"; + break; + case OpenZWave::Driver::ControllerError_Failed: + name = "FAILED"; + break; + case OpenZWave::Driver::ControllerError_Disabled: + name = "DISABLED"; + break; + case OpenZWave::Driver::ControllerError_Overflow: + name = "OVERFLOW"; + break; + default: + name = "NOT_SUPPORTED"; + break; } jclass clazz = findClass(env, "org/zwave4j/ControllerError"); return env->GetStaticObjectField(clazz, env->GetStaticFieldID(clazz, name, "Lorg/zwave4j/ControllerError;")); @@ -860,6 +860,39 @@ JNIEXPORT jboolean JNICALL Java_org_zwave4j_Manager_requestNodeDynamic return getJboolean(OpenZWave::Manager::Get()->RequestNodeDynamic(getUint32(homeId), getUint8(nodeId))); } +/* + * Class: org_zwave4j_Manager + * Method: requestNodeNeighborUpdate + * Signature: (JS)Z + */ +JNIEXPORT jboolean JNICALL Java_org_zwave4j_Manager_requestNodeNeighborUpdate + (JNIEnv * env, jobject object, jlong homeId, jshort nodeId) +{ + return getJboolean(OpenZWave::Manager::Get()->RequestNodeNeighborUpdate(getUint32(homeId), getUint8(nodeId))); +} + +/* + * Class: org_zwave4j_Manager + * Method: DeleteAllReturnRoutes + * Signature: (JS)Z + */ +JNIEXPORT jboolean JNICALL Java_org_zwave4j_Manager_deleteAllReturnRoutes + (JNIEnv * env, jobject object, jlong homeId, jshort nodeId) +{ + return getJboolean(OpenZWave::Manager::Get()->DeleteAllReturnRoutes(getUint32(homeId), getUint8(nodeId))); +} + +/* + * Class: org_zwave4j_Manager + * Method: AssignReturnRoute + * Signature: (JS)Z + */ +JNIEXPORT jboolean JNICALL Java_org_zwave4j_Manager_assignReturnRoute + (JNIEnv * env, jobject object, jlong homeId, jshort nodeId) +{ + return getJboolean(OpenZWave::Manager::Get()->AssignReturnRoute(getUint32(homeId), getUint8(nodeId))); +} + /* * Class: org_zwave4j_Manager * Method: isNodeListeningDevice @@ -1454,6 +1487,7 @@ JNIEXPORT jboolean JNICALL Java_org_zwave4j_Manager_getValueAsBool { bool ozwValue; jboolean result = getJboolean(OpenZWave::Manager::Get()->GetValueAsBool(getOzwValueId(env, valueId), &ozwValue)); + env->CallVoidMethod( value, env->GetMethodID(findClass(env, "java/util/concurrent/atomic/AtomicReference"), "set", "(Ljava/lang/Object;)V"), @@ -1586,10 +1620,16 @@ JNIEXPORT jboolean JNICALL Java_org_zwave4j_Manager_getValueAsRaw jshortArray valueArray = env->NewShortArray(getJsize(length)); jshort * valueElements = env->GetShortArrayElements(valueArray, NULL); - for (uint8 i = 0; i < length; ++i) + + // If read was successful then extract shorts from result. + if (result == JNI_TRUE) { - valueElements[i] = getJshort(ozwValue[i]); + for (uint8 i = 0; i < length; ++i) + { + valueElements[i] = getJshort(ozwValue[i]); + } } + env->ReleaseShortArrayElements(valueArray, valueElements, 0); delete [] ozwValue; @@ -2177,6 +2217,36 @@ JNIEXPORT void JNICALL Java_org_zwave4j_Manager_softReset OpenZWave::Manager::Get()->SoftReset(getUint32(homeId)); } +JNIEXPORT jboolean JNICALL Java_org_zwave4j_Manager_addNode + (JNIEnv * env, jobject object, jlong homeId, jboolean secureMode) +{ + return getJboolean(OpenZWave::Manager::Get()->AddNode(getUint32(homeId), getBool(secureMode))); +} + +JNIEXPORT jboolean JNICALL Java_org_zwave4j_Manager_removeNode + (JNIEnv * env, jobject object, jlong homeId) +{ + return getJboolean(OpenZWave::Manager::Get()->RemoveNode(getUint32(homeId))); +} + +JNIEXPORT jboolean JNICALL Java_org_zwave4j_Manager_removeFailedNode + (JNIEnv * env, jobject object, jlong homeId, jshort nodeId) +{ + return getJboolean(OpenZWave::Manager::Get()->RemoveFailedNode(getUint32(homeId), getInt8(nodeId))); +} + +JNIEXPORT jboolean JNICALL Java_org_zwave4j_Manager_hasNodeFailed + (JNIEnv * env, jobject object, jlong homeId, jshort nodeId) +{ + return getJboolean(OpenZWave::Manager::Get()->HasNodeFailed(getUint32(homeId), getInt8(nodeId))); +} + +JNIEXPORT jboolean JNICALL Java_org_zwave4j_Manager_replaceFailedNode + (JNIEnv * env, jobject object, jlong homeId, jshort nodeId) +{ + return getJboolean(OpenZWave::Manager::Get()->ReplaceFailedNode(getUint32(homeId), getInt8(nodeId))); +} + /* * Class: org_zwave4j_Manager * Method: beginControllerCommand diff --git a/src/main/java/org/zwave4j/Manager.java b/src/main/java/org/zwave4j/Manager.java index 42b86fe..390325d 100644 --- a/src/main/java/org/zwave4j/Manager.java +++ b/src/main/java/org/zwave4j/Manager.java @@ -24,6 +24,7 @@ public static Manager get() { public static void destroy() { destroyNativeManager(); + instance = null; } private static native void createNativeManager(); @@ -86,6 +87,12 @@ public static void destroy() { public native boolean requestNodeState(long homeId, short nodeId); public native boolean requestNodeDynamic(long homeId, short nodeId); + + public native boolean requestNodeNeighborUpdate(long homeId, short nodeId); + + public native boolean deleteAllReturnRoutes(long homeId, short nodeId); + + public native boolean assignReturnRoute(long homeId, short nodeId); public native boolean isNodeListeningDevice(long homeId, short nodeId); @@ -293,6 +300,16 @@ public void removeAssociation(long homeId, short nodeId, short groupIdx, short t public native void resetController(long homeId); public native void softReset(long homeId); + + public native boolean addNode(long homeId, boolean secureMode); + + public native boolean removeNode(long homeId); + + public native boolean removeFailedNode(long homeId, short nodeId); + + public native boolean hasNodeFailed(long homeId, short nodeId); + + public native boolean replaceFailedNode(long homeId, short nodeId); public native boolean beginControllerCommand(long homeId, ControllerCommand command); diff --git a/src/main/java/org/zwave4j/Options.java b/src/main/java/org/zwave4j/Options.java index 17c1878..bf4f922 100644 --- a/src/main/java/org/zwave4j/Options.java +++ b/src/main/java/org/zwave4j/Options.java @@ -22,6 +22,7 @@ public static Options get() { } public static boolean destroy() { + instance = null; return destroyNativeOptions(); } From 4fbc052912b9f08e8baa3e9f39a62e43b5977168 Mon Sep 17 00:00:00 2001 From: Michael Rochelle Date: Fri, 2 Dec 2016 22:47:36 -0800 Subject: [PATCH 3/4] Modified Gradle build scripts to build with Visual Studio. --- build.gradle | 60 +++++++++++++++++++----- example.gradle.properties | 17 ------- gradle/wrapper/gradle-wrapper.properties | 12 ++--- 3 files changed, 54 insertions(+), 35 deletions(-) delete mode 100644 example.gradle.properties diff --git a/build.gradle b/build.gradle index 08f015f..5846b43 100644 --- a/build.gradle +++ b/build.gradle @@ -71,7 +71,7 @@ task generateOzwVersion(type: Exec) { workingDir openZWaveDir commandLine "make" - args "cpp/src/vers.cpp" + args "cpp/build/windows/winversion.cpp" } model { @@ -133,6 +133,14 @@ model { } } clang(Clang) { + } + + visualCpp(VisualCpp) + { + // Specify the installDir if Visual Studio cannot be located + //installDir "C:/Apps/Microsoft Visual Studio 10.0" + installDir "C:/Program Files (x86)/Microsoft Visual Studio 14.0" + //installDir "C:/Program Files (x86)/Microsoft Visual Studio 12.0" } } @@ -200,9 +208,11 @@ model { } cpp(CppSourceSet) { lib library: "hidApi", linkage: "api" - + source { - if (targetPlatform.operatingSystem.windows) { + if (targetPlatform.operatingSystem.windows) + { + cppCompiler.args "/D_USRDLL", "/DHIDAPI_EXPORTS", "/D_WINDLL" srcDir "$openZWaveDir/cpp/hidapi/windows" } include "*.cpp" @@ -253,7 +263,7 @@ model { srcDir "$openZWaveDir/cpp/src" srcDir "$openZWaveDir/cpp/src/command_classes" srcDir "$openZWaveDir/cpp/src/value_classes" - srcDir "$openZWaveDir/cpp/src/platform" + srcDir "$openZWaveDir/cpp/src/platform/" include "*.cpp" } @@ -271,21 +281,24 @@ model { sources { cpp(CppSourceSet) { lib library: "openZWave", linkage: "api" - - source { + source { + if (targetPlatform.operatingSystem.windows) { + srcDir "$openZWaveDir/cpp/src/platform/windows" + } + else if (targetPlatform.operatingSystem.linux || targetPlatform.operatingSystem.macOsX) { srcDir "$openZWaveDir/cpp/src/platform/unix" - } else if (targetPlatform.operatingSystem.windows) { - srcDir "$openZWaveDir/cpp/src/platform/windows" } include "*.cpp" } exportedHeaders { + if (targetPlatform.operatingSystem.windows) { + srcDir "$openZWaveDir/cpp/src/platform/windows" + } + else if (targetPlatform.operatingSystem.linux || targetPlatform.operatingSystem.macOsX) { srcDir "$openZWaveDir/cpp/src/platform/unix" - } else if (targetPlatform.operatingSystem.windows) { - srcDir "$openZWaveDir/cpp/src/platform/windows" } include "*.h" } @@ -317,7 +330,7 @@ model { lib library: "aes", linkage: "static" exportedHeaders { - srcDir generatedNativeHeadersDir + srcDirs generatedNativeHeadersDir } } } @@ -338,6 +351,13 @@ model { if (toolChain in Gcc) { linker.args "-static", "-lsetupapi" } + else + if (toolChain in VisualCpp) + { + //cppCompiler.args "/DWIN32", "/Zi", "/FS", "/EHsc", "/IC:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/INCLUDE", "/IC:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/ATLMFC/INCLUDE", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/ucrt", "/IC:/Program Files (x86)/Windows Kits/NETFXSDK/4.6.1/include/um", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/shared", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/um", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/winrt" + //linker.args "/DEBUG", "/LIBPATH:C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/LIB/amd64","/LIBPATH:C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/ATLMFC/LIB/amd64","/LIBPATH:C:/Program Files (x86)/Windows Kits/10/lib/10.0.10586.0/ucrt/x64","/LIBPATH:C:/Program Files (x86)/Windows Kits/NETFXSDK/4.6.1/lib/um/x64","/LIBPATH:C:/Program Files (x86)/Windows Kits/10/lib/10.0.10586.0/um/x64" + } + } else if (targetPlatform.operatingSystem.macOsX) { if (toolChain in Gcc || toolChain in Clang) { linker.args "-framework", "IOKit", "-framework", "CoreFoundation" @@ -364,6 +384,22 @@ model { linker.args "-Wl,--kill-at" } } + else + if (toolChain in VisualCpp) + { + if (targetPlatform.architecture.name == "x86") + { + cCompiler.args "/DWIN32", "/D_WINDOWS", "/IC:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/INCLUDE", "/IC:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/ATLMFC/INCLUDE", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/ucrt", "/IC:/Program Files (x86)/Windows Kits/NETFXSDK/4.6.1/include/um", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/shared", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/um", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/winrt" + cppCompiler.args "/GS", "/GL", "/Zi", "/O2", "/Zc:inline", "/fp:precise", "/Zc:wchar_t", "/MD", "/DUNICODE", "/Gd", "/DWIN32", "/D_WINDOWS", "/Zi", "/FS", "/EHsc", "/IC:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/INCLUDE", "/IC:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/ATLMFC/INCLUDE", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/ucrt", "/IC:/Program Files (x86)/Windows Kits/NETFXSDK/4.6.1/include/um", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/shared", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/um", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/winrt" + linker.args "/DEBUG", "/DYNAMICBASE", "setupapi.lib", "kernel32.lib", "user32.lib", "gdi32.lib", "winspool.lib", "comdlg32.lib", "advapi32.lib", "shell32.lib", "ole32.lib", "oleaut32.lib", "uuid.lib", "odbc32.lib", "odbccp32.lib", "/SUBSYSTEM:WINDOWS", "/MANIFEST", "/LTCG:incremental", "/NXCOMPAT", "/LIBPATH:C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/LIB","/LIBPATH:C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/ATLMFC/LIB","/LIBPATH:C:/Program Files (x86)/Windows Kits/10/lib/10.0.10586.0/ucrt/x86","/LIBPATH:C:/Program Files (x86)/Windows Kits/NETFXSDK/4.6.1/lib/um/x86","/LIBPATH:C:/Program Files (x86)/Windows Kits/10/lib/10.0.10586.0/um/x86" + } + else + { + cCompiler.args "/DWIN32", "/D_WINDOWS", "/IC:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/INCLUDE", "/IC:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/ATLMFC/INCLUDE", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/ucrt", "/IC:/Program Files (x86)/Windows Kits/NETFXSDK/4.6.1/include/um", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/shared", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/um", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/winrt" + cppCompiler.args "/GS", "/GL", "/Zi", "/O2", "/Zc:inline", "/fp:precise", "/Zc:wchar_t", "/MD", "/DUNICODE", "/DWIN32", "/D_WINDOWS", "/Zi", "/FS", "/EHsc", "/IC:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/INCLUDE", "/IC:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/ATLMFC/INCLUDE", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/ucrt", "/IC:/Program Files (x86)/Windows Kits/NETFXSDK/4.6.1/include/um", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/shared", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/um", "/IC:/Program Files (x86)/Windows Kits/10/include/10.0.10586.0/winrt" + linker.args "/DEBUG", "/DYNAMICBASE", "setupapi.lib", "kernel32.lib", "user32.lib", "gdi32.lib", "winspool.lib", "comdlg32.lib", "advapi32.lib", "shell32.lib", "ole32.lib", "oleaut32.lib", "uuid.lib", "odbc32.lib", "odbccp32.lib", "/SUBSYSTEM:WINDOWS", "/MANIFEST", "/LTCG:incremental", "/NXCOMPAT", "/LIBPATH:C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/LIB/amd64","/LIBPATH:C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/ATLMFC/LIB/amd64","/LIBPATH:C:/Program Files (x86)/Windows Kits/10/lib/10.0.10586.0/ucrt/x64","/LIBPATH:C:/Program Files (x86)/Windows Kits/NETFXSDK/4.6.1/lib/um/x64","/LIBPATH:C:/Program Files (x86)/Windows Kits/10/lib/10.0.10586.0/um/x64" + } + } } else if (targetPlatform.operatingSystem.macOsX) { if (toolChain in Gcc || toolChain in Clang) { cppCompiler.define "DARWIN" @@ -475,7 +511,7 @@ uploadArchives { } task wrapper(type: Wrapper) { - gradleVersion = "2.13" + gradleVersion = "3.1" } idea { diff --git a/example.gradle.properties b/example.gradle.properties deleted file mode 100644 index efa2aa2..0000000 --- a/example.gradle.properties +++ /dev/null @@ -1,17 +0,0 @@ -#build time properties -#openZWaveDir = ../open-zwave - -#runtime properties -#openZWaveConfigDir = ../open-zwave/config -#zWaveControllerPort = /dev/ttyUSB0 - -#release properties -#release = false - -#signEnabled = false -#signing.keyId = -#signing.password = -#signing.secretKeyRingFile = - -#sonatypeUsername = -#sonatypePassword = diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9f5ea2d..29b707b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun May 01 21:33:12 SAMT 2016 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-bin.zip +#Sun Sep 25 16:18:33 PDT 2016 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip From 07844b522f582cfc27709ca7a536a563cc5749bf Mon Sep 17 00:00:00 2001 From: Michael Rochelle Date: Sat, 3 Dec 2016 23:06:24 -0800 Subject: [PATCH 4/4] Added Replicate Send command. --- src/main/cpp/org_zwave4j_Manager.cpp | 11 +++++++++++ src/main/java/org/zwave4j/Manager.java | 2 ++ 2 files changed, 13 insertions(+) diff --git a/src/main/cpp/org_zwave4j_Manager.cpp b/src/main/cpp/org_zwave4j_Manager.cpp index c543d79..a1962c2 100644 --- a/src/main/cpp/org_zwave4j_Manager.cpp +++ b/src/main/cpp/org_zwave4j_Manager.cpp @@ -3059,3 +3059,14 @@ JNIEXPORT void JNICALL Java_org_zwave4j_Manager_getNodeStatistics ); } } + +/* + * Class: org_zwave4j_Manager + * Method: pressButton + * Signature: (Lorg/zwave4j/ValueId;)Z + */ +JNIEXPORT jboolean JNICALL Java_org_zwave4j_Manager_replicationSend + (JNIEnv * env, jobject object, jlong homeId, jshort nodeId) +{ + return getJboolean(OpenZWave::Manager::Get()->ReplicationSend(getUint32(homeId), getUint8(nodeId))); +} diff --git a/src/main/java/org/zwave4j/Manager.java b/src/main/java/org/zwave4j/Manager.java index 390325d..62bccbc 100644 --- a/src/main/java/org/zwave4j/Manager.java +++ b/src/main/java/org/zwave4j/Manager.java @@ -82,6 +82,8 @@ public static void destroy() { //Node + public native boolean replicationSend(long homeId, short nodeId); + public native boolean refreshNodeInfo(long homeId, short nodeId); public native boolean requestNodeState(long homeId, short nodeId);