@@ -475,13 +475,6 @@ static sl_status_t zwave_command_class_user_credential_credential_get(
475475 frame_generator.add_value (cred_nodes.type_node , REPORTED_ATTRIBUTE);
476476 frame_generator.add_value (cred_nodes.slot_node , DESIRED_ATTRIBUTE);
477477 frame_generator.validate_frame (frame_length);
478-
479- // Delete special nodes (start interview of credentials)
480- if (cred_nodes.type_node .reported <user_credential_type_t >() == 0
481- && cred_nodes.slot_node .desired <user_credential_slot_t >() == 0 ) {
482- cred_nodes.type_node .delete_node ();
483- cred_nodes.slot_node .delete_node ();
484- }
485478 } catch (const std::exception &e) {
486479 sl_log_error (LOG_TAG,
487480 " Error while generating Credential Get frame : %s" ,
@@ -675,14 +668,43 @@ sl_status_t zwave_command_class_user_credential_credential_handle_report(
675668 return SL_STATUS_OK;
676669 // Update desired value if found, otherwise create the nodes
677670 case credential_report_type_t ::RESPONSE_TO_GET:
671+ // First check if this is the first credential interview
678672 credential_type_node
679- = create_or_update_desired_value (user_id_node,
680- ATTRIBUTE (CREDENTIAL_TYPE),
681- credential_type);
682- credential_slot_node
683- = create_or_update_desired_value (credential_type_node,
684- ATTRIBUTE (CREDENTIAL_SLOT),
685- credential_slot);
673+ = user_id_node.child_by_type_and_value (ATTRIBUTE (CREDENTIAL_TYPE),
674+ 0 ,
675+ REPORTED_ATTRIBUTE);
676+ credential_slot_node = credential_type_node.child_by_type_and_value (
677+ ATTRIBUTE (CREDENTIAL_SLOT),
678+ 0 ,
679+ DESIRED_ATTRIBUTE);
680+ // Update the values of the first nodes if present
681+ if (credential_type_node.is_valid ()
682+ && credential_slot_node.is_valid ()) {
683+ // If no credential are reported, we can delete the nodes
684+ if (credential_type == 0 && credential_slot == 0 ) {
685+ sl_log_debug (LOG_TAG, " No credential to get for user %d" , user_id);
686+ credential_type_node.delete_node ();
687+ credential_slot_node.delete_node ();
688+ return SL_STATUS_OK;
689+ } else {
690+ sl_log_debug (LOG_TAG,
691+ " First credential : Updating credential type and slot for user %d" ,
692+ user_id);
693+ credential_type_node.set_reported (credential_type);
694+ credential_slot_node.clear_desired ();
695+ credential_slot_node.set_reported (credential_slot);
696+ }
697+ } else {
698+ // Otherwise create or get the nodes
699+ credential_type_node
700+ = create_or_update_desired_value (user_id_node,
701+ ATTRIBUTE (CREDENTIAL_TYPE),
702+ credential_type);
703+ credential_slot_node
704+ = create_or_update_desired_value (credential_type_node,
705+ ATTRIBUTE (CREDENTIAL_SLOT),
706+ credential_slot);
707+ }
686708 break ;
687709 case credential_report_type_t ::CREDENTIAL_ADD_REJECTED_LOCATION_OCCUPIED:
688710 sl_log_error (LOG_TAG,
@@ -809,6 +831,8 @@ sl_status_t zwave_command_class_user_credential_credential_handle_report(
809831 trigger_get_credential (user_id_node,
810832 next_credential_type,
811833 next_credential_slot);
834+ } else {
835+ sl_log_debug (LOG_TAG, " No more credential to get." );
812836 }
813837
814838 } catch (const std::exception &e) {
0 commit comments