@@ -56,7 +56,8 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
56
56
#define LWM2M_HELP_OBSERV "List observations"
57
57
#define LWM2M_HELP_CACHE "cache PATH NUM\nEnable data cache for resource\n" \
58
58
"PATH is LwM2M path\n" \
59
- "NUM how many elements to cache\n" \
59
+ "NUM how many elements to cache\n"
60
+ #define LWM2M_HELP_LS "ls [PATH]\nList objects, instances, resources\n"
60
61
61
62
static void send_cb (enum lwm2m_send_status status )
62
63
{
@@ -712,6 +713,125 @@ static int cmd_observations(const struct shell *sh, size_t argc, char **argv)
712
713
return 0 ;
713
714
}
714
715
716
+ static int print_object_instance (const struct shell * sh , struct lwm2m_engine_obj_inst * oi )
717
+ {
718
+ struct lwm2m_engine_obj * obj ;
719
+
720
+ if (!oi ) {
721
+ return - ENOEXEC ;
722
+ }
723
+
724
+ obj = oi -> obj ;
725
+
726
+ for (int i = 0 ; i < oi -> resource_count ; i ++ ) {
727
+ struct lwm2m_engine_res * re = & oi -> resources [i ];
728
+
729
+ for (int j = 0 ; j < re -> res_inst_count ; j ++ ) {
730
+ struct lwm2m_engine_res_inst * ri = & re -> res_instances [j ];
731
+
732
+ if (ri -> data_ptr && ri -> data_len > 0 &&
733
+ ri -> res_inst_id != RES_INSTANCE_NOT_CREATED ) {
734
+ struct lwm2m_engine_obj_field * field =
735
+ lwm2m_get_engine_obj_field (obj , re -> res_id );
736
+ char path [LWM2M_MAX_PATH_STR_SIZE ];
737
+
738
+ if (re -> multi_res_inst ) {
739
+ snprintf (path , sizeof (path ), "%hu/%hu/%hu/%hu" , obj -> obj_id ,
740
+ oi -> obj_inst_id , re -> res_id , ri -> res_inst_id );
741
+ } else {
742
+ snprintf (path , sizeof (path ), "%hu/%hu/%hu" , obj -> obj_id ,
743
+ oi -> obj_inst_id , re -> res_id );
744
+ }
745
+ switch (field -> data_type ) {
746
+ case LWM2M_RES_TYPE_STRING :
747
+ shell_print (sh , "%s : %s" , path , (char * )ri -> data_ptr );
748
+ break ;
749
+ case LWM2M_RES_TYPE_U8 :
750
+ case LWM2M_RES_TYPE_S8 :
751
+ case LWM2M_RES_TYPE_BOOL :
752
+ shell_print (sh , "%s : %u" , path , * (uint8_t * )ri -> data_ptr );
753
+ break ;
754
+ case LWM2M_RES_TYPE_U16 :
755
+ case LWM2M_RES_TYPE_S16 :
756
+ shell_print (sh , "%s : %u" , path , * (uint16_t * )ri -> data_ptr );
757
+ break ;
758
+ case LWM2M_RES_TYPE_U32 :
759
+ case LWM2M_RES_TYPE_S32 :
760
+ shell_print (sh , "%s : %u" , path , * (uint32_t * )ri -> data_ptr );
761
+ break ;
762
+ case LWM2M_RES_TYPE_S64 :
763
+ case LWM2M_RES_TYPE_TIME :
764
+ shell_print (sh , "%s : %lld" , path ,
765
+ * (int64_t * )ri -> data_ptr );
766
+ break ;
767
+ case LWM2M_RES_TYPE_FLOAT :
768
+ shell_print (sh , "%s : %lf" , path , * (double * )ri -> data_ptr );
769
+ break ;
770
+ case LWM2M_RES_TYPE_OPAQUE :
771
+ shell_print (sh , "%s : OPAQUE(%hu/%hu)" , path , ri -> data_len ,
772
+ ri -> max_data_len );
773
+ break ;
774
+ }
775
+ }
776
+ }
777
+ }
778
+ return 0 ;
779
+ }
780
+
781
+ static int print_object (const struct shell * sh , struct lwm2m_engine_obj * obj )
782
+ {
783
+ if (!obj ) {
784
+ return - ENOEXEC ;
785
+ }
786
+ struct lwm2m_engine_obj_inst * oi = next_engine_obj_inst (obj -> obj_id , -1 );
787
+
788
+ for (int i = 0 ; i < obj -> instance_count ; i ++ ) {
789
+ print_object_instance (sh , oi );
790
+ oi = next_engine_obj_inst (obj -> obj_id , oi -> obj_inst_id );
791
+ }
792
+ return 0 ;
793
+ }
794
+
795
+ static int print_all_objs (const struct shell * sh )
796
+ {
797
+ struct lwm2m_engine_obj * obj ;
798
+
799
+ SYS_SLIST_FOR_EACH_CONTAINER (lwm2m_engine_obj_list (), obj , node ) {
800
+ print_object (sh , obj );
801
+ }
802
+ return 0 ;
803
+ }
804
+
805
+ static int cmd_ls (const struct shell * sh , size_t argc , char * * argv )
806
+ {
807
+ struct lwm2m_obj_path path ;
808
+ int ret ;
809
+
810
+ if (argc < 2 ) {
811
+ return print_all_objs (sh );
812
+ }
813
+
814
+ ret = lwm2m_string_to_path (argv [1 ], & path , '/' );
815
+ if (ret < 0 ) {
816
+ return - ENOEXEC ;
817
+ }
818
+
819
+ if (path .level == LWM2M_PATH_LEVEL_NONE ) {
820
+ return print_all_objs (sh );
821
+ } else if (path .level == LWM2M_PATH_LEVEL_OBJECT ) {
822
+ struct lwm2m_engine_obj * obj = lwm2m_engine_get_obj (& path );
823
+
824
+ return print_object (sh , obj );
825
+ } else if (path .level == LWM2M_PATH_LEVEL_OBJECT_INST ) {
826
+ struct lwm2m_engine_obj_inst * oi = lwm2m_engine_get_obj_inst (& path );
827
+
828
+ return print_object_instance (sh , oi );
829
+ } else if (path .level == LWM2M_PATH_LEVEL_RESOURCE ) {
830
+ return cmd_read (sh , argc , argv );
831
+ }
832
+ return - ENOEXEC ;
833
+ }
834
+
715
835
SHELL_STATIC_SUBCMD_SET_CREATE (
716
836
sub_lwm2m ,
717
837
SHELL_COND_CMD_ARG (CONFIG_LWM2M_VERSION_1_1 , send , NULL ,
@@ -730,6 +850,7 @@ SHELL_STATIC_SUBCMD_SET_CREATE(
730
850
SHELL_CMD_ARG (lock , NULL , LWM2M_HELP_LOCK , cmd_lock , 1 , 0 ),
731
851
SHELL_CMD_ARG (unlock , NULL , LWM2M_HELP_UNLOCK , cmd_unlock , 1 , 0 ),
732
852
SHELL_CMD_ARG (obs , NULL , LWM2M_HELP_OBSERV , cmd_observations , 1 , 0 ),
853
+ SHELL_CMD_ARG (ls , NULL , LWM2M_HELP_LS , cmd_ls , 1 , 1 ),
733
854
SHELL_SUBCMD_SET_END );
734
855
SHELL_COND_CMD_ARG_REGISTER (CONFIG_LWM2M_SHELL , lwm2m , & sub_lwm2m ,
735
856
LWM2M_HELP_CMD , NULL , 1 , 0 );
0 commit comments