@@ -56,7 +56,8 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
5656#define LWM2M_HELP_OBSERV "List observations"
5757#define LWM2M_HELP_CACHE "cache PATH NUM\nEnable data cache for resource\n" \
5858 "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"
6061
6162static void send_cb (enum lwm2m_send_status status )
6263{
@@ -712,6 +713,125 @@ static int cmd_observations(const struct shell *sh, size_t argc, char **argv)
712713 return 0 ;
713714}
714715
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+
715835SHELL_STATIC_SUBCMD_SET_CREATE (
716836 sub_lwm2m ,
717837 SHELL_COND_CMD_ARG (CONFIG_LWM2M_VERSION_1_1 , send , NULL ,
@@ -730,6 +850,7 @@ SHELL_STATIC_SUBCMD_SET_CREATE(
730850 SHELL_CMD_ARG (lock , NULL , LWM2M_HELP_LOCK , cmd_lock , 1 , 0 ),
731851 SHELL_CMD_ARG (unlock , NULL , LWM2M_HELP_UNLOCK , cmd_unlock , 1 , 0 ),
732852 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 ),
733854 SHELL_SUBCMD_SET_END );
734855SHELL_COND_CMD_ARG_REGISTER (CONFIG_LWM2M_SHELL , lwm2m , & sub_lwm2m ,
735856 LWM2M_HELP_CMD , NULL , 1 , 0 );
0 commit comments