From 9396fb7cb8eb862230edc55b43f633dfc75fc793 Mon Sep 17 00:00:00 2001 From: Fabio Pintus Date: Wed, 20 Jan 2021 16:20:23 +0100 Subject: [PATCH] Improvements in lwm2m logic --- Samples/AZX_Docs/html/annotated.html | 2 +- Samples/AZX_Docs/html/app__cfg_8h.html | 10 +- .../AZX_Docs/html/app__cfg_8h__dep__incl.map | 6 +- .../AZX_Docs/html/app__cfg_8h__dep__incl.png | Bin 5151 -> 5315 bytes Samples/AZX_Docs/html/app__cfg_8h_source.html | 4 +- Samples/AZX_Docs/html/azx__log_8h.html | 107 +------ Samples/AZX_Docs/html/azx__log_8h.js | 6 +- .../AZX_Docs/html/azx__log_8h__dep__incl.map | 4 +- .../AZX_Docs/html/azx__log_8h__dep__incl.png | Bin 3075 -> 3222 bytes Samples/AZX_Docs/html/azx__log_8h__incl.map | 6 +- Samples/AZX_Docs/html/azx__log_8h__incl.png | Bin 5138 -> 5387 bytes Samples/AZX_Docs/html/azx__log_8h_source.html | 176 +++++----- Samples/AZX_Docs/html/azx__utils_8h.html | 34 +- Samples/AZX_Docs/html/azx__utils_8h.js | 4 +- Samples/AZX_Docs/html/azx__utils_8h__incl.map | 8 +- Samples/AZX_Docs/html/azx__utils_8h__incl.png | Bin 9714 -> 9375 bytes .../AZX_Docs/html/azx__utils_8h_source.html | 53 ++- Samples/AZX_Docs/html/classes.html | 2 +- .../dir_0045f852bf8045b6d5abd9c9eb54a446.html | 2 +- Samples/AZX_Docs/html/files.html | 2 +- Samples/AZX_Docs/html/functions.html | 2 +- Samples/AZX_Docs/html/functions_vars.html | 2 +- Samples/AZX_Docs/html/globals.html | 12 +- Samples/AZX_Docs/html/globals_defs.html | 2 +- Samples/AZX_Docs/html/globals_enum.html | 2 +- Samples/AZX_Docs/html/globals_eval.html | 2 +- Samples/AZX_Docs/html/globals_func.html | 12 +- Samples/AZX_Docs/html/graph_legend.html | 2 +- Samples/AZX_Docs/html/graph_legend.png | Bin 19465 -> 19906 bytes Samples/AZX_Docs/html/group__log_conf.html | 18 +- Samples/AZX_Docs/html/group__log_conf.js | 4 +- Samples/AZX_Docs/html/group__log_usage.html | 2 +- Samples/AZX_Docs/html/index.html | 2 +- Samples/AZX_Docs/html/modules.html | 2 +- Samples/AZX_Docs/html/navtreeindex0.js | 46 ++- Samples/AZX_Docs/html/search/all_0.js | 56 ++-- Samples/AZX_Docs/html/search/all_1.js | 2 +- Samples/AZX_Docs/html/search/all_2.js | 8 +- Samples/AZX_Docs/html/search/all_3.js | 2 +- Samples/AZX_Docs/html/search/all_4.js | 2 +- Samples/AZX_Docs/html/search/classes_0.js | 2 +- Samples/AZX_Docs/html/search/defines_0.js | 4 +- Samples/AZX_Docs/html/search/defines_1.js | 4 +- Samples/AZX_Docs/html/search/defines_2.js | 2 +- Samples/AZX_Docs/html/search/enums_0.js | 6 +- Samples/AZX_Docs/html/search/enumvalues_0.js | 30 +- Samples/AZX_Docs/html/search/files_0.js | 6 +- Samples/AZX_Docs/html/search/functions_0.js | 18 +- Samples/AZX_Docs/html/search/groups_0.js | 2 +- Samples/AZX_Docs/html/search/groups_1.js | 2 +- Samples/AZX_Docs/html/search/pages_0.js | 2 +- Samples/AZX_Docs/html/search/variables_0.js | 6 +- .../struct_a_z_x___l_o_g___c_f_g___t.html | 2 +- .../azx/hdr/azx_log.h | 54 +--- .../azx/hdr/azx_utils.h | 11 +- .../azx/src/azx_log.c | 301 +----------------- .../azx/src/azx_utils.c | 14 +- .../BRAVO_Environment_BSEC_Demo/hdr/app_cfg.h | 2 +- .../src/demo_utils/lwm2m.c | 89 ++++-- .../src/demo_utils/lwm2m.h | 9 +- Samples/BRAVO_Rotation_Demo/azx/hdr/azx_log.h | 54 +--- .../BRAVO_Rotation_Demo/azx/hdr/azx_utils.h | 11 +- Samples/BRAVO_Rotation_Demo/azx/src/azx_log.c | 301 +----------------- .../BRAVO_Rotation_Demo/azx/src/azx_utils.c | 14 +- Samples/BRAVO_Rotation_Demo/hdr/app_cfg.h | 2 +- .../src/demo_utils/lwm2m.c | 89 ++++-- .../src/demo_utils/lwm2m.h | 9 +- .../BRAVO_Tampering_Demo/azx/hdr/azx_log.h | 54 +--- .../BRAVO_Tampering_Demo/azx/hdr/azx_utils.h | 11 +- .../BRAVO_Tampering_Demo/azx/src/azx_log.c | 301 +----------------- .../BRAVO_Tampering_Demo/azx/src/azx_utils.c | 14 +- Samples/BRAVO_Tampering_Demo/hdr/app_cfg.h | 2 +- .../src/demo_utils/lwm2m.c | 89 ++++-- .../src/demo_utils/lwm2m.h | 9 +- Samples/README.md | 76 ++--- 75 files changed, 615 insertions(+), 1593 deletions(-) diff --git a/Samples/AZX_Docs/html/annotated.html b/Samples/AZX_Docs/html/annotated.html index ae4f247..dc731f7 100644 --- a/Samples/AZX_Docs/html/annotated.html +++ b/Samples/AZX_Docs/html/annotated.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
diff --git a/Samples/AZX_Docs/html/app__cfg_8h.html b/Samples/AZX_Docs/html/app__cfg_8h.html index 706e7dc..0efb57a 100644 --- a/Samples/AZX_Docs/html/app__cfg_8h.html +++ b/Samples/AZX_Docs/html/app__cfg_8h.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
@@ -105,9 +105,9 @@
- - - + + +
@@ -116,7 +116,7 @@

Macros

-#define VERSION   "1.0.3" +#define VERSION   "1.0.4"  The current version of the Samples.
 
Log Settings
diff --git a/Samples/AZX_Docs/html/app__cfg_8h__dep__incl.map b/Samples/AZX_Docs/html/app__cfg_8h__dep__incl.map index ffc68d3..1cf1cc0 100644 --- a/Samples/AZX_Docs/html/app__cfg_8h__dep__incl.map +++ b/Samples/AZX_Docs/html/app__cfg_8h__dep__incl.map @@ -1,5 +1,5 @@ - - - + + + diff --git a/Samples/AZX_Docs/html/app__cfg_8h__dep__incl.png b/Samples/AZX_Docs/html/app__cfg_8h__dep__incl.png index f69f866a44b65d4c05d712e9e9c86254382f6991..6536253a02bf2d2cf2caab19f0584a03bd4b9c40 100644 GIT binary patch literal 5315 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 literal 5151 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 diff --git a/Samples/AZX_Docs/html/app__cfg_8h_source.html b/Samples/AZX_Docs/html/app__cfg_8h_source.html index 225abca..212f128 100644 --- a/Samples/AZX_Docs/html/app__cfg_8h_source.html +++ b/Samples/AZX_Docs/html/app__cfg_8h_source.html @@ -34,7 +34,7 @@ Logo

A set of companion utilities that make AZ development easier
@@ -102,7 +102,7 @@
20 
21 
22 
-
26 #define VERSION "1.0.3"
+
26 #define VERSION "1.0.4"
27 
32 #define LOG_LEVEL AZX_LOG_LEVEL_DEBUG
33 #define LOG_CHANNEL AZX_LOG_TO_MAIN_UART
diff --git a/Samples/AZX_Docs/html/azx__log_8h.html b/Samples/AZX_Docs/html/azx__log_8h.html index acb6c4b..50e7f47 100644 --- a/Samples/AZX_Docs/html/azx__log_8h.html +++ b/Samples/AZX_Docs/html/azx__log_8h.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
@@ -109,9 +109,9 @@
- - - + + +
@@ -119,8 +119,8 @@
- - + +
@@ -135,14 +135,14 @@

Enumerations

enum  AZX_LOG_LEVEL_E {
-  AZX_LOG_LEVEL_TRACE = 1, +  AZX_LOG_LEVEL_NONE = 0, +AZX_LOG_LEVEL_TRACE = 1, AZX_LOG_LEVEL_DEBUG = 2, AZX_LOG_LEVEL_INFO = 3, -AZX_LOG_LEVEL_WARN = 4,
-  AZX_LOG_LEVEL_ERROR = 5, -AZX_LOG_LEVEL_CRITICAL = 6, -AZX_LOG_LEVEL_NONE = 0x7F +  AZX_LOG_LEVEL_WARN = 4, +AZX_LOG_LEVEL_ERROR = 5, +AZX_LOG_LEVEL_CRITICAL = 6
}  Logging levels. More...
@@ -184,16 +184,10 @@ AZX_LOG_LEVEL_E azx_log_getLevel (void)  Returns the current value of the log level. More...
  -BOOLEAN azx_log_send_to_file (const CHAR *filename, UINT32 circular_chunks, AZX_LOG_LEVEL_E min_level, UINT32 max_size_kb) - Gets the logging component to output to a file. More...
-  -void azx_log_flush_to_file (void) - Flushes any outstanding logs to the file. More...

Detailed Description

Logging utilities to print on available output channels.

-
Version
1.0.5
+
Version
1.0.2
Dependencies

Author
Fabio Pintus
@@ -224,27 +218,6 @@

See also
azx_log_init

Example

azx_log_deinit();
 
-
-
- -

◆ azx_log_flush_to_file()

- -
-
- - - - - - - - -
void azx_log_flush_to_file (void )
-
- -

Flushes any outstanding logs to the file.

-

Without calling this, there is no guarantee of when the logs will be written to the filesystem. It may take longer due to caching.

-
@@ -269,62 +242,6 @@

See also
azx_log_init()

Example

AZX_LOG_LEVEL_E level = azx_log_get_log_level();
 
- - - -

◆ azx_log_send_to_file()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BOOLEAN azx_log_send_to_file (const CHAR * filename,
UINT32 circular_chunks,
AZX_LOG_LEVEL_E min_level,
UINT32 max_size_kb 
)
-
- -

Gets the logging component to output to a file.

-

Once this is called all the logs will be sent to a named file. The file will be appended to, so existing logs there will not be removed.

-

Logs will continue to be sent to USB/UART if that is so configured.

-

Only one file can be used at the same time, so calling this again with a new filename means that all logs will go to the new file instead of the old one.

-

The logging can be configured to be done in a circular way by setting circular_chunks to a value greater than 0. Each chunk will have at most max_size_kb KB.

-
Parameters
- - - - - -
filenameThe name of the file to log to. If NULL, this function does nothing.
circular_chunksThe number of chunks to store circularly (apart from the original one).
min_levelThe minimum level of the logs to be stored.
max_size_kbThe maximum size in KB of each size of the log file. Once the file reaches that limit, no further logging will be made to it.
-
-
-
Returns
TRUE if the file can be created and opened, FALSE otherwise
-
diff --git a/Samples/AZX_Docs/html/azx__log_8h.js b/Samples/AZX_Docs/html/azx__log_8h.js index 6c1d00e..7be6f89 100644 --- a/Samples/AZX_Docs/html/azx__log_8h.js +++ b/Samples/AZX_Docs/html/azx__log_8h.js @@ -17,19 +17,17 @@ var azx__log_8h = [ "AZX_LOG_TO_MAX", "group__log_conf.html#gga03b618927cb5d884386832ab76781760acd8c06c121bab2a0f3aede4b76afde39", null ] ] ], [ "AZX_LOG_LEVEL_E", "group__log_conf.html#gae9fa7be40e4fcae6093707def57f82a5", [ + [ "AZX_LOG_LEVEL_NONE", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a8f609b972c7fd17cec42b2c216dc68b4", null ], [ "AZX_LOG_LEVEL_TRACE", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5adc5cc122c3a06700e09e4c6d1cc17497", null ], [ "AZX_LOG_LEVEL_DEBUG", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5aa77afa2490f92d58d965e30ce97c8048", null ], [ "AZX_LOG_LEVEL_INFO", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a2bdb3bd46fb4a347265f0c966ded4f25", null ], [ "AZX_LOG_LEVEL_WARN", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a0d4c7c18f82729850d7a1c3e35e2f0b8", null ], [ "AZX_LOG_LEVEL_ERROR", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5acc52fcbd7aa2088fe583a11661b4abf2", null ], - [ "AZX_LOG_LEVEL_CRITICAL", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a51671d346b1e7d44f8993fa9d2ca174c", null ], - [ "AZX_LOG_LEVEL_NONE", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a8f609b972c7fd17cec42b2c216dc68b4", null ] + [ "AZX_LOG_LEVEL_CRITICAL", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a51671d346b1e7d44f8993fa9d2ca174c", null ] ] ], [ "azx_log_deinit", "azx__log_8h.html#a1cff830ca498f89db8a6ba0882441231", null ], - [ "azx_log_flush_to_file", "azx__log_8h.html#a3e999a06dd697da3196e357039081124", null ], [ "azx_log_formatted", "azx__log_8h.html#a024e23064b2dc69cbeeab7b728d4d010", null ], [ "azx_log_getLevel", "azx__log_8h.html#ab2c4e9406084c9f69c1314a718cc90d8", null ], [ "azx_log_init", "group__log_conf.html#ga08e797515ecc2b71223a72c77c6dc6af", null ], - [ "azx_log_send_to_file", "azx__log_8h.html#af64520b985c9e8b97fda9dd77279bdd3", null ], [ "azx_log_setLevel", "azx__log_8h.html#a7b0daaed2d1a5700a26365e409593a4b", null ] ]; \ No newline at end of file diff --git a/Samples/AZX_Docs/html/azx__log_8h__dep__incl.map b/Samples/AZX_Docs/html/azx__log_8h__dep__incl.map index d7aea51..c582d69 100644 --- a/Samples/AZX_Docs/html/azx__log_8h__dep__incl.map +++ b/Samples/AZX_Docs/html/azx__log_8h__dep__incl.map @@ -1,4 +1,4 @@ - - + + diff --git a/Samples/AZX_Docs/html/azx__log_8h__dep__incl.png b/Samples/AZX_Docs/html/azx__log_8h__dep__incl.png index 118477f6503b87b349dc97a964825de4f0277270..bae582495f53a72a727c327c30c988557ad5a7a0 100644 GIT binary patch literal 3222 zcmcIni9b|r8$OJ8lx1W|1|f|lq-n^KN<^s`UM6EVG02j2jIqnu%bp^7DdC;0gY43v zhHS6b5|wqbMJCI{Sikdq-~0Uu-|zg+d4A`4e&^iRb6@wl?&~C)p>Oc>i1Ppdz<<-o zz#JT-z|;2#CwR5)XU2j9)amvO1K{xAM?q^zCIIl=zG_0!gZOU`3sZre$sq&zo;ng z-|C`rU?>391$4H-}AB@oL|+4}2qxothJGzt<1!K23acenQU_HeupI=Gk| z^D>#;v$M0W%$N4q8(S;m!XhGEfLZAX=Yy-V=~_BEZF}oIcw{P__vle~FRzyH-Cqa$ zyQgJkU%!5>udk2fdzhM9Nukh?z3<<p#TzqhK`p1tx#@fGO z?QIM|fE20AN>6*#P$^n=YxV5FKFZA z!TUQbda86=7<;`Xc%xU_+Oz5b2e#5-ZiDTmVT%wdDk`#XAqjR=J$@`ApPBRYsiu}z zc1DJiq$39NI3r_yn~^Ha29bVl@H-7mccq^O05Z*Yq5tHSeCF!v!Ai|Qg%$N>OG}<2 z>DS8m$B(ykb#*U3|069eEjxR0d09E@mZyh@e?UNA_Z2`!TRZ1^;oSWEch=74=4Nee z?dB!{0P+Xis8+$j!8YZ@nCYXYqks2u;45T@I?Hm) zARY7v9(*;ofD{05a&mT6Noab1`}Pg*;sRF)0oeg}9uX1I z^W?0Wg@>u>K$&%ooxOeH9RUFWAj+H~DK7qUXbDed%+I?XbU(9ZSsC9{SXo)wo2EgM zuU{+sIOor3{jlYA=g!EGsV+YN=3FOi`{!u6EiVsG1o)NMHxrjwA+p6qMRI4)o|Th( z-_!F@C4sS>e)@)Gh28l0xHSfYFGh+!Ec&z@8WNH)(%+BP|Ir@H`^M%hyBMYa^D#;e z+R)t0&BcXxbMsUeZ?rpjf5I`FZ)ln2M9mhH2NAaW<4@Lm-3<>9?`UsN&?GxXunmjM<>chji?}#BV)X@iViipPcr|!W66Q8kY|`D` zt*x!CF5V}37o7h3He4s}uIXjgaD{zy!jHtnL^vFttLfv=;5*Y4xcn?Pmx6hH-~YVo zm{nU6IHzxH%*W-muf!M?sf`=9H82m}QMhb)+w3wraut6#Mxq{^F{bu=`HogYp( zkY>mNSCAzn91dq``Q)lh!Qj0YFJ3S%C4LsohK`A1u~<)WV+Dnh&Q1e~@8^ZLo%Pft z|B*Hy2;m|b?G{zut|Y%0qpYMM@;F$gNx6`}_6YBr8YDQ7+qub7NEv*}+P& zxVvIc@*^R2qCHeBWOYKKg=q5nlf-7oHABMy$0@+eP}HdsDk3^6vE_iRFp^24LPIae z=pJJI;dDR7o!xd-elx|@iH1Q}0PR}r*_o}%1u~wY5T${>D*^cHnv%22y5~_+|11EM$xl0 zlcN5nF!ucBGF50-ZF=^7)68Ar4uy^m;yBNE4hKK~$snc@2l8^n$Yh20y~S+To0d*) zkVcfX4;~S3ci(FT0JykF;@m3s-`!t+>qt788pjC`SF|8NSNAy7HeqheT6mKQf&Z_a z=s~YS|8F<%pql!MBJEGqwC|})i}!KYC3T+?;Ykkgo{j8W>4)mb%FDZUiV8y?v9g?F zSdTOS7Dw7YfNt|m`)WBx?z6VfPfSdR#ZfRy4>7b;2n0e?^HVP_AOi?w)VovkNIHDN_-8MIeJBB0*6IRB~YvlIfkowoI`An+s!(}sXW~&#*%l=Fxt#>Q5 zwzPP7dU8Xd<`x##Do<#*cYc@D)d`Fb$vm+yi;7~iB~2+9p|y&N3b0*#S|W4`wzs#h zZ)|i!z7v{23AnPeSO_Zg>F=`}?4GCRm`o0&u+2$G?p;lQO0zVq=EBZSS{F!tBRfb)D`YTQh3&<}O%G3Ms}Kc{KR z*orhY0Zw2tV)w_dU%y;>o|r7D-0;%a&GmU33~C)YI(jl}qi<&?B=c@zCQi>@V>#yX z<;!5kyR12FZEcgc#3Nm*tE!MFln_v0rs(ACEG#TM=if-fb@lcRFA)rSnQez}!S_Z- zN6X!QlJ*-vw4?6+mj=64P$}6XSjXhbcyvi7{L~!|pf`_j0fnk=Xs}WdyO2ACFdQt6?qjSIa!@r`5a=P`;RAj4C1dVJ5E z_e9eO-WVjlq@<+2UK4ot<;(8kU?G)CMWfMvetr@fUNTOq_D#d%d!(PQGE6`Ex*N@|nh;kZ)tm=g~#Z{ja* zJ>&!w?18!2SI6XQ-@Lh7NCM04e&C+_yZ$S-+MJ+2{`yDT&XK?FDH1^E{ExB-KlcR< z_U3Xnb&mnFs=fC+1|yfb-m+=ed8l@6Y%CKG*kqU)Pm#$=(_wCMyO2 z0L0b?aT%P$z&B){0QjwZQ|1Crd#|6jMgaU@<3(dB9stBY*dpML5qa$Vm`jdMa+Ct! zBQ9L~{n8(OT5Su>OUhhAWuM;777&1_hsi<>=qI^~P zsb2eqJ%R$_Pfw^=Cb(SXj)#Shr0?vakd+HW{TAYDcdu0z9mr{ zkH=ro9Hdf3f&M(x_t>>r27^JT(~GRr9}n{ev|kn#QF9w>YK$~AEL9%?6e|8G636vT zH1{$vCOB?4izumUXp|$#O|M=d2#x}jD(_AM1B0olsnylh(b3U$&BOUteInk=M`k|` z4LQ5Ij?!o=OAX7K8XEZ~sFy?{n$@2V;*_o9vAs2&PIxR3r)*{xHA3`-?QTuKc6tMR zo$brza=H5Y`j(cKtbu~bx?m&*Q{B)I<=}7_Ylp)%B`1pjZ(VD?mloi(baeW=ySI63 z1L9(0dHMOjchtu6cWE?Qf`~--%xcUIr~bo-t*xyeT%Je6owMs7En;F~3UJ#5(==7@ z9Jw_%nLr?1(8OOTIh69MqCy8uW#jv2@gq9X-wCCj*cqwUKF-cV&x~&8T<~*qb3-76 z025PFh0~b1&sUHe9FAX=3!rCYWSPka{}G`|!aEqNNEZ> zy!qVM*H>R(kHg^tjLp>4rjwO$Wfc`*?qU)Wn?HU;ELQ!3vG*o@oZU<2M@B^n0%=xi z;g+g2qHj;x#f13yGPa0f1OPD6^{(Z2LPG_Cy$LFZQaH<#x_GL9pkR&e&M-38$;k;- z@4k1Me~?5Xb#!*Fae3*`?XEmZM@I+!Rt=d9tCy3M)H5(JFQPF5jGe4XFI%KNlK^oz z4d3E&H#Ro@Xvo$@mekH;P6O3-bucay&peoER};0l#AGtTGAo$fxuh|J#=_yvW5MJ` zf12v|uV6<92C}EqVYnY(;h_Qz%S}6TnA01tj0_E{!41->VKd!QuX`z!yQbh_;asj4 zd$dLaY@_mWZ*Ok}1%;WJnbX3quCC8<+c(i}n)u%@UL2gqB$}hPes}>Nuxpw?G-u=n z3WX{xETmr*g8wEZRqj?7H1PZ^nYViW_U$)Rn>kFRkB@qGkAk9N6MDuDi^XCv>!h#+ zyYuJG%*;wlN=OY2$@lIFrCB*RJ8K?F0U?~kvJ|x91n#<) zKhMikUxor9;o*}+-}7M0H8kvWq{$V;a7Ms3QaBq~4Ymzf&g$wXr}d8>y%8N9-I@f! zoIb0oyNtgG6@@@F@DC4qMzM`_vUBtE`>yG|eEHHia1`MurCP&it7fySS~Uu52h!DgoJeU{(2Ax(|2XHod?N>|E8qH-b(Yr+B^H+w=y=} zf`cpDr}Xec&RB%dVDq1m!d}4b&SDYSwC3wSv#I+HJm^#VgajI8Ax-2FWe9}zp18HL za=fSeQ@KKFJ%g6N*WBwAAP<{3{wQa6rN!!<9NEEP_3+WiJ?99Hr;IjS%;ZC>R@`$9+9}a_F?Ge45P~H$7BPsM53olY3kt#eJjBmAP^tK(~9oRp< z#jb;=&HkByAz4_oVvk!IiZ4sN~1&*!q< z%}hU)s$JULoJ`){sa%Lj4#&J29v+K)@GgvO?p4RZCm7omyDIzFg`9ccJ`@}4K%k3? z9w&U6ot;#|s#7{y9HsFT1iq;$l)qy}XAEx109!k(%qOoJf0*ag2?}{5=*qTwUvIev^vv6-%j=P^bBs?$ZCIG@~&)hx--4#xvr}mNN>`q)WG22VD#%S z@srkMkRh9!o58&x`vd1Bh0;64MMY8J;j9o7CU2LSAMu?|pin4TSy^(Yfl zW##1%2qX-Jx=O+v%kI&rtp6%)Z*R}kc1I$~5i3(GD=5GO&Flj6fb^|a#tb`*F|{;7 z7QUvey)UuFS}6w894`!q!!t88XR9$oz0ojZL$zWK{fVfk=%JK*?)o+-q?JrUD8s{b zwY8jr*xj1}0pNAh2QtLH&TNi{3dEgLeIyT!{y-!?R=!WA+FDz8_T`?EIB>w($!QN| zZmx{8;o#s9ibi*_tE;Qm*D;T5+OAiPj*USQ5ktlA19>kHswgyC>)0_+(4m;QjH03< zM=hg~%hP_3@%XTbbk^MF`uv~}+}}|4)AR$W<6F^Cr>_f@-m?Banj;EsB!dq&=MRxcu*`ceq2FG2}$&!c4r=+jOE9usq{53x3vl3si2hj zs2@r}6wz`52&j`MfA;IcG8XzTg^z!JbEUNs)5 z+}$r^KCvs#H4dCw~I)7@+9}K(b!*-R%ur}6=D(;6m&1{mAjJ@7$iSGUkSJM zjYK+aQJz~Lc>gJP^G~i<6L&V3PIqjn@OxNw478zvwK(CtpIjQGpQ*gV6FB& zj9fcUlQe<7_%HQDHcfUVoAk - - - + + + diff --git a/Samples/AZX_Docs/html/azx__log_8h__incl.png b/Samples/AZX_Docs/html/azx__log_8h__incl.png index 986f6f333c3bf3e829d4280153628cba11bf45cc..f623d5e582e4cb223f45e4d4bd890a5a175a65ce 100644 GIT binary patch literal 5387 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 literal 5138 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 diff --git a/Samples/AZX_Docs/html/azx__log_8h_source.html b/Samples/AZX_Docs/html/azx__log_8h_source.html index 5a0bc6d..1255c0c 100644 --- a/Samples/AZX_Docs/html/azx__log_8h_source.html +++ b/Samples/AZX_Docs/html/azx__log_8h_source.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
@@ -95,115 +95,107 @@
azx_log.h
-Go to the documentation of this file.
1 /*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/
-
2 /* See LICENSE file in the project root for full license information. */
-
3 
-
4 #ifndef HDR_AZX_LOG_H_
-
5 #define HDR_AZX_LOG_H_
-
6 
-
19 #include "m2mb_types.h"
-
20 #include "app_cfg.h"
-
21 
-
22 /* Global declarations =======================================================*/
+Go to the documentation of this file.
1 /* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */
+
2 /* See LICENSE file in the project root for full license information. */
+
3 #ifndef HDR_AZX_LOG_H_
+
4 #define HDR_AZX_LOG_H_
+
5 
+
18 #include "m2mb_types.h"
+
19 #include "app_cfg.h"
+
20 
+
21 /* Global declarations =======================================================*/
+
22 
23 
-
24 
-
25 /* Global typedefs ===========================================================*/
-
26 
-
41 typedef enum
-
42 {
- - - - - - - - +
24 /* Global typedefs ===========================================================*/
+
25 
+
40 typedef enum
+
41 {
+ + + + + + + + +
50 
51 
-
52 
-
57 typedef enum
-
58 {
- - - - -
64  AZX_LOG_MAX_ERROR_LEN
- -
66 
-
68 typedef INT32 (*_azx_log_function)(const char *, void*);
+
56 typedef enum
+
57 {
+ + + + +
63  AZX_LOG_MAX_ERROR_LEN
+ +
65 
+
67 typedef INT32 (*_azx_log_function)(const char *, void*);
+
68 
69 
-
70 
-
75 typedef enum
-
76 {
- - - - -
82  AZX_LOG_TO_MAX
- +
74 typedef enum
+
75 {
+ + + + +
81  AZX_LOG_TO_MAX
+ +
83 
84 
-
85 
-
91 typedef struct
-
92 {
- - -
95  BOOLEAN log_colours;
- +
90 typedef struct
+
91 {
+ + +
94  BOOLEAN log_colours;
+ +
96 
97 
-
98 
-
99 /* Global functions ==========================================================*/
-
100 
-
101 /*INTERNAL FUNCTION, used by public macros*/
-
131 INT32 azx_log_formatted(AZX_LOG_LEVEL_E level,
-
132  const CHAR *function, const CHAR *file, int line, const CHAR *fmt, ... );
-
133 
-
134 /* Public functions ==========================================================*/
-
135 
-
162 void azx_log_init(AZX_LOG_CFG_T *cfg);
-
163 
-
180 INT32 azx_log_deinit(void);
-
181 
- -
196 
- -
211 
-
234 BOOLEAN azx_log_send_to_file(const CHAR* filename, UINT32 circular_chunks,
-
235  AZX_LOG_LEVEL_E min_level, UINT32 max_size_kb);
-
236 
-
243 void azx_log_flush_to_file(void);
-
244 
-
245 #endif /* HDR_AZX_LOG_H_ */
+
98 /* Global functions ==========================================================*/
+
99 
+
100 /*INTERNAL FUNCTION, used by public macros*/
+
130 INT32 azx_log_formatted(AZX_LOG_LEVEL_E level,
+
131  const CHAR *function, const CHAR *file, int line, const CHAR *fmt, ... );
+
132 
+
133 /* Public functions ==========================================================*/
+
134 
+
161 void azx_log_init(AZX_LOG_CFG_T *cfg);
+
162 
+
179 INT32 azx_log_deinit(void);
+
180 
+ +
195 
+ +
210 
+
211 #endif /* HDR_AZX_LOG_H_ */
-
Definition: azx_log.h:62
+
Definition: azx_log.h:61
Definition: azx_log.h:46
-
Definition: azx_log.h:61
-
Definition: azx_log.h:77
-
AZX_LOG_LEVEL_E log_level
Definition: azx_log.h:93
-
void azx_log_flush_to_file(void)
Flushes any outstanding logs to the file.
-
Definition: azx_log.h:60
-
Definition: azx_log.h:49
-
Definition: azx_log.h:80
-
AZX_LOG_HANDLE_E
Logging output channels.
Definition: azx_log.h:75
+
Definition: azx_log.h:60
+
Definition: azx_log.h:76
+
AZX_LOG_LEVEL_E log_level
Definition: azx_log.h:92
+
Definition: azx_log.h:59
+
Definition: azx_log.h:42
+
Definition: azx_log.h:79
+
AZX_LOG_HANDLE_E
Logging output channels.
Definition: azx_log.h:74
Definition: azx_log.h:44
-
Logging configuration structure.
Definition: azx_log.h:91
-
BOOLEAN azx_log_send_to_file(const CHAR *filename, UINT32 circular_chunks, AZX_LOG_LEVEL_E min_level, UINT32 max_size_kb)
Gets the logging component to output to a file.
-
Definition: azx_log.h:59
+
Logging configuration structure.
Definition: azx_log.h:90
+
Definition: azx_log.h:58
Definition: azx_log.h:47
-
Definition: azx_log.h:78
+
Definition: azx_log.h:77
Application configuration settings conveniently located here.
INT32 azx_log_deinit(void)
Deinitializes the log functionality.
Definition: azx_log.h:45
void azx_log_setLevel(AZX_LOG_LEVEL_E level)
Sets the new log level to be used.
void azx_log_init(AZX_LOG_CFG_T *cfg)
Initializes the log functionality.
-
AZX_LOG_LEVEL_E
Logging levels.
Definition: azx_log.h:41
+
AZX_LOG_LEVEL_E
Logging levels.
Definition: azx_log.h:40
AZX_LOG_LEVEL_E azx_log_getLevel(void)
Returns the current value of the log level.
-
AZX_LOG_HANDLE_E log_channel
Definition: azx_log.h:94
-
AZX_LOG_ERRORS_E
Logging errors.
Definition: azx_log.h:57
+
AZX_LOG_HANDLE_E log_channel
Definition: azx_log.h:93
+
AZX_LOG_ERRORS_E
Logging errors.
Definition: azx_log.h:56
Definition: azx_log.h:48
-
BOOLEAN log_colours
Definition: azx_log.h:95
+
BOOLEAN log_colours
Definition: azx_log.h:94
Definition: azx_log.h:43
-
Definition: azx_log.h:79
+
Definition: azx_log.h:78
@@ -134,16 +134,16 @@ const CHAR * azx_hex_dump (const void *data, UINT32 len)  Dumps HEX data to string. More...
  -void azx_reboot_now (void) - Reboots the modem straight away. More...
-  -void azx_shutdown_now (void) - Shuts the modem down straight away. More...
-  +void azx_reboot_now () + Reboots the modem straight away. More...
+  +void azx_shutdown_now () + Shuts the modem down straight away. More...

Detailed Description

Various helpful utilities.

-
Version
1.0.1
+
Version
1.0.0
Dependencies
azx_log
Author
Ioannis Demetriou
@@ -236,8 +236,8 @@

-

◆ azx_reboot_now()

+ +

◆ azx_reboot_now()

@@ -245,7 +245,6 @@

void azx_reboot_now ( - void  ) @@ -258,8 +257,8 @@

-

◆ azx_shutdown_now()

+ +

◆ azx_shutdown_now()

@@ -267,7 +266,6 @@

void azx_shutdown_now ( - void  ) diff --git a/Samples/AZX_Docs/html/azx__utils_8h.js b/Samples/AZX_Docs/html/azx__utils_8h.js index a3f3fdf..7c2ce53 100644 --- a/Samples/AZX_Docs/html/azx__utils_8h.js +++ b/Samples/AZX_Docs/html/azx__utils_8h.js @@ -3,7 +3,7 @@ var azx__utils_8h = [ "AZX_LIMIT", "azx__utils_8h.html#ae63391c8b40ed84ad60e84ed2386d1f9", null ], [ "AZX_UTILS_HEX_DUMP_BUFFER_SIZE", "azx__utils_8h.html#a8c7358115439ddd523797f3d027df1f2", null ], [ "azx_hex_dump", "azx__utils_8h.html#a079fc61e9774e7c7b178ddcc67617a0f", null ], - [ "azx_reboot_now", "azx__utils_8h.html#a75795b5fabfb2be85fc105df383a82bf", null ], - [ "azx_shutdown_now", "azx__utils_8h.html#aeaea36b3c4e80ad8a22f172aa36542df", null ], + [ "azx_reboot_now", "azx__utils_8h.html#a8fb8f6f485efbdbc31fc02942faf3a89", null ], + [ "azx_shutdown_now", "azx__utils_8h.html#ae6a6a38c2fdd6b84d9ef00b88690c97d", null ], [ "azx_sleep_ms", "azx__utils_8h.html#adf8be666cb37d5c4d1c9c4b9694e2de5", null ] ]; \ No newline at end of file diff --git a/Samples/AZX_Docs/html/azx__utils_8h__incl.map b/Samples/AZX_Docs/html/azx__utils_8h__incl.map index 41ba6c3..a0e7a24 100644 --- a/Samples/AZX_Docs/html/azx__utils_8h__incl.map +++ b/Samples/AZX_Docs/html/azx__utils_8h__incl.map @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/Samples/AZX_Docs/html/azx__utils_8h__incl.png b/Samples/AZX_Docs/html/azx__utils_8h__incl.png index 73faea67e4754e2415f3a2dd8ca810a43d7d4e5a..be4fcb99df3f2f1db5c439bbff9e4256eb5016cb 100644 GIT binary patch literal 9375 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 F{Vzxu8kGP5 diff --git a/Samples/AZX_Docs/html/azx__utils_8h_source.html b/Samples/AZX_Docs/html/azx__utils_8h_source.html index f15ea84..a0c173f 100644 --- a/Samples/AZX_Docs/html/azx__utils_8h_source.html +++ b/Samples/AZX_Docs/html/azx__utils_8h_source.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
@@ -95,40 +95,39 @@
azx_utils.h

-Go to the documentation of this file.
1 /*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/
-
2 /* See LICENSE file in the project root for full license information. */
-
3 
-
4 #ifndef HDR_M2M_UTILS_H_
-
5 #define HDR_M2M_UTILS_H_
-
6 
-
16 #include "m2mb_types.h"
-
17 #include "azx_log.h"
+Go to the documentation of this file.
1 /* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */
+
2 /* See LICENSE file in the project root for full license information. */
+
3 #ifndef HDR_M2M_UTILS_H_
+
4 #define HDR_M2M_UTILS_H_
+
5 
+
15 #include "m2mb_types.h"
+
16 #include "azx_log.h"
+
17 
18 
-
19 
-
32 #define AZX_LIMIT(val, min, max) (val = (val < (min) ? (min) : (val > (max) ? (max) : val)))
-
33 
-
41 void azx_sleep_ms(UINT32 ms);
-
42 
-
43 /* @{ */
-
44 #define AZX_UTILS_HEX_DUMP_BUFFER_SIZE 250
-
45 
-
57 const CHAR* azx_hex_dump(const void* data, UINT32 len);
-
70 /*-----------------------------------------------------------------------------------------------*/
-
71 void azx_reboot_now(void);
-
72 
-
83 /*-----------------------------------------------------------------------------------------------*/
-
84 void azx_shutdown_now(void);
+
31 #define AZX_LIMIT(val, min, max) (val = (val < (min) ? (min) : (val > (max) ? (max) : val)))
+
32 
+
40 void azx_sleep_ms(UINT32 ms);
+
41 
+
42 /* @{ */
+
43 #define AZX_UTILS_HEX_DUMP_BUFFER_SIZE 250
+
44 
+
56 const CHAR* azx_hex_dump(const void* data, UINT32 len);
+
69 /*-----------------------------------------------------------------------------------------------*/
+
70 void azx_reboot_now();
+
71 
+
82 /*-----------------------------------------------------------------------------------------------*/
+
83 void azx_shutdown_now();
+
84 
85 
86 
87 
-
88 
-
89 #endif /* HDR_AZX_UTILS_H_ */
+
88 #endif /* HDR_AZX_UTILS_H_ */
void azx_sleep_ms(UINT32 ms)
Puts the task to sleep for a specified time.
-
void azx_reboot_now(void)
Reboots the modem straight away.
-
void azx_shutdown_now(void)
Shuts the modem down straight away.
+
void azx_shutdown_now()
Shuts the modem down straight away.
Logging utilities to print on available output channels.
+
void azx_reboot_now()
Reboots the modem straight away.
const CHAR * azx_hex_dump(const void *data, UINT32 len)
Dumps HEX data to string.
diff --git a/Samples/AZX_Docs/html/classes.html b/Samples/AZX_Docs/html/classes.html index a7181ec..dd815f0 100644 --- a/Samples/AZX_Docs/html/classes.html +++ b/Samples/AZX_Docs/html/classes.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
diff --git a/Samples/AZX_Docs/html/dir_0045f852bf8045b6d5abd9c9eb54a446.html b/Samples/AZX_Docs/html/dir_0045f852bf8045b6d5abd9c9eb54a446.html index fc1a3bc..39f49a0 100644 --- a/Samples/AZX_Docs/html/dir_0045f852bf8045b6d5abd9c9eb54a446.html +++ b/Samples/AZX_Docs/html/dir_0045f852bf8045b6d5abd9c9eb54a446.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
diff --git a/Samples/AZX_Docs/html/files.html b/Samples/AZX_Docs/html/files.html index 4a439a2..dced1ec 100644 --- a/Samples/AZX_Docs/html/files.html +++ b/Samples/AZX_Docs/html/files.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
diff --git a/Samples/AZX_Docs/html/functions.html b/Samples/AZX_Docs/html/functions.html index 436f287..4075523 100644 --- a/Samples/AZX_Docs/html/functions.html +++ b/Samples/AZX_Docs/html/functions.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
diff --git a/Samples/AZX_Docs/html/functions_vars.html b/Samples/AZX_Docs/html/functions_vars.html index 23831fa..02a3bb0 100644 --- a/Samples/AZX_Docs/html/functions_vars.html +++ b/Samples/AZX_Docs/html/functions_vars.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
diff --git a/Samples/AZX_Docs/html/globals.html b/Samples/AZX_Docs/html/globals.html index 0042459..b164b43 100644 --- a/Samples/AZX_Docs/html/globals.html +++ b/Samples/AZX_Docs/html/globals.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
@@ -118,9 +118,6 @@

- a -

  • AZX_LOG_ERRORS_E : azx_log.h
  • -
  • azx_log_flush_to_file() -: azx_log.h -
  • azx_log_getLevel() : azx_log.h
  • @@ -166,9 +163,6 @@

    - a -

    • AZX_LOG_NOT_INIT : azx_log.h
    • -
    • azx_log_send_to_file() -: azx_log.h -
    • azx_log_setLevel() : azx_log.h
    • @@ -194,10 +188,10 @@

      - a -

        : app_cfg.h
      • azx_reboot_now() -: azx_utils.h +: azx_utils.h
      • azx_shutdown_now() -: azx_utils.h +: azx_utils.h
      • azx_sleep_ms() : azx_utils.h diff --git a/Samples/AZX_Docs/html/globals_defs.html b/Samples/AZX_Docs/html/globals_defs.html index c9b3564..33af509 100644 --- a/Samples/AZX_Docs/html/globals_defs.html +++ b/Samples/AZX_Docs/html/globals_defs.html @@ -34,7 +34,7 @@ Logo
        AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
        A set of companion utilities that make AZ development easier
        diff --git a/Samples/AZX_Docs/html/globals_enum.html b/Samples/AZX_Docs/html/globals_enum.html index 26d9fc8..7a568a4 100644 --- a/Samples/AZX_Docs/html/globals_enum.html +++ b/Samples/AZX_Docs/html/globals_enum.html @@ -34,7 +34,7 @@ Logo
        AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
        A set of companion utilities that make AZ development easier
        diff --git a/Samples/AZX_Docs/html/globals_eval.html b/Samples/AZX_Docs/html/globals_eval.html index e57feea..90d1a74 100644 --- a/Samples/AZX_Docs/html/globals_eval.html +++ b/Samples/AZX_Docs/html/globals_eval.html @@ -34,7 +34,7 @@ Logo
        AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
        A set of companion utilities that make AZ development easier
        diff --git a/Samples/AZX_Docs/html/globals_func.html b/Samples/AZX_Docs/html/globals_func.html index c41fc9f..0f1ac2a 100644 --- a/Samples/AZX_Docs/html/globals_func.html +++ b/Samples/AZX_Docs/html/globals_func.html @@ -34,7 +34,7 @@ Logo
        AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
        A set of companion utilities that make AZ development easier
        @@ -98,26 +98,20 @@
      • azx_log_deinit() : azx_log.h
      • -
      • azx_log_flush_to_file() -: azx_log.h -
      • azx_log_getLevel() : azx_log.h
      • azx_log_init() : azx_log.h
      • -
      • azx_log_send_to_file() -: azx_log.h -
      • azx_log_setLevel() : azx_log.h
      • azx_reboot_now() -: azx_utils.h +: azx_utils.h
      • azx_shutdown_now() -: azx_utils.h +: azx_utils.h
      • azx_sleep_ms() : azx_utils.h diff --git a/Samples/AZX_Docs/html/graph_legend.html b/Samples/AZX_Docs/html/graph_legend.html index 3d1afe1..64b48fc 100644 --- a/Samples/AZX_Docs/html/graph_legend.html +++ b/Samples/AZX_Docs/html/graph_legend.html @@ -34,7 +34,7 @@ Logo
        AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
        A set of companion utilities that make AZ development easier
        diff --git a/Samples/AZX_Docs/html/graph_legend.png b/Samples/AZX_Docs/html/graph_legend.png index 81788d8b778e11ebf43d6a041820fcaf7ec9a65e..93e2541d73de9e052b80ade28e9f2742fd791833 100644 GIT binary patch literal 19906 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%0Av4SqcN@e|5`jp~UDrU|Bek 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
        AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
        A set of companion utilities that make AZ development easier
        @@ -105,14 +105,14 @@

        Enumerations

        enum  AZX_LOG_LEVEL_E {
        -  AZX_LOG_LEVEL_TRACE = 1, +  AZX_LOG_LEVEL_NONE = 0, +AZX_LOG_LEVEL_TRACE = 1, AZX_LOG_LEVEL_DEBUG = 2, AZX_LOG_LEVEL_INFO = 3, -AZX_LOG_LEVEL_WARN = 4,
        -  AZX_LOG_LEVEL_ERROR = 5, -AZX_LOG_LEVEL_CRITICAL = 6, -AZX_LOG_LEVEL_NONE = 0x7F +  AZX_LOG_LEVEL_WARN = 4, +AZX_LOG_LEVEL_ERROR = 5, +AZX_LOG_LEVEL_CRITICAL = 6
        }  Logging levels. More...
        @@ -178,7 +178,9 @@

        -EnumeratorAZX_LOG_LEVEL_TRACE 

        Prints every message, adds a "TRACE" at the beginning of the message

        +EnumeratorAZX_LOG_LEVEL_NONE 

        Do not print anything

        + +AZX_LOG_LEVEL_TRACE 

        Prints every message, adds a "TRACE" at the beginning of the message

        AZX_LOG_LEVEL_DEBUG 

        Prints most of the messages, adds a "DEBUG" at the beginning of the message

        @@ -190,8 +192,6 @@

        AZX_LOG_LEVEL_CRITICAL 

        like DEBUG, but adds an "CRITICAL" at the beginning of the message

        -AZX_LOG_LEVEL_NONE 

        Do not print anything

        -

diff --git a/Samples/AZX_Docs/html/group__log_conf.js b/Samples/AZX_Docs/html/group__log_conf.js index 07cb9ac..be7bf93 100644 --- a/Samples/AZX_Docs/html/group__log_conf.js +++ b/Samples/AZX_Docs/html/group__log_conf.js @@ -7,13 +7,13 @@ var group__log_conf = [ "AZX_LOG_TO_USB1", "group__log_conf.html#gga03b618927cb5d884386832ab76781760ab87a0049b27ce615b28ea77f51118286", null ] ] ], [ "AZX_LOG_LEVEL_E", "group__log_conf.html#gae9fa7be40e4fcae6093707def57f82a5", [ + [ "AZX_LOG_LEVEL_NONE", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a8f609b972c7fd17cec42b2c216dc68b4", null ], [ "AZX_LOG_LEVEL_TRACE", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5adc5cc122c3a06700e09e4c6d1cc17497", null ], [ "AZX_LOG_LEVEL_DEBUG", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5aa77afa2490f92d58d965e30ce97c8048", null ], [ "AZX_LOG_LEVEL_INFO", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a2bdb3bd46fb4a347265f0c966ded4f25", null ], [ "AZX_LOG_LEVEL_WARN", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a0d4c7c18f82729850d7a1c3e35e2f0b8", null ], [ "AZX_LOG_LEVEL_ERROR", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5acc52fcbd7aa2088fe583a11661b4abf2", null ], - [ "AZX_LOG_LEVEL_CRITICAL", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a51671d346b1e7d44f8993fa9d2ca174c", null ], - [ "AZX_LOG_LEVEL_NONE", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a8f609b972c7fd17cec42b2c216dc68b4", null ] + [ "AZX_LOG_LEVEL_CRITICAL", "group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a51671d346b1e7d44f8993fa9d2ca174c", null ] ] ], [ "azx_log_init", "group__log_conf.html#ga08e797515ecc2b71223a72c77c6dc6af", null ] ]; \ No newline at end of file diff --git a/Samples/AZX_Docs/html/group__log_usage.html b/Samples/AZX_Docs/html/group__log_usage.html index c55f4d6..ed6b6cd 100644 --- a/Samples/AZX_Docs/html/group__log_usage.html +++ b/Samples/AZX_Docs/html/group__log_usage.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
diff --git a/Samples/AZX_Docs/html/index.html b/Samples/AZX_Docs/html/index.html index f1afe74..ffab556 100644 --- a/Samples/AZX_Docs/html/index.html +++ b/Samples/AZX_Docs/html/index.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
diff --git a/Samples/AZX_Docs/html/modules.html b/Samples/AZX_Docs/html/modules.html index a69e48c..55a92ed 100644 --- a/Samples/AZX_Docs/html/modules.html +++ b/Samples/AZX_Docs/html/modules.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
diff --git a/Samples/AZX_Docs/html/navtreeindex0.js b/Samples/AZX_Docs/html/navtreeindex0.js index 85ea36b..a774aec 100644 --- a/Samples/AZX_Docs/html/navtreeindex0.js +++ b/Samples/AZX_Docs/html/navtreeindex0.js @@ -9,21 +9,19 @@ var NAVTREEINDEX0 = "app__cfg_8h.html#a4af7b5c67a5df4ffbcafe9a91a4677bc":[3,0,0,0,4], "app__cfg_8h_source.html":[3,0,0,0], "azx__log_8h.html":[3,0,0,1], -"azx__log_8h.html#a024e23064b2dc69cbeeab7b728d4d010":[3,0,0,1,7], +"azx__log_8h.html#a024e23064b2dc69cbeeab7b728d4d010":[3,0,0,1,6], "azx__log_8h.html#a0b1d083f518b1fac0659671b6b744bff":[3,0,0,1,1], "azx__log_8h.html#a1cff830ca498f89db8a6ba0882441231":[3,0,0,1,5], -"azx__log_8h.html#a3e999a06dd697da3196e357039081124":[3,0,0,1,6], -"azx__log_8h.html#a7b0daaed2d1a5700a26365e409593a4b":[3,0,0,1,11], -"azx__log_8h.html#ab2c4e9406084c9f69c1314a718cc90d8":[3,0,0,1,8], -"azx__log_8h.html#af64520b985c9e8b97fda9dd77279bdd3":[3,0,0,1,10], +"azx__log_8h.html#a7b0daaed2d1a5700a26365e409593a4b":[3,0,0,1,9], +"azx__log_8h.html#ab2c4e9406084c9f69c1314a718cc90d8":[3,0,0,1,7], "azx__log_8h_source.html":[3,0,0,1], "azx__utils_8h.html":[3,0,0,2], "azx__utils_8h.html#a079fc61e9774e7c7b178ddcc67617a0f":[3,0,0,2,2], -"azx__utils_8h.html#a75795b5fabfb2be85fc105df383a82bf":[3,0,0,2,3], "azx__utils_8h.html#a8c7358115439ddd523797f3d027df1f2":[3,0,0,2,1], +"azx__utils_8h.html#a8fb8f6f485efbdbc31fc02942faf3a89":[3,0,0,2,3], "azx__utils_8h.html#adf8be666cb37d5c4d1c9c4b9694e2de5":[3,0,0,2,5], "azx__utils_8h.html#ae63391c8b40ed84ad60e84ed2386d1f9":[3,0,0,2,0], -"azx__utils_8h.html#aeaea36b3c4e80ad8a22f172aa36542df":[3,0,0,2,4], +"azx__utils_8h.html#ae6a6a38c2fdd6b84d9ef00b88690c97d":[3,0,0,2,4], "azx__utils_8h_source.html":[3,0,0,2], "classes.html":[2,1], "dir_0045f852bf8045b6d5abd9c9eb54a446.html":[3,0,0], @@ -38,8 +36,8 @@ var NAVTREEINDEX0 = "group__log_conf.html":[1,0], "group__log_conf.html#ga03b618927cb5d884386832ab76781760":[3,0,0,1,3], "group__log_conf.html#ga03b618927cb5d884386832ab76781760":[1,0,0], +"group__log_conf.html#ga08e797515ecc2b71223a72c77c6dc6af":[3,0,0,1,8], "group__log_conf.html#ga08e797515ecc2b71223a72c77c6dc6af":[1,0,2], -"group__log_conf.html#ga08e797515ecc2b71223a72c77c6dc6af":[3,0,0,1,9], "group__log_conf.html#gae9fa7be40e4fcae6093707def57f82a5":[1,0,1], "group__log_conf.html#gae9fa7be40e4fcae6093707def57f82a5":[3,0,0,1,4], "group__log_conf.html#gga03b618927cb5d884386832ab76781760a0af771a438449471f0f1fb0a6e5d65d4":[3,0,0,1,3,1], @@ -51,29 +49,29 @@ var NAVTREEINDEX0 = "group__log_conf.html#gga03b618927cb5d884386832ab76781760ab87a0049b27ce615b28ea77f51118286":[3,0,0,1,3,3], "group__log_conf.html#gga03b618927cb5d884386832ab76781760ab87a0049b27ce615b28ea77f51118286":[1,0,0,3], "group__log_conf.html#gga03b618927cb5d884386832ab76781760acd8c06c121bab2a0f3aede4b76afde39":[3,0,0,1,3,4], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a0d4c7c18f82729850d7a1c3e35e2f0b8":[3,0,0,1,4,3], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a0d4c7c18f82729850d7a1c3e35e2f0b8":[1,0,1,3], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a2bdb3bd46fb4a347265f0c966ded4f25":[3,0,0,1,4,2], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a2bdb3bd46fb4a347265f0c966ded4f25":[1,0,1,2], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a51671d346b1e7d44f8993fa9d2ca174c":[3,0,0,1,4,5], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a51671d346b1e7d44f8993fa9d2ca174c":[1,0,1,5], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a8f609b972c7fd17cec42b2c216dc68b4":[3,0,0,1,4,6], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a8f609b972c7fd17cec42b2c216dc68b4":[1,0,1,6], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5aa77afa2490f92d58d965e30ce97c8048":[3,0,0,1,4,1], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5aa77afa2490f92d58d965e30ce97c8048":[1,0,1,1], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5acc52fcbd7aa2088fe583a11661b4abf2":[3,0,0,1,4,4], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5acc52fcbd7aa2088fe583a11661b4abf2":[1,0,1,4], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5adc5cc122c3a06700e09e4c6d1cc17497":[3,0,0,1,4,0], -"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5adc5cc122c3a06700e09e4c6d1cc17497":[1,0,1,0], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a0d4c7c18f82729850d7a1c3e35e2f0b8":[3,0,0,1,4,4], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a0d4c7c18f82729850d7a1c3e35e2f0b8":[1,0,1,4], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a2bdb3bd46fb4a347265f0c966ded4f25":[3,0,0,1,4,3], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a2bdb3bd46fb4a347265f0c966ded4f25":[1,0,1,3], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a51671d346b1e7d44f8993fa9d2ca174c":[1,0,1,6], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a51671d346b1e7d44f8993fa9d2ca174c":[3,0,0,1,4,6], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a8f609b972c7fd17cec42b2c216dc68b4":[3,0,0,1,4,0], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a8f609b972c7fd17cec42b2c216dc68b4":[1,0,1,0], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5aa77afa2490f92d58d965e30ce97c8048":[3,0,0,1,4,2], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5aa77afa2490f92d58d965e30ce97c8048":[1,0,1,2], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5acc52fcbd7aa2088fe583a11661b4abf2":[3,0,0,1,4,5], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5acc52fcbd7aa2088fe583a11661b4abf2":[1,0,1,5], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5adc5cc122c3a06700e09e4c6d1cc17497":[3,0,0,1,4,1], +"group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5adc5cc122c3a06700e09e4c6d1cc17497":[1,0,1,1], "group__log_usage.html":[1,1], "group__log_usage.html#ga47bb701aa779a05aa34ed01fcfbbdd54":[3,0,0,0,6], "group__log_usage.html#ga47bb701aa779a05aa34ed01fcfbbdd54":[1,1,5], "group__log_usage.html#ga4cbebf6589190814b5ee9adb22bb1d44":[1,1,0], "group__log_usage.html#ga4cbebf6589190814b5ee9adb22bb1d44":[3,0,0,0,0], -"group__log_usage.html#ga81e4f03b2a752e5e9cfae1e037ce7256":[3,0,0,0,2], "group__log_usage.html#ga81e4f03b2a752e5e9cfae1e037ce7256":[1,1,2], -"group__log_usage.html#ga847d9b9f62e31bf14b31882be7418675":[1,1,3], +"group__log_usage.html#ga81e4f03b2a752e5e9cfae1e037ce7256":[3,0,0,0,2], "group__log_usage.html#ga847d9b9f62e31bf14b31882be7418675":[3,0,0,0,3], +"group__log_usage.html#ga847d9b9f62e31bf14b31882be7418675":[1,1,3], "group__log_usage.html#gaa85ac7254570a307564019c5dfb98d83":[3,0,0,0,5], "group__log_usage.html#gaa85ac7254570a307564019c5dfb98d83":[1,1,4], "group__log_usage.html#gabe77e5a2f7b57b5029c6f7cdfa7e3dd0":[1,1,6], diff --git a/Samples/AZX_Docs/html/search/all_0.js b/Samples/AZX_Docs/html/search/all_0.js index a0247ad..bc57110 100644 --- a/Samples/AZX_Docs/html/search/all_0.js +++ b/Samples/AZX_Docs/html/search/all_0.js @@ -11,33 +11,31 @@ var searchData= ['azx_5flog_5fdeinit_8',['azx_log_deinit',['../azx__log_8h.html#a1cff830ca498f89db8a6ba0882441231',1,'azx_log.h']]], ['azx_5flog_5ferror_9',['AZX_LOG_ERROR',['../group__log_usage.html#ga81e4f03b2a752e5e9cfae1e037ce7256',1,'app_cfg.h']]], ['azx_5flog_5ferrors_5fe_10',['AZX_LOG_ERRORS_E',['../group__log_usage.html#gabe77e5a2f7b57b5029c6f7cdfa7e3dd0',1,'azx_log.h']]], - ['azx_5flog_5fflush_5fto_5ffile_11',['azx_log_flush_to_file',['../azx__log_8h.html#a3e999a06dd697da3196e357039081124',1,'azx_log.h']]], - ['azx_5flog_5fgetlevel_12',['azx_log_getLevel',['../azx__log_8h.html#ab2c4e9406084c9f69c1314a718cc90d8',1,'azx_log.h']]], - ['azx_5flog_5fhandle_5fe_13',['AZX_LOG_HANDLE_E',['../group__log_conf.html#ga03b618927cb5d884386832ab76781760',1,'azx_log.h']]], - ['azx_5flog_5finfo_14',['AZX_LOG_INFO',['../group__log_usage.html#ga847d9b9f62e31bf14b31882be7418675',1,'app_cfg.h']]], - ['azx_5flog_5finit_15',['azx_log_init',['../group__log_conf.html#ga08e797515ecc2b71223a72c77c6dc6af',1,'azx_log_init(AZX_LOG_CFG_T *cfg): azx_log.h'],['../app__cfg_8h.html#a4af7b5c67a5df4ffbcafe9a91a4677bc',1,'AZX_LOG_INIT(): app_cfg.h']]], - ['azx_5flog_5flevel_5fcritical_16',['AZX_LOG_LEVEL_CRITICAL',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a51671d346b1e7d44f8993fa9d2ca174c',1,'azx_log.h']]], - ['azx_5flog_5flevel_5fdebug_17',['AZX_LOG_LEVEL_DEBUG',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5aa77afa2490f92d58d965e30ce97c8048',1,'azx_log.h']]], - ['azx_5flog_5flevel_5fe_18',['AZX_LOG_LEVEL_E',['../group__log_conf.html#gae9fa7be40e4fcae6093707def57f82a5',1,'azx_log.h']]], - ['azx_5flog_5flevel_5ferror_19',['AZX_LOG_LEVEL_ERROR',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5acc52fcbd7aa2088fe583a11661b4abf2',1,'azx_log.h']]], - ['azx_5flog_5flevel_5finfo_20',['AZX_LOG_LEVEL_INFO',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a2bdb3bd46fb4a347265f0c966ded4f25',1,'azx_log.h']]], - ['azx_5flog_5flevel_5fnone_21',['AZX_LOG_LEVEL_NONE',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a8f609b972c7fd17cec42b2c216dc68b4',1,'azx_log.h']]], - ['azx_5flog_5flevel_5ftrace_22',['AZX_LOG_LEVEL_TRACE',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5adc5cc122c3a06700e09e4c6d1cc17497',1,'azx_log.h']]], - ['azx_5flog_5flevel_5fwarn_23',['AZX_LOG_LEVEL_WARN',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a0d4c7c18f82729850d7a1c3e35e2f0b8',1,'azx_log.h']]], - ['azx_5flog_5fno_5fusb_5finstance_5favailable_24',['AZX_LOG_NO_USB_INSTANCE_AVAILABLE',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0ab7e169017c26c73457fe21f879b299f0',1,'azx_log.h']]], - ['azx_5flog_5fnot_5finit_25',['AZX_LOG_NOT_INIT',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0a12ddd7346038a59740724ffcc8c20e12',1,'azx_log.h']]], - ['azx_5flog_5fsend_5fto_5ffile_26',['azx_log_send_to_file',['../azx__log_8h.html#af64520b985c9e8b97fda9dd77279bdd3',1,'azx_log.h']]], - ['azx_5flog_5fsetlevel_27',['azx_log_setLevel',['../azx__log_8h.html#a7b0daaed2d1a5700a26365e409593a4b',1,'azx_log.h']]], - ['azx_5flog_5fto_5faux_5fuart_28',['AZX_LOG_TO_AUX_UART',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760a0af771a438449471f0f1fb0a6e5d65d4',1,'azx_log.h']]], - ['azx_5flog_5fto_5fmain_5fuart_29',['AZX_LOG_TO_MAIN_UART',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760a371b4156625be29814df43770a9150a3',1,'azx_log.h']]], - ['azx_5flog_5fto_5fusb0_30',['AZX_LOG_TO_USB0',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760a2b9fdc468ce514e4118797ad0e624841',1,'azx_log.h']]], - ['azx_5flog_5fto_5fusb1_31',['AZX_LOG_TO_USB1',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760ab87a0049b27ce615b28ea77f51118286',1,'azx_log.h']]], - ['azx_5flog_5ftrace_32',['AZX_LOG_TRACE',['../group__log_usage.html#gaa85ac7254570a307564019c5dfb98d83',1,'app_cfg.h']]], - ['azx_5flog_5fusb_5fcable_5funplugged_33',['AZX_LOG_USB_CABLE_UNPLUGGED',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0ab2beedfe225418d618c1d2e12410b72b',1,'azx_log.h']]], - ['azx_5flog_5fwarn_34',['AZX_LOG_WARN',['../group__log_usage.html#ga47bb701aa779a05aa34ed01fcfbbdd54',1,'app_cfg.h']]], - ['azx_5freboot_5fnow_35',['azx_reboot_now',['../azx__utils_8h.html#a75795b5fabfb2be85fc105df383a82bf',1,'azx_utils.h']]], - ['azx_5fshutdown_5fnow_36',['azx_shutdown_now',['../azx__utils_8h.html#aeaea36b3c4e80ad8a22f172aa36542df',1,'azx_utils.h']]], - ['azx_5fsleep_5fms_37',['azx_sleep_ms',['../azx__utils_8h.html#adf8be666cb37d5c4d1c9c4b9694e2de5',1,'azx_utils.h']]], - ['azx_5futils_2eh_38',['azx_utils.h',['../azx__utils_8h.html',1,'']]], - ['azx_20sample_20modules_20documentation_39',['AZX sample modules documentation',['../index.html',1,'']]] + ['azx_5flog_5fgetlevel_11',['azx_log_getLevel',['../azx__log_8h.html#ab2c4e9406084c9f69c1314a718cc90d8',1,'azx_log.h']]], + ['azx_5flog_5fhandle_5fe_12',['AZX_LOG_HANDLE_E',['../group__log_conf.html#ga03b618927cb5d884386832ab76781760',1,'azx_log.h']]], + ['azx_5flog_5finfo_13',['AZX_LOG_INFO',['../group__log_usage.html#ga847d9b9f62e31bf14b31882be7418675',1,'app_cfg.h']]], + ['azx_5flog_5finit_14',['azx_log_init',['../group__log_conf.html#ga08e797515ecc2b71223a72c77c6dc6af',1,'azx_log_init(AZX_LOG_CFG_T *cfg): azx_log.h'],['../app__cfg_8h.html#a4af7b5c67a5df4ffbcafe9a91a4677bc',1,'AZX_LOG_INIT(): app_cfg.h']]], + ['azx_5flog_5flevel_5fcritical_15',['AZX_LOG_LEVEL_CRITICAL',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a51671d346b1e7d44f8993fa9d2ca174c',1,'azx_log.h']]], + ['azx_5flog_5flevel_5fdebug_16',['AZX_LOG_LEVEL_DEBUG',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5aa77afa2490f92d58d965e30ce97c8048',1,'azx_log.h']]], + ['azx_5flog_5flevel_5fe_17',['AZX_LOG_LEVEL_E',['../group__log_conf.html#gae9fa7be40e4fcae6093707def57f82a5',1,'azx_log.h']]], + ['azx_5flog_5flevel_5ferror_18',['AZX_LOG_LEVEL_ERROR',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5acc52fcbd7aa2088fe583a11661b4abf2',1,'azx_log.h']]], + ['azx_5flog_5flevel_5finfo_19',['AZX_LOG_LEVEL_INFO',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a2bdb3bd46fb4a347265f0c966ded4f25',1,'azx_log.h']]], + ['azx_5flog_5flevel_5fnone_20',['AZX_LOG_LEVEL_NONE',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a8f609b972c7fd17cec42b2c216dc68b4',1,'azx_log.h']]], + ['azx_5flog_5flevel_5ftrace_21',['AZX_LOG_LEVEL_TRACE',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5adc5cc122c3a06700e09e4c6d1cc17497',1,'azx_log.h']]], + ['azx_5flog_5flevel_5fwarn_22',['AZX_LOG_LEVEL_WARN',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a0d4c7c18f82729850d7a1c3e35e2f0b8',1,'azx_log.h']]], + ['azx_5flog_5fno_5fusb_5finstance_5favailable_23',['AZX_LOG_NO_USB_INSTANCE_AVAILABLE',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0ab7e169017c26c73457fe21f879b299f0',1,'azx_log.h']]], + ['azx_5flog_5fnot_5finit_24',['AZX_LOG_NOT_INIT',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0a12ddd7346038a59740724ffcc8c20e12',1,'azx_log.h']]], + ['azx_5flog_5fsetlevel_25',['azx_log_setLevel',['../azx__log_8h.html#a7b0daaed2d1a5700a26365e409593a4b',1,'azx_log.h']]], + ['azx_5flog_5fto_5faux_5fuart_26',['AZX_LOG_TO_AUX_UART',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760a0af771a438449471f0f1fb0a6e5d65d4',1,'azx_log.h']]], + ['azx_5flog_5fto_5fmain_5fuart_27',['AZX_LOG_TO_MAIN_UART',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760a371b4156625be29814df43770a9150a3',1,'azx_log.h']]], + ['azx_5flog_5fto_5fusb0_28',['AZX_LOG_TO_USB0',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760a2b9fdc468ce514e4118797ad0e624841',1,'azx_log.h']]], + ['azx_5flog_5fto_5fusb1_29',['AZX_LOG_TO_USB1',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760ab87a0049b27ce615b28ea77f51118286',1,'azx_log.h']]], + ['azx_5flog_5ftrace_30',['AZX_LOG_TRACE',['../group__log_usage.html#gaa85ac7254570a307564019c5dfb98d83',1,'app_cfg.h']]], + ['azx_5flog_5fusb_5fcable_5funplugged_31',['AZX_LOG_USB_CABLE_UNPLUGGED',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0ab2beedfe225418d618c1d2e12410b72b',1,'azx_log.h']]], + ['azx_5flog_5fwarn_32',['AZX_LOG_WARN',['../group__log_usage.html#ga47bb701aa779a05aa34ed01fcfbbdd54',1,'app_cfg.h']]], + ['azx_5freboot_5fnow_33',['azx_reboot_now',['../azx__utils_8h.html#a8fb8f6f485efbdbc31fc02942faf3a89',1,'azx_utils.h']]], + ['azx_5fshutdown_5fnow_34',['azx_shutdown_now',['../azx__utils_8h.html#ae6a6a38c2fdd6b84d9ef00b88690c97d',1,'azx_utils.h']]], + ['azx_5fsleep_5fms_35',['azx_sleep_ms',['../azx__utils_8h.html#adf8be666cb37d5c4d1c9c4b9694e2de5',1,'azx_utils.h']]], + ['azx_5futils_2eh_36',['azx_utils.h',['../azx__utils_8h.html',1,'']]], + ['azx_20sample_20modules_20documentation_37',['AZX sample modules documentation',['../index.html',1,'']]] ]; diff --git a/Samples/AZX_Docs/html/search/all_1.js b/Samples/AZX_Docs/html/search/all_1.js index 6b18790..e255eeb 100644 --- a/Samples/AZX_Docs/html/search/all_1.js +++ b/Samples/AZX_Docs/html/search/all_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['configuration_20of_20logging_20functionalities_40',['Configuration of logging functionalities',['../group__log_conf.html',1,'']]] + ['configuration_20of_20logging_20functionalities_38',['Configuration of logging functionalities',['../group__log_conf.html',1,'']]] ]; diff --git a/Samples/AZX_Docs/html/search/all_2.js b/Samples/AZX_Docs/html/search/all_2.js index d12e2da..20f3995 100644 --- a/Samples/AZX_Docs/html/search/all_2.js +++ b/Samples/AZX_Docs/html/search/all_2.js @@ -1,7 +1,7 @@ var searchData= [ - ['log_5fchannel_41',['log_channel',['../struct_a_z_x___l_o_g___c_f_g___t.html#a609c698186c3593727637d0d4afcad9a',1,'AZX_LOG_CFG_T']]], - ['log_5fcolours_42',['log_colours',['../struct_a_z_x___l_o_g___c_f_g___t.html#aa034a943c56f918fe8dbbf6a06ade44c',1,'AZX_LOG_CFG_T']]], - ['log_5flevel_43',['log_level',['../struct_a_z_x___l_o_g___c_f_g___t.html#afc9a3bd60f8958c7cccaf707612d2ae2',1,'AZX_LOG_CFG_T::log_level()'],['../app__cfg_8h.html#a0b87e0d3bf5853bcbb0b66a7c48fdc05',1,'LOG_LEVEL(): app_cfg.h']]], - ['log_5fwith_5fcolour_44',['LOG_WITH_COLOUR',['../app__cfg_8h.html#a490faa4d74e7d551583e681f9b8c2dfe',1,'app_cfg.h']]] + ['log_5fchannel_39',['log_channel',['../struct_a_z_x___l_o_g___c_f_g___t.html#a609c698186c3593727637d0d4afcad9a',1,'AZX_LOG_CFG_T']]], + ['log_5fcolours_40',['log_colours',['../struct_a_z_x___l_o_g___c_f_g___t.html#aa034a943c56f918fe8dbbf6a06ade44c',1,'AZX_LOG_CFG_T']]], + ['log_5flevel_41',['log_level',['../struct_a_z_x___l_o_g___c_f_g___t.html#afc9a3bd60f8958c7cccaf707612d2ae2',1,'AZX_LOG_CFG_T::log_level()'],['../app__cfg_8h.html#a0b87e0d3bf5853bcbb0b66a7c48fdc05',1,'LOG_LEVEL(): app_cfg.h']]], + ['log_5fwith_5fcolour_42',['LOG_WITH_COLOUR',['../app__cfg_8h.html#a490faa4d74e7d551583e681f9b8c2dfe',1,'app_cfg.h']]] ]; diff --git a/Samples/AZX_Docs/html/search/all_3.js b/Samples/AZX_Docs/html/search/all_3.js index 93bcc3c..ab1e377 100644 --- a/Samples/AZX_Docs/html/search/all_3.js +++ b/Samples/AZX_Docs/html/search/all_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['usage_20of_20logging_20functionalities_45',['Usage of logging functionalities',['../group__log_usage.html',1,'']]] + ['usage_20of_20logging_20functionalities_43',['Usage of logging functionalities',['../group__log_usage.html',1,'']]] ]; diff --git a/Samples/AZX_Docs/html/search/all_4.js b/Samples/AZX_Docs/html/search/all_4.js index 2bc1709..0e109fe 100644 --- a/Samples/AZX_Docs/html/search/all_4.js +++ b/Samples/AZX_Docs/html/search/all_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['version_46',['VERSION',['../app__cfg_8h.html#a1c6d5de492ac61ad29aec7aa9a436bbf',1,'app_cfg.h']]] + ['version_44',['VERSION',['../app__cfg_8h.html#a1c6d5de492ac61ad29aec7aa9a436bbf',1,'app_cfg.h']]] ]; diff --git a/Samples/AZX_Docs/html/search/classes_0.js b/Samples/AZX_Docs/html/search/classes_0.js index 8c9619a..7ebb134 100644 --- a/Samples/AZX_Docs/html/search/classes_0.js +++ b/Samples/AZX_Docs/html/search/classes_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['azx_5flog_5fcfg_5ft_47',['AZX_LOG_CFG_T',['../struct_a_z_x___l_o_g___c_f_g___t.html',1,'']]] + ['azx_5flog_5fcfg_5ft_45',['AZX_LOG_CFG_T',['../struct_a_z_x___l_o_g___c_f_g___t.html',1,'']]] ]; diff --git a/Samples/AZX_Docs/html/search/defines_0.js b/Samples/AZX_Docs/html/search/defines_0.js index cd8ba65..e83cd00 100644 --- a/Samples/AZX_Docs/html/search/defines_0.js +++ b/Samples/AZX_Docs/html/search/defines_0.js @@ -1,5 +1,5 @@ var searchData= [ - ['azx_5flimit_82',['AZX_LIMIT',['../azx__utils_8h.html#ae63391c8b40ed84ad60e84ed2386d1f9',1,'azx_utils.h']]], - ['azx_5flog_5finit_83',['AZX_LOG_INIT',['../app__cfg_8h.html#a4af7b5c67a5df4ffbcafe9a91a4677bc',1,'app_cfg.h']]] + ['azx_5flimit_78',['AZX_LIMIT',['../azx__utils_8h.html#ae63391c8b40ed84ad60e84ed2386d1f9',1,'azx_utils.h']]], + ['azx_5flog_5finit_79',['AZX_LOG_INIT',['../app__cfg_8h.html#a4af7b5c67a5df4ffbcafe9a91a4677bc',1,'app_cfg.h']]] ]; diff --git a/Samples/AZX_Docs/html/search/defines_1.js b/Samples/AZX_Docs/html/search/defines_1.js index 4d8dc3a..8d00242 100644 --- a/Samples/AZX_Docs/html/search/defines_1.js +++ b/Samples/AZX_Docs/html/search/defines_1.js @@ -1,5 +1,5 @@ var searchData= [ - ['log_5flevel_84',['LOG_LEVEL',['../app__cfg_8h.html#a0b87e0d3bf5853bcbb0b66a7c48fdc05',1,'app_cfg.h']]], - ['log_5fwith_5fcolour_85',['LOG_WITH_COLOUR',['../app__cfg_8h.html#a490faa4d74e7d551583e681f9b8c2dfe',1,'app_cfg.h']]] + ['log_5flevel_80',['LOG_LEVEL',['../app__cfg_8h.html#a0b87e0d3bf5853bcbb0b66a7c48fdc05',1,'app_cfg.h']]], + ['log_5fwith_5fcolour_81',['LOG_WITH_COLOUR',['../app__cfg_8h.html#a490faa4d74e7d551583e681f9b8c2dfe',1,'app_cfg.h']]] ]; diff --git a/Samples/AZX_Docs/html/search/defines_2.js b/Samples/AZX_Docs/html/search/defines_2.js index e35b0d7..0f018bf 100644 --- a/Samples/AZX_Docs/html/search/defines_2.js +++ b/Samples/AZX_Docs/html/search/defines_2.js @@ -1,4 +1,4 @@ var searchData= [ - ['version_86',['VERSION',['../app__cfg_8h.html#a1c6d5de492ac61ad29aec7aa9a436bbf',1,'app_cfg.h']]] + ['version_82',['VERSION',['../app__cfg_8h.html#a1c6d5de492ac61ad29aec7aa9a436bbf',1,'app_cfg.h']]] ]; diff --git a/Samples/AZX_Docs/html/search/enums_0.js b/Samples/AZX_Docs/html/search/enums_0.js index 4b2957b..972b59f 100644 --- a/Samples/AZX_Docs/html/search/enums_0.js +++ b/Samples/AZX_Docs/html/search/enums_0.js @@ -1,6 +1,6 @@ var searchData= [ - ['azx_5flog_5ferrors_5fe_64',['AZX_LOG_ERRORS_E',['../group__log_usage.html#gabe77e5a2f7b57b5029c6f7cdfa7e3dd0',1,'azx_log.h']]], - ['azx_5flog_5fhandle_5fe_65',['AZX_LOG_HANDLE_E',['../group__log_conf.html#ga03b618927cb5d884386832ab76781760',1,'azx_log.h']]], - ['azx_5flog_5flevel_5fe_66',['AZX_LOG_LEVEL_E',['../group__log_conf.html#gae9fa7be40e4fcae6093707def57f82a5',1,'azx_log.h']]] + ['azx_5flog_5ferrors_5fe_60',['AZX_LOG_ERRORS_E',['../group__log_usage.html#gabe77e5a2f7b57b5029c6f7cdfa7e3dd0',1,'azx_log.h']]], + ['azx_5flog_5fhandle_5fe_61',['AZX_LOG_HANDLE_E',['../group__log_conf.html#ga03b618927cb5d884386832ab76781760',1,'azx_log.h']]], + ['azx_5flog_5flevel_5fe_62',['AZX_LOG_LEVEL_E',['../group__log_conf.html#gae9fa7be40e4fcae6093707def57f82a5',1,'azx_log.h']]] ]; diff --git a/Samples/AZX_Docs/html/search/enumvalues_0.js b/Samples/AZX_Docs/html/search/enumvalues_0.js index 12b5664..2187cf2 100644 --- a/Samples/AZX_Docs/html/search/enumvalues_0.js +++ b/Samples/AZX_Docs/html/search/enumvalues_0.js @@ -1,18 +1,18 @@ var searchData= [ - ['azx_5flog_5fcannot_5fopen_5fusb_5fchannel_67',['AZX_LOG_CANNOT_OPEN_USB_CHANNEL',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0aadebfaa08c22d4ad0729e98b50ce880c',1,'azx_log.h']]], - ['azx_5flog_5flevel_5fcritical_68',['AZX_LOG_LEVEL_CRITICAL',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a51671d346b1e7d44f8993fa9d2ca174c',1,'azx_log.h']]], - ['azx_5flog_5flevel_5fdebug_69',['AZX_LOG_LEVEL_DEBUG',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5aa77afa2490f92d58d965e30ce97c8048',1,'azx_log.h']]], - ['azx_5flog_5flevel_5ferror_70',['AZX_LOG_LEVEL_ERROR',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5acc52fcbd7aa2088fe583a11661b4abf2',1,'azx_log.h']]], - ['azx_5flog_5flevel_5finfo_71',['AZX_LOG_LEVEL_INFO',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a2bdb3bd46fb4a347265f0c966ded4f25',1,'azx_log.h']]], - ['azx_5flog_5flevel_5fnone_72',['AZX_LOG_LEVEL_NONE',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a8f609b972c7fd17cec42b2c216dc68b4',1,'azx_log.h']]], - ['azx_5flog_5flevel_5ftrace_73',['AZX_LOG_LEVEL_TRACE',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5adc5cc122c3a06700e09e4c6d1cc17497',1,'azx_log.h']]], - ['azx_5flog_5flevel_5fwarn_74',['AZX_LOG_LEVEL_WARN',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a0d4c7c18f82729850d7a1c3e35e2f0b8',1,'azx_log.h']]], - ['azx_5flog_5fno_5fusb_5finstance_5favailable_75',['AZX_LOG_NO_USB_INSTANCE_AVAILABLE',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0ab7e169017c26c73457fe21f879b299f0',1,'azx_log.h']]], - ['azx_5flog_5fnot_5finit_76',['AZX_LOG_NOT_INIT',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0a12ddd7346038a59740724ffcc8c20e12',1,'azx_log.h']]], - ['azx_5flog_5fto_5faux_5fuart_77',['AZX_LOG_TO_AUX_UART',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760a0af771a438449471f0f1fb0a6e5d65d4',1,'azx_log.h']]], - ['azx_5flog_5fto_5fmain_5fuart_78',['AZX_LOG_TO_MAIN_UART',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760a371b4156625be29814df43770a9150a3',1,'azx_log.h']]], - ['azx_5flog_5fto_5fusb0_79',['AZX_LOG_TO_USB0',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760a2b9fdc468ce514e4118797ad0e624841',1,'azx_log.h']]], - ['azx_5flog_5fto_5fusb1_80',['AZX_LOG_TO_USB1',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760ab87a0049b27ce615b28ea77f51118286',1,'azx_log.h']]], - ['azx_5flog_5fusb_5fcable_5funplugged_81',['AZX_LOG_USB_CABLE_UNPLUGGED',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0ab2beedfe225418d618c1d2e12410b72b',1,'azx_log.h']]] + ['azx_5flog_5fcannot_5fopen_5fusb_5fchannel_63',['AZX_LOG_CANNOT_OPEN_USB_CHANNEL',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0aadebfaa08c22d4ad0729e98b50ce880c',1,'azx_log.h']]], + ['azx_5flog_5flevel_5fcritical_64',['AZX_LOG_LEVEL_CRITICAL',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a51671d346b1e7d44f8993fa9d2ca174c',1,'azx_log.h']]], + ['azx_5flog_5flevel_5fdebug_65',['AZX_LOG_LEVEL_DEBUG',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5aa77afa2490f92d58d965e30ce97c8048',1,'azx_log.h']]], + ['azx_5flog_5flevel_5ferror_66',['AZX_LOG_LEVEL_ERROR',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5acc52fcbd7aa2088fe583a11661b4abf2',1,'azx_log.h']]], + ['azx_5flog_5flevel_5finfo_67',['AZX_LOG_LEVEL_INFO',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a2bdb3bd46fb4a347265f0c966ded4f25',1,'azx_log.h']]], + ['azx_5flog_5flevel_5fnone_68',['AZX_LOG_LEVEL_NONE',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a8f609b972c7fd17cec42b2c216dc68b4',1,'azx_log.h']]], + ['azx_5flog_5flevel_5ftrace_69',['AZX_LOG_LEVEL_TRACE',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5adc5cc122c3a06700e09e4c6d1cc17497',1,'azx_log.h']]], + ['azx_5flog_5flevel_5fwarn_70',['AZX_LOG_LEVEL_WARN',['../group__log_conf.html#ggae9fa7be40e4fcae6093707def57f82a5a0d4c7c18f82729850d7a1c3e35e2f0b8',1,'azx_log.h']]], + ['azx_5flog_5fno_5fusb_5finstance_5favailable_71',['AZX_LOG_NO_USB_INSTANCE_AVAILABLE',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0ab7e169017c26c73457fe21f879b299f0',1,'azx_log.h']]], + ['azx_5flog_5fnot_5finit_72',['AZX_LOG_NOT_INIT',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0a12ddd7346038a59740724ffcc8c20e12',1,'azx_log.h']]], + ['azx_5flog_5fto_5faux_5fuart_73',['AZX_LOG_TO_AUX_UART',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760a0af771a438449471f0f1fb0a6e5d65d4',1,'azx_log.h']]], + ['azx_5flog_5fto_5fmain_5fuart_74',['AZX_LOG_TO_MAIN_UART',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760a371b4156625be29814df43770a9150a3',1,'azx_log.h']]], + ['azx_5flog_5fto_5fusb0_75',['AZX_LOG_TO_USB0',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760a2b9fdc468ce514e4118797ad0e624841',1,'azx_log.h']]], + ['azx_5flog_5fto_5fusb1_76',['AZX_LOG_TO_USB1',['../group__log_conf.html#gga03b618927cb5d884386832ab76781760ab87a0049b27ce615b28ea77f51118286',1,'azx_log.h']]], + ['azx_5flog_5fusb_5fcable_5funplugged_77',['AZX_LOG_USB_CABLE_UNPLUGGED',['../group__log_usage.html#ggabe77e5a2f7b57b5029c6f7cdfa7e3dd0ab2beedfe225418d618c1d2e12410b72b',1,'azx_log.h']]] ]; diff --git a/Samples/AZX_Docs/html/search/files_0.js b/Samples/AZX_Docs/html/search/files_0.js index d7f50b1..ac55d4f 100644 --- a/Samples/AZX_Docs/html/search/files_0.js +++ b/Samples/AZX_Docs/html/search/files_0.js @@ -1,6 +1,6 @@ var searchData= [ - ['app_5fcfg_2eh_48',['app_cfg.h',['../app__cfg_8h.html',1,'']]], - ['azx_5flog_2eh_49',['azx_log.h',['../azx__log_8h.html',1,'']]], - ['azx_5futils_2eh_50',['azx_utils.h',['../azx__utils_8h.html',1,'']]] + ['app_5fcfg_2eh_46',['app_cfg.h',['../app__cfg_8h.html',1,'']]], + ['azx_5flog_2eh_47',['azx_log.h',['../azx__log_8h.html',1,'']]], + ['azx_5futils_2eh_48',['azx_utils.h',['../azx__utils_8h.html',1,'']]] ]; diff --git a/Samples/AZX_Docs/html/search/functions_0.js b/Samples/AZX_Docs/html/search/functions_0.js index 59d48af..18af8dd 100644 --- a/Samples/AZX_Docs/html/search/functions_0.js +++ b/Samples/AZX_Docs/html/search/functions_0.js @@ -1,13 +1,11 @@ var searchData= [ - ['azx_5fhex_5fdump_51',['azx_hex_dump',['../azx__utils_8h.html#a079fc61e9774e7c7b178ddcc67617a0f',1,'azx_utils.h']]], - ['azx_5flog_5fdeinit_52',['azx_log_deinit',['../azx__log_8h.html#a1cff830ca498f89db8a6ba0882441231',1,'azx_log.h']]], - ['azx_5flog_5fflush_5fto_5ffile_53',['azx_log_flush_to_file',['../azx__log_8h.html#a3e999a06dd697da3196e357039081124',1,'azx_log.h']]], - ['azx_5flog_5fgetlevel_54',['azx_log_getLevel',['../azx__log_8h.html#ab2c4e9406084c9f69c1314a718cc90d8',1,'azx_log.h']]], - ['azx_5flog_5finit_55',['azx_log_init',['../group__log_conf.html#ga08e797515ecc2b71223a72c77c6dc6af',1,'azx_log.h']]], - ['azx_5flog_5fsend_5fto_5ffile_56',['azx_log_send_to_file',['../azx__log_8h.html#af64520b985c9e8b97fda9dd77279bdd3',1,'azx_log.h']]], - ['azx_5flog_5fsetlevel_57',['azx_log_setLevel',['../azx__log_8h.html#a7b0daaed2d1a5700a26365e409593a4b',1,'azx_log.h']]], - ['azx_5freboot_5fnow_58',['azx_reboot_now',['../azx__utils_8h.html#a75795b5fabfb2be85fc105df383a82bf',1,'azx_utils.h']]], - ['azx_5fshutdown_5fnow_59',['azx_shutdown_now',['../azx__utils_8h.html#aeaea36b3c4e80ad8a22f172aa36542df',1,'azx_utils.h']]], - ['azx_5fsleep_5fms_60',['azx_sleep_ms',['../azx__utils_8h.html#adf8be666cb37d5c4d1c9c4b9694e2de5',1,'azx_utils.h']]] + ['azx_5fhex_5fdump_49',['azx_hex_dump',['../azx__utils_8h.html#a079fc61e9774e7c7b178ddcc67617a0f',1,'azx_utils.h']]], + ['azx_5flog_5fdeinit_50',['azx_log_deinit',['../azx__log_8h.html#a1cff830ca498f89db8a6ba0882441231',1,'azx_log.h']]], + ['azx_5flog_5fgetlevel_51',['azx_log_getLevel',['../azx__log_8h.html#ab2c4e9406084c9f69c1314a718cc90d8',1,'azx_log.h']]], + ['azx_5flog_5finit_52',['azx_log_init',['../group__log_conf.html#ga08e797515ecc2b71223a72c77c6dc6af',1,'azx_log.h']]], + ['azx_5flog_5fsetlevel_53',['azx_log_setLevel',['../azx__log_8h.html#a7b0daaed2d1a5700a26365e409593a4b',1,'azx_log.h']]], + ['azx_5freboot_5fnow_54',['azx_reboot_now',['../azx__utils_8h.html#a8fb8f6f485efbdbc31fc02942faf3a89',1,'azx_utils.h']]], + ['azx_5fshutdown_5fnow_55',['azx_shutdown_now',['../azx__utils_8h.html#ae6a6a38c2fdd6b84d9ef00b88690c97d',1,'azx_utils.h']]], + ['azx_5fsleep_5fms_56',['azx_sleep_ms',['../azx__utils_8h.html#adf8be666cb37d5c4d1c9c4b9694e2de5',1,'azx_utils.h']]] ]; diff --git a/Samples/AZX_Docs/html/search/groups_0.js b/Samples/AZX_Docs/html/search/groups_0.js index 5af8f69..1be15f2 100644 --- a/Samples/AZX_Docs/html/search/groups_0.js +++ b/Samples/AZX_Docs/html/search/groups_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['configuration_20of_20logging_20functionalities_87',['Configuration of logging functionalities',['../group__log_conf.html',1,'']]] + ['configuration_20of_20logging_20functionalities_83',['Configuration of logging functionalities',['../group__log_conf.html',1,'']]] ]; diff --git a/Samples/AZX_Docs/html/search/groups_1.js b/Samples/AZX_Docs/html/search/groups_1.js index 93509ba..4397a21 100644 --- a/Samples/AZX_Docs/html/search/groups_1.js +++ b/Samples/AZX_Docs/html/search/groups_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['usage_20of_20logging_20functionalities_88',['Usage of logging functionalities',['../group__log_usage.html',1,'']]] + ['usage_20of_20logging_20functionalities_84',['Usage of logging functionalities',['../group__log_usage.html',1,'']]] ]; diff --git a/Samples/AZX_Docs/html/search/pages_0.js b/Samples/AZX_Docs/html/search/pages_0.js index 5e5b5ce..8c98d94 100644 --- a/Samples/AZX_Docs/html/search/pages_0.js +++ b/Samples/AZX_Docs/html/search/pages_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['azx_20sample_20modules_20documentation_89',['AZX sample modules documentation',['../index.html',1,'']]] + ['azx_20sample_20modules_20documentation_85',['AZX sample modules documentation',['../index.html',1,'']]] ]; diff --git a/Samples/AZX_Docs/html/search/variables_0.js b/Samples/AZX_Docs/html/search/variables_0.js index 2a42215..bfc4614 100644 --- a/Samples/AZX_Docs/html/search/variables_0.js +++ b/Samples/AZX_Docs/html/search/variables_0.js @@ -1,6 +1,6 @@ var searchData= [ - ['log_5fchannel_61',['log_channel',['../struct_a_z_x___l_o_g___c_f_g___t.html#a609c698186c3593727637d0d4afcad9a',1,'AZX_LOG_CFG_T']]], - ['log_5fcolours_62',['log_colours',['../struct_a_z_x___l_o_g___c_f_g___t.html#aa034a943c56f918fe8dbbf6a06ade44c',1,'AZX_LOG_CFG_T']]], - ['log_5flevel_63',['log_level',['../struct_a_z_x___l_o_g___c_f_g___t.html#afc9a3bd60f8958c7cccaf707612d2ae2',1,'AZX_LOG_CFG_T']]] + ['log_5fchannel_57',['log_channel',['../struct_a_z_x___l_o_g___c_f_g___t.html#a609c698186c3593727637d0d4afcad9a',1,'AZX_LOG_CFG_T']]], + ['log_5fcolours_58',['log_colours',['../struct_a_z_x___l_o_g___c_f_g___t.html#aa034a943c56f918fe8dbbf6a06ade44c',1,'AZX_LOG_CFG_T']]], + ['log_5flevel_59',['log_level',['../struct_a_z_x___l_o_g___c_f_g___t.html#afc9a3bd60f8958c7cccaf707612d2ae2',1,'AZX_LOG_CFG_T']]] ]; diff --git a/Samples/AZX_Docs/html/struct_a_z_x___l_o_g___c_f_g___t.html b/Samples/AZX_Docs/html/struct_a_z_x___l_o_g___c_f_g___t.html index 395633c..0a592f3 100644 --- a/Samples/AZX_Docs/html/struct_a_z_x___l_o_g___c_f_g___t.html +++ b/Samples/AZX_Docs/html/struct_a_z_x___l_o_g___c_f_g___t.html @@ -34,7 +34,7 @@ Logo
AZX (AppZone eXtensions) documentation -  1.0.3 +  1.0.4
A set of companion utilities that make AZ development easier
diff --git a/Samples/BRAVO_Environment_BSEC_Demo/azx/hdr/azx_log.h b/Samples/BRAVO_Environment_BSEC_Demo/azx/hdr/azx_log.h index 38912d3..04f29be 100644 --- a/Samples/BRAVO_Environment_BSEC_Demo/azx/hdr/azx_log.h +++ b/Samples/BRAVO_Environment_BSEC_Demo/azx/hdr/azx_log.h @@ -1,11 +1,10 @@ -/*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/ -/* See LICENSE file in the project root for full license information. */ - +/* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */ +/* See LICENSE file in the project root for full license information. */ #ifndef HDR_AZX_LOG_H_ #define HDR_AZX_LOG_H_ /** * @file azx_log.h - * @version 1.0.5 + * @version 1.0.2 * @dependencies * @author Fabio Pintus * @author Ioannis Demetriou @@ -40,13 +39,13 @@ */ typedef enum { - AZX_LOG_LEVEL_TRACE = 1, /**< Prints every message, adds a "TRACE" at the beginning of the message*/ - AZX_LOG_LEVEL_DEBUG = 2, /**< Prints most of the messages, adds a "DEBUG" at the beginning of the message*/ - AZX_LOG_LEVEL_INFO = 3, /**< print the message only, without any additional info */ - AZX_LOG_LEVEL_WARN = 4, /**< like DEBUG, but adds a "WARNING" at the beginning of the message. */ - AZX_LOG_LEVEL_ERROR = 5, /**< like DEBUG, but adds an "ERROR" at the beginning of the message */ - AZX_LOG_LEVEL_CRITICAL = 6, /**< like DEBUG, but adds an "CRITICAL" at the beginning of the message */ - AZX_LOG_LEVEL_NONE = 0x7F, /**< Do not print anything */ + AZX_LOG_LEVEL_NONE = 0, /**< Do not print anything */ + AZX_LOG_LEVEL_TRACE = 1, /**< Prints every message, adds a "TRACE" at the beginning of the message*/ + AZX_LOG_LEVEL_DEBUG = 2, /**< Prints most of the messages, adds a "DEBUG" at the beginning of the message*/ + AZX_LOG_LEVEL_INFO = 3, /**< print the message only, without any additional info */ + AZX_LOG_LEVEL_WARN = 4, /**< like DEBUG, but adds a "WARNING" at the beginning of the message. */ + AZX_LOG_LEVEL_ERROR = 5, /**< like DEBUG, but adds an "ERROR" at the beginning of the message */ + AZX_LOG_LEVEL_CRITICAL = 6, /**< like DEBUG, but adds an "CRITICAL" at the beginning of the message */ } AZX_LOG_LEVEL_E; @@ -209,37 +208,4 @@ void azx_log_setLevel(AZX_LOG_LEVEL_E level); */ AZX_LOG_LEVEL_E azx_log_getLevel(void); -/** - * @brief Gets the logging component to output to a file. - * - * Once this is called all the logs will be sent to a named file. The file will be appended to, so - * existing logs there will not be removed. - * - * Logs will continue to be sent to USB/UART if that is so configured. - * - * Only one file can be used at the same time, so calling this again with a new filename means that - * all logs will go to the new file instead of the old one. - * - * The logging can be configured to be done in a circular way by setting circular_chunks to a value - * greater than 0. Each chunk will have at most max_size_kb KB. - * - * @param filename The name of the file to log to. If NULL, this function does nothing. - * @param circular_chunks The number of chunks to store circularly (apart from the original one). - * @param min_level The minimum level of the logs to be stored. - * @param max_size_kb The maximum size in KB of each size of the log file. Once the file reaches - * that limit, no further logging will be made to it. - * - * @return TRUE if the file can be created and opened, FALSE otherwise - */ -BOOLEAN azx_log_send_to_file(const CHAR* filename, UINT32 circular_chunks, - AZX_LOG_LEVEL_E min_level, UINT32 max_size_kb); - -/** - * @brief Flushes any outstanding logs to the file. - * - * Without calling this, there is no guarantee of when the logs will be written to the filesystem. - * It may take longer due to caching. - */ -void azx_log_flush_to_file(void); - #endif /* HDR_AZX_LOG_H_ */ diff --git a/Samples/BRAVO_Environment_BSEC_Demo/azx/hdr/azx_utils.h b/Samples/BRAVO_Environment_BSEC_Demo/azx/hdr/azx_utils.h index d0ffd84..b4905da 100644 --- a/Samples/BRAVO_Environment_BSEC_Demo/azx/hdr/azx_utils.h +++ b/Samples/BRAVO_Environment_BSEC_Demo/azx/hdr/azx_utils.h @@ -1,11 +1,10 @@ -/*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/ -/* See LICENSE file in the project root for full license information. */ - +/* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */ +/* See LICENSE file in the project root for full license information. */ #ifndef HDR_M2M_UTILS_H_ #define HDR_M2M_UTILS_H_ /** * @file azx_utils.h - * @version 1.0.1 + * @version 1.0.0 * @dependencies azx_log * @author Ioannis Demetriou * @author Sorin Basca @@ -68,7 +67,7 @@ const CHAR* azx_hex_dump(const void* data, UINT32 len); */ /*-----------------------------------------------------------------------------------------------*/ -void azx_reboot_now(void); +void azx_reboot_now(); /** @brief Shuts the modem down straight away. @@ -81,7 +80,7 @@ void azx_reboot_now(void); */ /*-----------------------------------------------------------------------------------------------*/ -void azx_shutdown_now(void); +void azx_shutdown_now(); diff --git a/Samples/BRAVO_Environment_BSEC_Demo/azx/src/azx_log.c b/Samples/BRAVO_Environment_BSEC_Demo/azx/src/azx_log.c index abade1f..eb6be31 100644 --- a/Samples/BRAVO_Environment_BSEC_Demo/azx/src/azx_log.c +++ b/Samples/BRAVO_Environment_BSEC_Demo/azx/src/azx_log.c @@ -1,5 +1,5 @@ -/*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/ -/* See LICENSE file in the project root for full license information. */ +/* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */ +/* See LICENSE file in the project root for full license information. */ /* Include files =============================================================*/ @@ -12,17 +12,13 @@ #include "m2mb_usb.h" #include "m2mb_uart.h" -#include "m2mb_fs_posix.h" -#include "m2mb_fs_stdio.h" -#include "m2mb_rtc.h" - #include "app_cfg.h" #include "azx_log.h" /* Local defines =============================================================*/ #define USB_CH_MAX 3 #define LOG_BUFFER_SIZE 2048 -#define MAX_FILE_LOG_CACHE 10000 + #define NO_COLOUR "\033[0m" #define BOLD "\033[1m" @@ -70,15 +66,6 @@ ); \ break -#define LOG_FILE_PREFIX(tag) \ - case AZX_LOG_LEVEL_##tag: \ - offset = snprintf(log_buffer, LOG_BUFFER_SIZE, \ - prefix_fmt_file, get_date_time(), \ - ((now / 10) % 100), #tag, \ - get_file_title(file), line \ - ); \ - break - /* Local typedefs ============================================================*/ /* Local statics =============================================================*/ static struct @@ -89,49 +76,19 @@ static struct INT32 ch_fd; BOOLEAN colouredLogs; M2MB_OS_SEM_HANDLE CSSemHandle; -} log_cfg = {/*.isInit*/ FALSE, /*.level*/ AZX_LOG_LEVEL_NONE, /*.channel*/ AZX_LOG_TO_MAX, /*.ch_fd */ -1, /*.colouredLogs*/ FALSE, /*.CSSemHandle */ NULL}; +} log_cfg = {.isInit=FALSE, .level=AZX_LOG_LEVEL_NONE, .channel=AZX_LOG_TO_MAX, .ch_fd = -1, .colouredLogs=FALSE, .CSSemHandle = NULL}; static CHAR log_buffer[LOG_BUFFER_SIZE] = { 0 }; static CHAR task_name[64]; -static CHAR dateTime[32] = { 0 }; -static struct -{ - M2MB_FILE_T* fd; - CHAR name[32]; - CHAR current_name[40]; - UINT32 circular_chunks; - UINT32 max_size_kb; - AZX_LOG_LEVEL_E min_level; - UINT32 cache_idx; - CHAR cache[MAX_FILE_LOG_CACHE]; -} logFile = { - /*.fd */ - 0, - /*.name */ - { 0 }, - /*.current_name */ - { 0 }, - /*.circular_chunks */ - 0, - /*.max_size_kb */ - 0, - /*.min_level */ - AZX_LOG_LEVEL_CRITICAL, - /*.cache_idx */ - 0, - /*.cache */ - { 0 } -}; static const CHAR* prefix_fmt_colour = "[%s%-5s%s] %3.2f " CYAN "%s" NO_COLOUR ":" BOLD CYAN "%d" NO_COLOUR " - %s{" BOLD WHITE "%s" NO_COLOUR "}$ "; static const CHAR* prefix_fmt_no_colour = "[%s%-5s%s] %3.2f %s:%d - %s{%s}$ "; -static const CHAR* prefix_fmt_file = "%s.%.2u [%-5s] %s:%d "; /* Local function prototypes =================================================*/ @@ -174,13 +131,6 @@ static INT32 log_print_to_USB (const CHAR *path, const CHAR *message ); static UINT32 get_uptime(void); static const char* get_file_title(const CHAR* path); static char* get_current_task_name(CHAR *name); -static BOOLEAN check_file_size(const CHAR* filename, UINT32 max_size_kb); -static void flush_log_to_file(); -static void file_log_or_cache(const CHAR* buffer); -static const CHAR* get_next_log_filename(const CHAR* filename, - UINT32 circular_chunks, UINT32 max_size_kb); -static BOOLEAN rotate_log_files(const CHAR* filename, UINT32 circular_chunks); -static const char* get_date_time(); /* Static functions ==========================================================*/ @@ -301,8 +251,6 @@ static UINT32 get_uptime(void) } -static CHAR fileTitle[12] = ""; - /*-----------------------------------------------------------------------------------------------*/ /*! \brief Removes the file path from the provided path, leaving only filename @@ -315,27 +263,15 @@ static CHAR fileTitle[12] = ""; static const char* get_file_title(const CHAR* path) { const CHAR* p = path; - const CHAR* start = path; - const CHAR* end = path; while (*p) { if (*p == '/' || *p == '\\') { - start = p + 1; - } - - if(*p == '.') { - end = p; + return p + 1; } p++; } - - if(end <= start) { - end = p; - } - - snprintf(fileTitle, sizeof(fileTitle), "%.*s", (INT32)(end - start), start); - return fileTitle; + return path; } @@ -365,29 +301,6 @@ static char* get_current_task_name(CHAR *name) } } -static const char* get_date_time(void) -{ - INT32 fd = m2mb_rtc_open( "/dev/rtc0", 0 ); - M2MB_RTC_TIME_T ts = { 0 }; - if(fd == -1) - { - dateTime[0] = '\0'; - return dateTime; - } - - if(-1 == m2mb_rtc_ioctl( fd, M2MB_RTC_IOCTL_GET_SYSTEM_TIME, &ts )) - { - m2mb_rtc_close( fd ); - dateTime[0] = '\0'; - return dateTime; - } - m2mb_rtc_close( fd ); - snprintf(dateTime, sizeof(dateTime), "%02u-%02u %02u:%02u:%02u", - ts.mon, ts.day, - ts.hour, ts.min, ts.sec); - return dateTime; -} - /* Global functions ==========================================================*/ @@ -573,210 +486,8 @@ INT32 azx_log_formatted(AZX_LOG_LEVEL_E level, /* Print the message on the selected output stream */ sent = log_base_function(log_buffer); - if(logFile.fd && level >= logFile.min_level) - { - if(!check_file_size(logFile.current_name, logFile.max_size_kb)) - { - /* Log limit reached, so we'll need to open the next file in the rotation. Log in the file - * that this limit is reached and then get the next filename */ - m2mb_fs_fputs("=== Log file size limit reached\r\n", logFile.fd); - m2mb_fs_fclose(logFile.fd); - logFile.fd = 0; - - snprintf(logFile.current_name, sizeof(logFile.current_name), "%s", - get_next_log_filename(logFile.name, logFile.circular_chunks, - logFile.max_size_kb)); - - if(logFile.current_name[0] == '\0') - { - goto end; - } - - logFile.fd = m2mb_fs_fopen(logFile.current_name, "a"); - - if(!logFile.fd) - { - goto end; - } - } - - switch(level) - { - LOG_FILE_PREFIX(TRACE); - LOG_FILE_PREFIX(DEBUG); - LOG_FILE_PREFIX(INFO); - LOG_FILE_PREFIX(WARN); - LOG_FILE_PREFIX(ERROR); - LOG_FILE_PREFIX(CRITICAL); - default: - break; - } - - va_start(arg, fmt); - vsnprintf(log_buffer + offset, LOG_BUFFER_SIZE - offset, fmt, arg); - va_end(arg); - file_log_or_cache(log_buffer); - } - -end: m2mb_os_sem_put(log_cfg.CSSemHandle); } return sent; } - -static BOOLEAN check_file_size(const CHAR* filename, UINT32 max_size_kb) -{ - struct M2MB_STAT stat; - if(-1 == m2mb_fs_stat(filename, &stat)) - { - /* Most likely the file doesn't exist, so return true */ - return TRUE; - } - return ((stat.st_size >> 10) < max_size_kb); -} - -static void flush_log_to_file(void) -{ - logFile.cache[logFile.cache_idx] = '\0'; - m2mb_fs_fwrite(logFile.cache, logFile.cache_idx, 1, logFile.fd); - logFile.cache_idx = 0; -} - -static void file_log_or_cache(const CHAR* buffer) -{ - const UINT32 size = strlen(buffer); - - if(MAX_FILE_LOG_CACHE - 1 - size < logFile.cache_idx) - { - flush_log_to_file(); - } - - memcpy(&logFile.cache[logFile.cache_idx], buffer, size); - logFile.cache_idx += size; -} - -static CHAR filenameInUse[40] = ""; - -static BOOLEAN rotate_log_files(const CHAR* filename, UINT32 circular_chunks) -{ - CHAR from[40] = ""; - CHAR to[40] = ""; - UINT32 i = 0; - - /* This will move log.1 to log.2, log.2 to log.3 and so on until the last one */ - snprintf(from, sizeof(from), "%s.%u", filename, circular_chunks); - - m2mb_fs_remove(from); - - for(i = circular_chunks - 1; i > 0; --i) - { - snprintf(from, sizeof(from), "%s.%u", filename, i); - snprintf(to, sizeof(to), "%s.%u", filename, i+1); - if(-1 == m2mb_fs_rename(from, to)) - { - /* Only return FALSE when the final file cannot be renamed - the other renames could be - * failing if there are no files there */ - if(i == 1) - { - return FALSE; - } - } - } - return TRUE; -} - -static const CHAR* get_next_log_filename(const CHAR* filename, - UINT32 circular_chunks, UINT32 max_size_kb) -{ - filenameInUse[0] = '\0'; - - if(!filename) - { - goto end; - } - - /* First try the original file */ - snprintf(filenameInUse, sizeof(filenameInUse), "%s", filename); - - if(check_file_size(filenameInUse, max_size_kb)) - { - goto end; - } - - /* If there is no circular logging and the original file is full, just return empty string */ - if(circular_chunks == 0) - { - filenameInUse[0] = '\0'; - goto end; - } - - /* We should log to filename.1, but if that's full we need to rotate logs and then still use - * filename.1 (since the old one got moved to filename.2) */ - snprintf(filenameInUse, sizeof(filenameInUse), "%s.1", filename); - - if(check_file_size(filenameInUse, max_size_kb)) - { - goto end; - } - - if(!rotate_log_files(filename, circular_chunks)) - { - /* Since we failed to rotate, just wipe filename.1 so it can be reused */ - m2mb_fs_remove(filenameInUse); - goto end; - } - -end: - return filenameInUse; -} - -BOOLEAN azx_log_send_to_file(const CHAR* filename, UINT32 circular_chunks, - AZX_LOG_LEVEL_E min_level, UINT32 max_size_kb) - -{ - if(!filename) - { - return FALSE; - } - - if(circular_chunks == 0 && !check_file_size(filename, max_size_kb)) - { - return FALSE; - } - - if(logFile.fd) - { - m2mb_fs_fclose(logFile.fd); - logFile.fd = 0; - } - - snprintf(logFile.current_name, sizeof(logFile.current_name), "%s", - get_next_log_filename(filename, circular_chunks, max_size_kb)); - - if(logFile.current_name[0] == '\0') - { - return FALSE; - } - - logFile.fd = m2mb_fs_fopen(logFile.current_name, "a"); - - if(!logFile.fd) - { - return FALSE; - } - - snprintf(logFile.name, sizeof(logFile.name), "%s", filename); - logFile.circular_chunks = circular_chunks; - logFile.min_level = min_level; - logFile.max_size_kb = max_size_kb; - logFile.cache_idx = 0; - return TRUE; -} - -void azx_log_flush_to_file(void) -{ - m2mb_os_sem_get(log_cfg.CSSemHandle, M2MB_OS_WAIT_FOREVER ); - flush_log_to_file(); - m2mb_os_sem_put(log_cfg.CSSemHandle); -} diff --git a/Samples/BRAVO_Environment_BSEC_Demo/azx/src/azx_utils.c b/Samples/BRAVO_Environment_BSEC_Demo/azx/src/azx_utils.c index a15c5cf..af11062 100644 --- a/Samples/BRAVO_Environment_BSEC_Demo/azx/src/azx_utils.c +++ b/Samples/BRAVO_Environment_BSEC_Demo/azx/src/azx_utils.c @@ -1,5 +1,5 @@ -/*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/ -/* See LICENSE file in the project root for full license information. */ +/* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */ +/* See LICENSE file in the project root for full license information. */ #include #include @@ -43,26 +43,24 @@ const CHAR* azx_hex_dump(const void* data, UINT32 len) return buff; } -void azx_reboot_now(void) +void azx_reboot_now() { M2MB_POWER_HANDLE h = NULL; if(M2MB_RESULT_SUCCESS == m2mb_power_init(&h, NULL, NULL)) { - AZX_LOG_DEBUG("It's dead, Jim!\r\n"); - AZX_LOG_INFO("Rebooting device\r\n"); + AZX_LOG_ERROR("It's dead, Jim!\r\n"); m2mb_power_reboot(h); } } -void azx_shutdown_now(void) +void azx_shutdown_now() { M2MB_POWER_HANDLE h = NULL; if(M2MB_RESULT_SUCCESS == m2mb_power_init(&h, NULL, NULL)) { - AZX_LOG_DEBUG("It's dead, Jim!\r\n"); - AZX_LOG_INFO("Shutting down device\r\n"); + AZX_LOG_ERROR("It's dead, Jim!\r\n"); m2mb_power_shutdown(h); } } diff --git a/Samples/BRAVO_Environment_BSEC_Demo/hdr/app_cfg.h b/Samples/BRAVO_Environment_BSEC_Demo/hdr/app_cfg.h index 7f96af8..711dd51 100644 --- a/Samples/BRAVO_Environment_BSEC_Demo/hdr/app_cfg.h +++ b/Samples/BRAVO_Environment_BSEC_Demo/hdr/app_cfg.h @@ -23,7 +23,7 @@ /** * @brief The current version of the Samples */ -#define VERSION "1.0.3" +#define VERSION "1.0.4" /** * @name Log Settings diff --git a/Samples/BRAVO_Environment_BSEC_Demo/src/demo_utils/lwm2m.c b/Samples/BRAVO_Environment_BSEC_Demo/src/demo_utils/lwm2m.c index 0a3eeb1..364da7f 100644 --- a/Samples/BRAVO_Environment_BSEC_Demo/src/demo_utils/lwm2m.c +++ b/Samples/BRAVO_Environment_BSEC_Demo/src/demo_utils/lwm2m.c @@ -15,7 +15,7 @@ @author FabioPi @date - 2020-02-15 + 2021-01-20 */ /* Include files ================================================================================*/ #include @@ -47,7 +47,7 @@ /* Local statics ================================================================================*/ /* ONEEDGE */ -static M2MB_LWM2M_HANDLE _h; +static M2MB_LWM2M_HANDLE lwm2mHandle; static M2MB_LWM2M_OBJ_URI_T _obj_telit_service_uri = {.uriLen = 4, .obj = 33211, .objInst = 0, .resource = 0, .resourceInst = 1}; @@ -92,6 +92,7 @@ void lwm2mIndCB( M2MB_LWM2M_HANDLE h, M2MB_LWM2M_EVENT_E event, UINT16 resp_size if(resp->result == M2MB_LWM2M_RES_SUCCESS) { AZX_LOG_DEBUG( "LWM2M enable result OK\r\n"); + m2mb_os_ev_set(lwm2m_evHandle, EV_LWM2M_ENABLE_RES_BIT, M2MB_OS_EV_SET); } else { @@ -106,6 +107,7 @@ void lwm2mIndCB( M2MB_LWM2M_HANDLE h, M2MB_LWM2M_EVENT_E event, UINT16 resp_size if(resp->result == M2MB_LWM2M_RES_SUCCESS) { AZX_LOG_DEBUG( "LWM2M set result OK\r\n"); + m2mb_os_ev_set(lwm2m_evHandle, EV_LWM2M_SET_RES_BIT, M2MB_OS_EV_SET); } else { @@ -120,6 +122,7 @@ void lwm2mIndCB( M2MB_LWM2M_HANDLE h, M2MB_LWM2M_EVENT_E event, UINT16 resp_size if(resp->result == M2MB_LWM2M_RES_SUCCESS) { AZX_LOG_TRACE( "LWM2M write result OK\r\n"); + m2mb_os_ev_set(lwm2m_evHandle, EV_LWM2M_WRITE_RES_BIT, M2MB_OS_EV_SET); } else { @@ -173,7 +176,7 @@ void lwm2mIndCB( M2MB_LWM2M_HANDLE h, M2MB_LWM2M_EVENT_E event, UINT16 resp_size break; case M2MB_LWM2M_CL_STATE_REGISTERED: AZX_LOG_DEBUG( "resp->info == M2MB_LWM2M_CL_STATE_REGISTERED\r\n" ); - m2mb_os_ev_set(lwm2m_evHandle, EV_SRV_REG_BIT, M2MB_OS_EV_SET); + m2mb_os_ev_set(lwm2m_evHandle, EV_LWM2M_SRV_REG_BIT, M2MB_OS_EV_SET); break; case M2MB_LWM2M_CL_STATE_DEREGISTERING: AZX_LOG_DEBUG( "resp->info == M2MB_LWM2M_CL_STATE_DEREGISTERING\r\n" ); @@ -242,7 +245,7 @@ uint8_t oneedge_init( INT32 obj_id ) { m2mb_os_ev_setAttrItem( &evAttrHandle, M2MB_OS_EV_SEL_CMD_DEL_ATTR, NULL ); AZX_LOG_CRITICAL("m2mb_os_ev_init failed!\r\n"); - return 0; + return -1; } else { @@ -250,43 +253,64 @@ uint8_t oneedge_init( INT32 obj_id ) } - //get the handle of the lwm2m client on _h - retVal = m2mb_lwm2m_init( &_h, lwm2mIndCB, ( void * )NULL ); + //get the handle of the lwm2m client on lwm2mHandle + retVal = m2mb_lwm2m_init( &lwm2mHandle, lwm2mIndCB, ( void * )NULL ); if( retVal != M2MB_RESULT_SUCCESS ) { AZX_LOG_ERROR( "m2mb_lwm2m_init returned error %d\r\n", retVal ); + m2mb_os_ev_deinit( lwm2m_evHandle ); return -1; } - retVal = m2mb_lwm2m_write( _h, &_obj_telit_service_uri, &service_enable, sizeof( INT32 ) ); + retVal = m2mb_lwm2m_write( lwm2mHandle, &_obj_telit_service_uri, &service_enable, sizeof( INT32 ) ); if( retVal != M2MB_RESULT_SUCCESS ) { AZX_LOG_ERROR( "m2mb_lwm2m_write returned error %d\r\n", retVal ); + m2mb_os_ev_deinit( lwm2m_evHandle ); + + m2mb_lwm2m_deinit( lwm2mHandle ); return -1; } //AT#LWM2MENA=1 memset( &pars, 0, sizeof( M2MB_LWM2M_ENABLE_REQ_T ) ); - pars.apnclass = 0; - pars.guardRequestEventSecs = 0; - pars.guardReleaseEventSecs = 0; + pars.apnclass = 1; /*CID*/ + pars.guardRequestEventSecs = 5; + pars.guardReleaseEventSecs = 5; pars.commandType = M2MB_LWM2MENA_CMD_TYPE_SET; pars.mode = M2MB_LWM2M_MODE_NO_ACK; - retVal = m2mb_lwm2m_enable( _h, &pars ); - - - + retVal = m2mb_lwm2m_enable( lwm2mHandle, &pars ); if( retVal != M2MB_RESULT_SUCCESS ) { AZX_LOG_ERROR( "m2mb_lwm2m_enable returned error %d\r\n", retVal ); + m2mb_os_ev_deinit( lwm2m_evHandle ); + m2mb_lwm2m_deinit( lwm2mHandle ); return -1; } + if(M2MB_OS_SUCCESS != m2mb_os_ev_get( + lwm2m_evHandle, + EV_LWM2M_ENABLE_RES_BIT, + M2MB_OS_EV_GET_ANY_AND_CLEAR, + &curEvBits, + M2MB_OS_MS2TICKS(10000) /*wait 10 seconds for the event to occur*/ + ) + ) + { + AZX_LOG_ERROR("m2mb_lwm2m_enable timeout!\r\n"); + m2mb_os_ev_deinit( lwm2m_evHandle ); + azx_sleep_ms(2000); + m2mb_lwm2m_deinit(lwm2mHandle); + return -1; + } + + azx_sleep_ms(1000); + /*new object instance information*/ uri.obj = obj_id; uri.objInst = 0; @@ -294,20 +318,27 @@ uint8_t oneedge_init( INT32 obj_id ) new_inst_params.agent = 0; /*Telit Agent*/ /*If OK the instance was not present, and so it was created. If an error is received, it is likely because the instance already exists.*/ - retVal = m2mb_lwm2m_newinst( _h, &uri, &new_inst_params ); + retVal = m2mb_lwm2m_newinst( lwm2mHandle, &uri, &new_inst_params ); if( retVal != M2MB_RESULT_SUCCESS ) { AZX_LOG_ERROR( "m2mb_lwm2m_newinst returned error %d\r\n", retVal ); + m2mb_os_ev_deinit( lwm2m_evHandle ); + m2mb_lwm2m_deinit( lwm2mHandle ); return -1; } - AZX_LOG_DEBUG("Waiting LWM2M Registering (60 seconds)...\r\n"); - osRes = m2mb_os_ev_get(lwm2m_evHandle, EV_SRV_REG_BIT, M2MB_OS_EV_GET_ANY_AND_CLEAR, &curEvBits, M2MB_OS_MS2TICKS(60000)); + AZX_LOG_DEBUG("Waiting LWM2M Registering (120 seconds timeout)...\r\n"); + osRes = m2mb_os_ev_get(lwm2m_evHandle, EV_LWM2M_SRV_REG_BIT, M2MB_OS_EV_GET_ANY_AND_CLEAR, &curEvBits, M2MB_OS_MS2TICKS(120000)); if(osRes != M2MB_OS_SUCCESS) { AZX_LOG_ERROR("LWM2M Register timeout!\r\n"); - return 1; + m2mb_os_ev_deinit( lwm2m_evHandle ); + + m2mb_lwm2m_disable(lwm2mHandle); + azx_sleep_ms(2000); + m2mb_lwm2m_deinit(lwm2mHandle); + return -1; } return 0; @@ -317,7 +348,7 @@ uint8_t oneedge_init( INT32 obj_id ) /*-----------------------------------------------------------------------------------------------*/ void update_tamper_LWM2MObject( int value ) { - M2MB_RESULT_E retVal = m2mb_lwm2m_write( _h, &_obj_tamper_uri, &value, sizeof( int ) ); + M2MB_RESULT_E retVal = m2mb_lwm2m_write( lwm2mHandle, &_obj_tamper_uri, &value, sizeof( int ) ); if( retVal != M2MB_RESULT_SUCCESS ) { @@ -330,13 +361,13 @@ void update_tamper_LWM2MObject( int value ) /*-----------------------------------------------------------------------------------------------*/ void update_environment_LWM2MObject( float _t, float _p, float _rh, INT16 _iaq ) { - M2MB_RESULT_E retVal = m2mb_lwm2m_set( _h, &_obj_environment_uri_t, &_t, sizeof( float ) ); + M2MB_RESULT_E retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_environment_uri_t, &_t, sizeof( float ) ); azx_sleep_ms( 10 ); - retVal = m2mb_lwm2m_set( _h, &_obj_environment_uri_p, &_p, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_environment_uri_p, &_p, sizeof( float ) ); azx_sleep_ms( 10 ); - retVal = m2mb_lwm2m_set( _h, &_obj_environment_uri_h, &_rh, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_environment_uri_h, &_rh, sizeof( float ) ); azx_sleep_ms( 10 ); - retVal = m2mb_lwm2m_set( _h, &_obj_environment_uri_iaq, &_iaq, sizeof( INT16 ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_environment_uri_iaq, &_iaq, sizeof( INT16 ) ); if( retVal != M2MB_RESULT_SUCCESS ) { @@ -350,15 +381,15 @@ void update_environment_LWM2MObject( float _t, float _p, float _rh, INT16 _iaq ) void update_rotation_LWM2MObject( float _w, float _x, float _y, float _z, INT16 _acc ) { M2MB_RESULT_E retVal; - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_w, &_w, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_w, &_w, sizeof( float ) ); //azx_sleep_ms(100); - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_x, &_x, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_x, &_x, sizeof( float ) ); //azx_sleep_ms(100); - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_y, &_y, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_y, &_y, sizeof( float ) ); //azx_sleep_ms(100); - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_z, &_z, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_z, &_z, sizeof( float ) ); //azx_sleep_ms(100); - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_a, &_acc, sizeof( INT16 ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_a, &_acc, sizeof( INT16 ) ); if( retVal != M2MB_RESULT_SUCCESS ) { @@ -371,7 +402,7 @@ void update_rotation_LWM2MObject( float _w, float _x, float _y, float _z, INT16 /*-----------------------------------------------------------------------------------------------*/ void update_smartlock_LWM2MObject( int value ) { - M2MB_RESULT_E retVal = m2mb_lwm2m_write( _h, &_obj_smartlock_uri, &value, sizeof( int ) ); + M2MB_RESULT_E retVal = m2mb_lwm2m_write( lwm2mHandle, &_obj_smartlock_uri, &value, sizeof( int ) ); if( retVal != M2MB_RESULT_SUCCESS ) { diff --git a/Samples/BRAVO_Environment_BSEC_Demo/src/demo_utils/lwm2m.h b/Samples/BRAVO_Environment_BSEC_Demo/src/demo_utils/lwm2m.h index 52a7ac0..266a936 100644 --- a/Samples/BRAVO_Environment_BSEC_Demo/src/demo_utils/lwm2m.h +++ b/Samples/BRAVO_Environment_BSEC_Demo/src/demo_utils/lwm2m.h @@ -33,7 +33,14 @@ #define SMARTLOCK_OBJ_ID 26247 -#define EV_SRV_REG_BIT (UINT32)0x1 /*0x0000000000000001*/ +#define EV_LWM2M_ENABLE_RES_BIT (UINT32)0x00000001 +#define EV_LWM2M_SET_RES_BIT (UINT32)0x00000002 +#define EV_LWM2M_GET_RES_BIT (UINT32)0x00000004 +#define EV_LWM2M_MON_RES_BIT (UINT32)0x00000008 +#define EV_LWM2M_WRITE_RES_BIT (UINT32)0x00000010 +#define EV_LWM2M_READ_RES_BIT (UINT32)0x00000020 +#define EV_LWM2M_SRV_REG_BIT (UINT32)0x00000040 +#define EV_LWM2M_GET_STAT_RES_BIT (UINT32)0x00000080 /** diff --git a/Samples/BRAVO_Rotation_Demo/azx/hdr/azx_log.h b/Samples/BRAVO_Rotation_Demo/azx/hdr/azx_log.h index 38912d3..04f29be 100644 --- a/Samples/BRAVO_Rotation_Demo/azx/hdr/azx_log.h +++ b/Samples/BRAVO_Rotation_Demo/azx/hdr/azx_log.h @@ -1,11 +1,10 @@ -/*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/ -/* See LICENSE file in the project root for full license information. */ - +/* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */ +/* See LICENSE file in the project root for full license information. */ #ifndef HDR_AZX_LOG_H_ #define HDR_AZX_LOG_H_ /** * @file azx_log.h - * @version 1.0.5 + * @version 1.0.2 * @dependencies * @author Fabio Pintus * @author Ioannis Demetriou @@ -40,13 +39,13 @@ */ typedef enum { - AZX_LOG_LEVEL_TRACE = 1, /**< Prints every message, adds a "TRACE" at the beginning of the message*/ - AZX_LOG_LEVEL_DEBUG = 2, /**< Prints most of the messages, adds a "DEBUG" at the beginning of the message*/ - AZX_LOG_LEVEL_INFO = 3, /**< print the message only, without any additional info */ - AZX_LOG_LEVEL_WARN = 4, /**< like DEBUG, but adds a "WARNING" at the beginning of the message. */ - AZX_LOG_LEVEL_ERROR = 5, /**< like DEBUG, but adds an "ERROR" at the beginning of the message */ - AZX_LOG_LEVEL_CRITICAL = 6, /**< like DEBUG, but adds an "CRITICAL" at the beginning of the message */ - AZX_LOG_LEVEL_NONE = 0x7F, /**< Do not print anything */ + AZX_LOG_LEVEL_NONE = 0, /**< Do not print anything */ + AZX_LOG_LEVEL_TRACE = 1, /**< Prints every message, adds a "TRACE" at the beginning of the message*/ + AZX_LOG_LEVEL_DEBUG = 2, /**< Prints most of the messages, adds a "DEBUG" at the beginning of the message*/ + AZX_LOG_LEVEL_INFO = 3, /**< print the message only, without any additional info */ + AZX_LOG_LEVEL_WARN = 4, /**< like DEBUG, but adds a "WARNING" at the beginning of the message. */ + AZX_LOG_LEVEL_ERROR = 5, /**< like DEBUG, but adds an "ERROR" at the beginning of the message */ + AZX_LOG_LEVEL_CRITICAL = 6, /**< like DEBUG, but adds an "CRITICAL" at the beginning of the message */ } AZX_LOG_LEVEL_E; @@ -209,37 +208,4 @@ void azx_log_setLevel(AZX_LOG_LEVEL_E level); */ AZX_LOG_LEVEL_E azx_log_getLevel(void); -/** - * @brief Gets the logging component to output to a file. - * - * Once this is called all the logs will be sent to a named file. The file will be appended to, so - * existing logs there will not be removed. - * - * Logs will continue to be sent to USB/UART if that is so configured. - * - * Only one file can be used at the same time, so calling this again with a new filename means that - * all logs will go to the new file instead of the old one. - * - * The logging can be configured to be done in a circular way by setting circular_chunks to a value - * greater than 0. Each chunk will have at most max_size_kb KB. - * - * @param filename The name of the file to log to. If NULL, this function does nothing. - * @param circular_chunks The number of chunks to store circularly (apart from the original one). - * @param min_level The minimum level of the logs to be stored. - * @param max_size_kb The maximum size in KB of each size of the log file. Once the file reaches - * that limit, no further logging will be made to it. - * - * @return TRUE if the file can be created and opened, FALSE otherwise - */ -BOOLEAN azx_log_send_to_file(const CHAR* filename, UINT32 circular_chunks, - AZX_LOG_LEVEL_E min_level, UINT32 max_size_kb); - -/** - * @brief Flushes any outstanding logs to the file. - * - * Without calling this, there is no guarantee of when the logs will be written to the filesystem. - * It may take longer due to caching. - */ -void azx_log_flush_to_file(void); - #endif /* HDR_AZX_LOG_H_ */ diff --git a/Samples/BRAVO_Rotation_Demo/azx/hdr/azx_utils.h b/Samples/BRAVO_Rotation_Demo/azx/hdr/azx_utils.h index d0ffd84..b4905da 100644 --- a/Samples/BRAVO_Rotation_Demo/azx/hdr/azx_utils.h +++ b/Samples/BRAVO_Rotation_Demo/azx/hdr/azx_utils.h @@ -1,11 +1,10 @@ -/*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/ -/* See LICENSE file in the project root for full license information. */ - +/* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */ +/* See LICENSE file in the project root for full license information. */ #ifndef HDR_M2M_UTILS_H_ #define HDR_M2M_UTILS_H_ /** * @file azx_utils.h - * @version 1.0.1 + * @version 1.0.0 * @dependencies azx_log * @author Ioannis Demetriou * @author Sorin Basca @@ -68,7 +67,7 @@ const CHAR* azx_hex_dump(const void* data, UINT32 len); */ /*-----------------------------------------------------------------------------------------------*/ -void azx_reboot_now(void); +void azx_reboot_now(); /** @brief Shuts the modem down straight away. @@ -81,7 +80,7 @@ void azx_reboot_now(void); */ /*-----------------------------------------------------------------------------------------------*/ -void azx_shutdown_now(void); +void azx_shutdown_now(); diff --git a/Samples/BRAVO_Rotation_Demo/azx/src/azx_log.c b/Samples/BRAVO_Rotation_Demo/azx/src/azx_log.c index abade1f..eb6be31 100644 --- a/Samples/BRAVO_Rotation_Demo/azx/src/azx_log.c +++ b/Samples/BRAVO_Rotation_Demo/azx/src/azx_log.c @@ -1,5 +1,5 @@ -/*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/ -/* See LICENSE file in the project root for full license information. */ +/* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */ +/* See LICENSE file in the project root for full license information. */ /* Include files =============================================================*/ @@ -12,17 +12,13 @@ #include "m2mb_usb.h" #include "m2mb_uart.h" -#include "m2mb_fs_posix.h" -#include "m2mb_fs_stdio.h" -#include "m2mb_rtc.h" - #include "app_cfg.h" #include "azx_log.h" /* Local defines =============================================================*/ #define USB_CH_MAX 3 #define LOG_BUFFER_SIZE 2048 -#define MAX_FILE_LOG_CACHE 10000 + #define NO_COLOUR "\033[0m" #define BOLD "\033[1m" @@ -70,15 +66,6 @@ ); \ break -#define LOG_FILE_PREFIX(tag) \ - case AZX_LOG_LEVEL_##tag: \ - offset = snprintf(log_buffer, LOG_BUFFER_SIZE, \ - prefix_fmt_file, get_date_time(), \ - ((now / 10) % 100), #tag, \ - get_file_title(file), line \ - ); \ - break - /* Local typedefs ============================================================*/ /* Local statics =============================================================*/ static struct @@ -89,49 +76,19 @@ static struct INT32 ch_fd; BOOLEAN colouredLogs; M2MB_OS_SEM_HANDLE CSSemHandle; -} log_cfg = {/*.isInit*/ FALSE, /*.level*/ AZX_LOG_LEVEL_NONE, /*.channel*/ AZX_LOG_TO_MAX, /*.ch_fd */ -1, /*.colouredLogs*/ FALSE, /*.CSSemHandle */ NULL}; +} log_cfg = {.isInit=FALSE, .level=AZX_LOG_LEVEL_NONE, .channel=AZX_LOG_TO_MAX, .ch_fd = -1, .colouredLogs=FALSE, .CSSemHandle = NULL}; static CHAR log_buffer[LOG_BUFFER_SIZE] = { 0 }; static CHAR task_name[64]; -static CHAR dateTime[32] = { 0 }; -static struct -{ - M2MB_FILE_T* fd; - CHAR name[32]; - CHAR current_name[40]; - UINT32 circular_chunks; - UINT32 max_size_kb; - AZX_LOG_LEVEL_E min_level; - UINT32 cache_idx; - CHAR cache[MAX_FILE_LOG_CACHE]; -} logFile = { - /*.fd */ - 0, - /*.name */ - { 0 }, - /*.current_name */ - { 0 }, - /*.circular_chunks */ - 0, - /*.max_size_kb */ - 0, - /*.min_level */ - AZX_LOG_LEVEL_CRITICAL, - /*.cache_idx */ - 0, - /*.cache */ - { 0 } -}; static const CHAR* prefix_fmt_colour = "[%s%-5s%s] %3.2f " CYAN "%s" NO_COLOUR ":" BOLD CYAN "%d" NO_COLOUR " - %s{" BOLD WHITE "%s" NO_COLOUR "}$ "; static const CHAR* prefix_fmt_no_colour = "[%s%-5s%s] %3.2f %s:%d - %s{%s}$ "; -static const CHAR* prefix_fmt_file = "%s.%.2u [%-5s] %s:%d "; /* Local function prototypes =================================================*/ @@ -174,13 +131,6 @@ static INT32 log_print_to_USB (const CHAR *path, const CHAR *message ); static UINT32 get_uptime(void); static const char* get_file_title(const CHAR* path); static char* get_current_task_name(CHAR *name); -static BOOLEAN check_file_size(const CHAR* filename, UINT32 max_size_kb); -static void flush_log_to_file(); -static void file_log_or_cache(const CHAR* buffer); -static const CHAR* get_next_log_filename(const CHAR* filename, - UINT32 circular_chunks, UINT32 max_size_kb); -static BOOLEAN rotate_log_files(const CHAR* filename, UINT32 circular_chunks); -static const char* get_date_time(); /* Static functions ==========================================================*/ @@ -301,8 +251,6 @@ static UINT32 get_uptime(void) } -static CHAR fileTitle[12] = ""; - /*-----------------------------------------------------------------------------------------------*/ /*! \brief Removes the file path from the provided path, leaving only filename @@ -315,27 +263,15 @@ static CHAR fileTitle[12] = ""; static const char* get_file_title(const CHAR* path) { const CHAR* p = path; - const CHAR* start = path; - const CHAR* end = path; while (*p) { if (*p == '/' || *p == '\\') { - start = p + 1; - } - - if(*p == '.') { - end = p; + return p + 1; } p++; } - - if(end <= start) { - end = p; - } - - snprintf(fileTitle, sizeof(fileTitle), "%.*s", (INT32)(end - start), start); - return fileTitle; + return path; } @@ -365,29 +301,6 @@ static char* get_current_task_name(CHAR *name) } } -static const char* get_date_time(void) -{ - INT32 fd = m2mb_rtc_open( "/dev/rtc0", 0 ); - M2MB_RTC_TIME_T ts = { 0 }; - if(fd == -1) - { - dateTime[0] = '\0'; - return dateTime; - } - - if(-1 == m2mb_rtc_ioctl( fd, M2MB_RTC_IOCTL_GET_SYSTEM_TIME, &ts )) - { - m2mb_rtc_close( fd ); - dateTime[0] = '\0'; - return dateTime; - } - m2mb_rtc_close( fd ); - snprintf(dateTime, sizeof(dateTime), "%02u-%02u %02u:%02u:%02u", - ts.mon, ts.day, - ts.hour, ts.min, ts.sec); - return dateTime; -} - /* Global functions ==========================================================*/ @@ -573,210 +486,8 @@ INT32 azx_log_formatted(AZX_LOG_LEVEL_E level, /* Print the message on the selected output stream */ sent = log_base_function(log_buffer); - if(logFile.fd && level >= logFile.min_level) - { - if(!check_file_size(logFile.current_name, logFile.max_size_kb)) - { - /* Log limit reached, so we'll need to open the next file in the rotation. Log in the file - * that this limit is reached and then get the next filename */ - m2mb_fs_fputs("=== Log file size limit reached\r\n", logFile.fd); - m2mb_fs_fclose(logFile.fd); - logFile.fd = 0; - - snprintf(logFile.current_name, sizeof(logFile.current_name), "%s", - get_next_log_filename(logFile.name, logFile.circular_chunks, - logFile.max_size_kb)); - - if(logFile.current_name[0] == '\0') - { - goto end; - } - - logFile.fd = m2mb_fs_fopen(logFile.current_name, "a"); - - if(!logFile.fd) - { - goto end; - } - } - - switch(level) - { - LOG_FILE_PREFIX(TRACE); - LOG_FILE_PREFIX(DEBUG); - LOG_FILE_PREFIX(INFO); - LOG_FILE_PREFIX(WARN); - LOG_FILE_PREFIX(ERROR); - LOG_FILE_PREFIX(CRITICAL); - default: - break; - } - - va_start(arg, fmt); - vsnprintf(log_buffer + offset, LOG_BUFFER_SIZE - offset, fmt, arg); - va_end(arg); - file_log_or_cache(log_buffer); - } - -end: m2mb_os_sem_put(log_cfg.CSSemHandle); } return sent; } - -static BOOLEAN check_file_size(const CHAR* filename, UINT32 max_size_kb) -{ - struct M2MB_STAT stat; - if(-1 == m2mb_fs_stat(filename, &stat)) - { - /* Most likely the file doesn't exist, so return true */ - return TRUE; - } - return ((stat.st_size >> 10) < max_size_kb); -} - -static void flush_log_to_file(void) -{ - logFile.cache[logFile.cache_idx] = '\0'; - m2mb_fs_fwrite(logFile.cache, logFile.cache_idx, 1, logFile.fd); - logFile.cache_idx = 0; -} - -static void file_log_or_cache(const CHAR* buffer) -{ - const UINT32 size = strlen(buffer); - - if(MAX_FILE_LOG_CACHE - 1 - size < logFile.cache_idx) - { - flush_log_to_file(); - } - - memcpy(&logFile.cache[logFile.cache_idx], buffer, size); - logFile.cache_idx += size; -} - -static CHAR filenameInUse[40] = ""; - -static BOOLEAN rotate_log_files(const CHAR* filename, UINT32 circular_chunks) -{ - CHAR from[40] = ""; - CHAR to[40] = ""; - UINT32 i = 0; - - /* This will move log.1 to log.2, log.2 to log.3 and so on until the last one */ - snprintf(from, sizeof(from), "%s.%u", filename, circular_chunks); - - m2mb_fs_remove(from); - - for(i = circular_chunks - 1; i > 0; --i) - { - snprintf(from, sizeof(from), "%s.%u", filename, i); - snprintf(to, sizeof(to), "%s.%u", filename, i+1); - if(-1 == m2mb_fs_rename(from, to)) - { - /* Only return FALSE when the final file cannot be renamed - the other renames could be - * failing if there are no files there */ - if(i == 1) - { - return FALSE; - } - } - } - return TRUE; -} - -static const CHAR* get_next_log_filename(const CHAR* filename, - UINT32 circular_chunks, UINT32 max_size_kb) -{ - filenameInUse[0] = '\0'; - - if(!filename) - { - goto end; - } - - /* First try the original file */ - snprintf(filenameInUse, sizeof(filenameInUse), "%s", filename); - - if(check_file_size(filenameInUse, max_size_kb)) - { - goto end; - } - - /* If there is no circular logging and the original file is full, just return empty string */ - if(circular_chunks == 0) - { - filenameInUse[0] = '\0'; - goto end; - } - - /* We should log to filename.1, but if that's full we need to rotate logs and then still use - * filename.1 (since the old one got moved to filename.2) */ - snprintf(filenameInUse, sizeof(filenameInUse), "%s.1", filename); - - if(check_file_size(filenameInUse, max_size_kb)) - { - goto end; - } - - if(!rotate_log_files(filename, circular_chunks)) - { - /* Since we failed to rotate, just wipe filename.1 so it can be reused */ - m2mb_fs_remove(filenameInUse); - goto end; - } - -end: - return filenameInUse; -} - -BOOLEAN azx_log_send_to_file(const CHAR* filename, UINT32 circular_chunks, - AZX_LOG_LEVEL_E min_level, UINT32 max_size_kb) - -{ - if(!filename) - { - return FALSE; - } - - if(circular_chunks == 0 && !check_file_size(filename, max_size_kb)) - { - return FALSE; - } - - if(logFile.fd) - { - m2mb_fs_fclose(logFile.fd); - logFile.fd = 0; - } - - snprintf(logFile.current_name, sizeof(logFile.current_name), "%s", - get_next_log_filename(filename, circular_chunks, max_size_kb)); - - if(logFile.current_name[0] == '\0') - { - return FALSE; - } - - logFile.fd = m2mb_fs_fopen(logFile.current_name, "a"); - - if(!logFile.fd) - { - return FALSE; - } - - snprintf(logFile.name, sizeof(logFile.name), "%s", filename); - logFile.circular_chunks = circular_chunks; - logFile.min_level = min_level; - logFile.max_size_kb = max_size_kb; - logFile.cache_idx = 0; - return TRUE; -} - -void azx_log_flush_to_file(void) -{ - m2mb_os_sem_get(log_cfg.CSSemHandle, M2MB_OS_WAIT_FOREVER ); - flush_log_to_file(); - m2mb_os_sem_put(log_cfg.CSSemHandle); -} diff --git a/Samples/BRAVO_Rotation_Demo/azx/src/azx_utils.c b/Samples/BRAVO_Rotation_Demo/azx/src/azx_utils.c index a15c5cf..af11062 100644 --- a/Samples/BRAVO_Rotation_Demo/azx/src/azx_utils.c +++ b/Samples/BRAVO_Rotation_Demo/azx/src/azx_utils.c @@ -1,5 +1,5 @@ -/*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/ -/* See LICENSE file in the project root for full license information. */ +/* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */ +/* See LICENSE file in the project root for full license information. */ #include #include @@ -43,26 +43,24 @@ const CHAR* azx_hex_dump(const void* data, UINT32 len) return buff; } -void azx_reboot_now(void) +void azx_reboot_now() { M2MB_POWER_HANDLE h = NULL; if(M2MB_RESULT_SUCCESS == m2mb_power_init(&h, NULL, NULL)) { - AZX_LOG_DEBUG("It's dead, Jim!\r\n"); - AZX_LOG_INFO("Rebooting device\r\n"); + AZX_LOG_ERROR("It's dead, Jim!\r\n"); m2mb_power_reboot(h); } } -void azx_shutdown_now(void) +void azx_shutdown_now() { M2MB_POWER_HANDLE h = NULL; if(M2MB_RESULT_SUCCESS == m2mb_power_init(&h, NULL, NULL)) { - AZX_LOG_DEBUG("It's dead, Jim!\r\n"); - AZX_LOG_INFO("Shutting down device\r\n"); + AZX_LOG_ERROR("It's dead, Jim!\r\n"); m2mb_power_shutdown(h); } } diff --git a/Samples/BRAVO_Rotation_Demo/hdr/app_cfg.h b/Samples/BRAVO_Rotation_Demo/hdr/app_cfg.h index 7f96af8..711dd51 100644 --- a/Samples/BRAVO_Rotation_Demo/hdr/app_cfg.h +++ b/Samples/BRAVO_Rotation_Demo/hdr/app_cfg.h @@ -23,7 +23,7 @@ /** * @brief The current version of the Samples */ -#define VERSION "1.0.3" +#define VERSION "1.0.4" /** * @name Log Settings diff --git a/Samples/BRAVO_Rotation_Demo/src/demo_utils/lwm2m.c b/Samples/BRAVO_Rotation_Demo/src/demo_utils/lwm2m.c index 0a3eeb1..364da7f 100644 --- a/Samples/BRAVO_Rotation_Demo/src/demo_utils/lwm2m.c +++ b/Samples/BRAVO_Rotation_Demo/src/demo_utils/lwm2m.c @@ -15,7 +15,7 @@ @author FabioPi @date - 2020-02-15 + 2021-01-20 */ /* Include files ================================================================================*/ #include @@ -47,7 +47,7 @@ /* Local statics ================================================================================*/ /* ONEEDGE */ -static M2MB_LWM2M_HANDLE _h; +static M2MB_LWM2M_HANDLE lwm2mHandle; static M2MB_LWM2M_OBJ_URI_T _obj_telit_service_uri = {.uriLen = 4, .obj = 33211, .objInst = 0, .resource = 0, .resourceInst = 1}; @@ -92,6 +92,7 @@ void lwm2mIndCB( M2MB_LWM2M_HANDLE h, M2MB_LWM2M_EVENT_E event, UINT16 resp_size if(resp->result == M2MB_LWM2M_RES_SUCCESS) { AZX_LOG_DEBUG( "LWM2M enable result OK\r\n"); + m2mb_os_ev_set(lwm2m_evHandle, EV_LWM2M_ENABLE_RES_BIT, M2MB_OS_EV_SET); } else { @@ -106,6 +107,7 @@ void lwm2mIndCB( M2MB_LWM2M_HANDLE h, M2MB_LWM2M_EVENT_E event, UINT16 resp_size if(resp->result == M2MB_LWM2M_RES_SUCCESS) { AZX_LOG_DEBUG( "LWM2M set result OK\r\n"); + m2mb_os_ev_set(lwm2m_evHandle, EV_LWM2M_SET_RES_BIT, M2MB_OS_EV_SET); } else { @@ -120,6 +122,7 @@ void lwm2mIndCB( M2MB_LWM2M_HANDLE h, M2MB_LWM2M_EVENT_E event, UINT16 resp_size if(resp->result == M2MB_LWM2M_RES_SUCCESS) { AZX_LOG_TRACE( "LWM2M write result OK\r\n"); + m2mb_os_ev_set(lwm2m_evHandle, EV_LWM2M_WRITE_RES_BIT, M2MB_OS_EV_SET); } else { @@ -173,7 +176,7 @@ void lwm2mIndCB( M2MB_LWM2M_HANDLE h, M2MB_LWM2M_EVENT_E event, UINT16 resp_size break; case M2MB_LWM2M_CL_STATE_REGISTERED: AZX_LOG_DEBUG( "resp->info == M2MB_LWM2M_CL_STATE_REGISTERED\r\n" ); - m2mb_os_ev_set(lwm2m_evHandle, EV_SRV_REG_BIT, M2MB_OS_EV_SET); + m2mb_os_ev_set(lwm2m_evHandle, EV_LWM2M_SRV_REG_BIT, M2MB_OS_EV_SET); break; case M2MB_LWM2M_CL_STATE_DEREGISTERING: AZX_LOG_DEBUG( "resp->info == M2MB_LWM2M_CL_STATE_DEREGISTERING\r\n" ); @@ -242,7 +245,7 @@ uint8_t oneedge_init( INT32 obj_id ) { m2mb_os_ev_setAttrItem( &evAttrHandle, M2MB_OS_EV_SEL_CMD_DEL_ATTR, NULL ); AZX_LOG_CRITICAL("m2mb_os_ev_init failed!\r\n"); - return 0; + return -1; } else { @@ -250,43 +253,64 @@ uint8_t oneedge_init( INT32 obj_id ) } - //get the handle of the lwm2m client on _h - retVal = m2mb_lwm2m_init( &_h, lwm2mIndCB, ( void * )NULL ); + //get the handle of the lwm2m client on lwm2mHandle + retVal = m2mb_lwm2m_init( &lwm2mHandle, lwm2mIndCB, ( void * )NULL ); if( retVal != M2MB_RESULT_SUCCESS ) { AZX_LOG_ERROR( "m2mb_lwm2m_init returned error %d\r\n", retVal ); + m2mb_os_ev_deinit( lwm2m_evHandle ); return -1; } - retVal = m2mb_lwm2m_write( _h, &_obj_telit_service_uri, &service_enable, sizeof( INT32 ) ); + retVal = m2mb_lwm2m_write( lwm2mHandle, &_obj_telit_service_uri, &service_enable, sizeof( INT32 ) ); if( retVal != M2MB_RESULT_SUCCESS ) { AZX_LOG_ERROR( "m2mb_lwm2m_write returned error %d\r\n", retVal ); + m2mb_os_ev_deinit( lwm2m_evHandle ); + + m2mb_lwm2m_deinit( lwm2mHandle ); return -1; } //AT#LWM2MENA=1 memset( &pars, 0, sizeof( M2MB_LWM2M_ENABLE_REQ_T ) ); - pars.apnclass = 0; - pars.guardRequestEventSecs = 0; - pars.guardReleaseEventSecs = 0; + pars.apnclass = 1; /*CID*/ + pars.guardRequestEventSecs = 5; + pars.guardReleaseEventSecs = 5; pars.commandType = M2MB_LWM2MENA_CMD_TYPE_SET; pars.mode = M2MB_LWM2M_MODE_NO_ACK; - retVal = m2mb_lwm2m_enable( _h, &pars ); - - - + retVal = m2mb_lwm2m_enable( lwm2mHandle, &pars ); if( retVal != M2MB_RESULT_SUCCESS ) { AZX_LOG_ERROR( "m2mb_lwm2m_enable returned error %d\r\n", retVal ); + m2mb_os_ev_deinit( lwm2m_evHandle ); + m2mb_lwm2m_deinit( lwm2mHandle ); return -1; } + if(M2MB_OS_SUCCESS != m2mb_os_ev_get( + lwm2m_evHandle, + EV_LWM2M_ENABLE_RES_BIT, + M2MB_OS_EV_GET_ANY_AND_CLEAR, + &curEvBits, + M2MB_OS_MS2TICKS(10000) /*wait 10 seconds for the event to occur*/ + ) + ) + { + AZX_LOG_ERROR("m2mb_lwm2m_enable timeout!\r\n"); + m2mb_os_ev_deinit( lwm2m_evHandle ); + azx_sleep_ms(2000); + m2mb_lwm2m_deinit(lwm2mHandle); + return -1; + } + + azx_sleep_ms(1000); + /*new object instance information*/ uri.obj = obj_id; uri.objInst = 0; @@ -294,20 +318,27 @@ uint8_t oneedge_init( INT32 obj_id ) new_inst_params.agent = 0; /*Telit Agent*/ /*If OK the instance was not present, and so it was created. If an error is received, it is likely because the instance already exists.*/ - retVal = m2mb_lwm2m_newinst( _h, &uri, &new_inst_params ); + retVal = m2mb_lwm2m_newinst( lwm2mHandle, &uri, &new_inst_params ); if( retVal != M2MB_RESULT_SUCCESS ) { AZX_LOG_ERROR( "m2mb_lwm2m_newinst returned error %d\r\n", retVal ); + m2mb_os_ev_deinit( lwm2m_evHandle ); + m2mb_lwm2m_deinit( lwm2mHandle ); return -1; } - AZX_LOG_DEBUG("Waiting LWM2M Registering (60 seconds)...\r\n"); - osRes = m2mb_os_ev_get(lwm2m_evHandle, EV_SRV_REG_BIT, M2MB_OS_EV_GET_ANY_AND_CLEAR, &curEvBits, M2MB_OS_MS2TICKS(60000)); + AZX_LOG_DEBUG("Waiting LWM2M Registering (120 seconds timeout)...\r\n"); + osRes = m2mb_os_ev_get(lwm2m_evHandle, EV_LWM2M_SRV_REG_BIT, M2MB_OS_EV_GET_ANY_AND_CLEAR, &curEvBits, M2MB_OS_MS2TICKS(120000)); if(osRes != M2MB_OS_SUCCESS) { AZX_LOG_ERROR("LWM2M Register timeout!\r\n"); - return 1; + m2mb_os_ev_deinit( lwm2m_evHandle ); + + m2mb_lwm2m_disable(lwm2mHandle); + azx_sleep_ms(2000); + m2mb_lwm2m_deinit(lwm2mHandle); + return -1; } return 0; @@ -317,7 +348,7 @@ uint8_t oneedge_init( INT32 obj_id ) /*-----------------------------------------------------------------------------------------------*/ void update_tamper_LWM2MObject( int value ) { - M2MB_RESULT_E retVal = m2mb_lwm2m_write( _h, &_obj_tamper_uri, &value, sizeof( int ) ); + M2MB_RESULT_E retVal = m2mb_lwm2m_write( lwm2mHandle, &_obj_tamper_uri, &value, sizeof( int ) ); if( retVal != M2MB_RESULT_SUCCESS ) { @@ -330,13 +361,13 @@ void update_tamper_LWM2MObject( int value ) /*-----------------------------------------------------------------------------------------------*/ void update_environment_LWM2MObject( float _t, float _p, float _rh, INT16 _iaq ) { - M2MB_RESULT_E retVal = m2mb_lwm2m_set( _h, &_obj_environment_uri_t, &_t, sizeof( float ) ); + M2MB_RESULT_E retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_environment_uri_t, &_t, sizeof( float ) ); azx_sleep_ms( 10 ); - retVal = m2mb_lwm2m_set( _h, &_obj_environment_uri_p, &_p, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_environment_uri_p, &_p, sizeof( float ) ); azx_sleep_ms( 10 ); - retVal = m2mb_lwm2m_set( _h, &_obj_environment_uri_h, &_rh, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_environment_uri_h, &_rh, sizeof( float ) ); azx_sleep_ms( 10 ); - retVal = m2mb_lwm2m_set( _h, &_obj_environment_uri_iaq, &_iaq, sizeof( INT16 ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_environment_uri_iaq, &_iaq, sizeof( INT16 ) ); if( retVal != M2MB_RESULT_SUCCESS ) { @@ -350,15 +381,15 @@ void update_environment_LWM2MObject( float _t, float _p, float _rh, INT16 _iaq ) void update_rotation_LWM2MObject( float _w, float _x, float _y, float _z, INT16 _acc ) { M2MB_RESULT_E retVal; - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_w, &_w, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_w, &_w, sizeof( float ) ); //azx_sleep_ms(100); - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_x, &_x, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_x, &_x, sizeof( float ) ); //azx_sleep_ms(100); - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_y, &_y, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_y, &_y, sizeof( float ) ); //azx_sleep_ms(100); - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_z, &_z, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_z, &_z, sizeof( float ) ); //azx_sleep_ms(100); - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_a, &_acc, sizeof( INT16 ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_a, &_acc, sizeof( INT16 ) ); if( retVal != M2MB_RESULT_SUCCESS ) { @@ -371,7 +402,7 @@ void update_rotation_LWM2MObject( float _w, float _x, float _y, float _z, INT16 /*-----------------------------------------------------------------------------------------------*/ void update_smartlock_LWM2MObject( int value ) { - M2MB_RESULT_E retVal = m2mb_lwm2m_write( _h, &_obj_smartlock_uri, &value, sizeof( int ) ); + M2MB_RESULT_E retVal = m2mb_lwm2m_write( lwm2mHandle, &_obj_smartlock_uri, &value, sizeof( int ) ); if( retVal != M2MB_RESULT_SUCCESS ) { diff --git a/Samples/BRAVO_Rotation_Demo/src/demo_utils/lwm2m.h b/Samples/BRAVO_Rotation_Demo/src/demo_utils/lwm2m.h index 52a7ac0..266a936 100644 --- a/Samples/BRAVO_Rotation_Demo/src/demo_utils/lwm2m.h +++ b/Samples/BRAVO_Rotation_Demo/src/demo_utils/lwm2m.h @@ -33,7 +33,14 @@ #define SMARTLOCK_OBJ_ID 26247 -#define EV_SRV_REG_BIT (UINT32)0x1 /*0x0000000000000001*/ +#define EV_LWM2M_ENABLE_RES_BIT (UINT32)0x00000001 +#define EV_LWM2M_SET_RES_BIT (UINT32)0x00000002 +#define EV_LWM2M_GET_RES_BIT (UINT32)0x00000004 +#define EV_LWM2M_MON_RES_BIT (UINT32)0x00000008 +#define EV_LWM2M_WRITE_RES_BIT (UINT32)0x00000010 +#define EV_LWM2M_READ_RES_BIT (UINT32)0x00000020 +#define EV_LWM2M_SRV_REG_BIT (UINT32)0x00000040 +#define EV_LWM2M_GET_STAT_RES_BIT (UINT32)0x00000080 /** diff --git a/Samples/BRAVO_Tampering_Demo/azx/hdr/azx_log.h b/Samples/BRAVO_Tampering_Demo/azx/hdr/azx_log.h index 38912d3..04f29be 100644 --- a/Samples/BRAVO_Tampering_Demo/azx/hdr/azx_log.h +++ b/Samples/BRAVO_Tampering_Demo/azx/hdr/azx_log.h @@ -1,11 +1,10 @@ -/*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/ -/* See LICENSE file in the project root for full license information. */ - +/* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */ +/* See LICENSE file in the project root for full license information. */ #ifndef HDR_AZX_LOG_H_ #define HDR_AZX_LOG_H_ /** * @file azx_log.h - * @version 1.0.5 + * @version 1.0.2 * @dependencies * @author Fabio Pintus * @author Ioannis Demetriou @@ -40,13 +39,13 @@ */ typedef enum { - AZX_LOG_LEVEL_TRACE = 1, /**< Prints every message, adds a "TRACE" at the beginning of the message*/ - AZX_LOG_LEVEL_DEBUG = 2, /**< Prints most of the messages, adds a "DEBUG" at the beginning of the message*/ - AZX_LOG_LEVEL_INFO = 3, /**< print the message only, without any additional info */ - AZX_LOG_LEVEL_WARN = 4, /**< like DEBUG, but adds a "WARNING" at the beginning of the message. */ - AZX_LOG_LEVEL_ERROR = 5, /**< like DEBUG, but adds an "ERROR" at the beginning of the message */ - AZX_LOG_LEVEL_CRITICAL = 6, /**< like DEBUG, but adds an "CRITICAL" at the beginning of the message */ - AZX_LOG_LEVEL_NONE = 0x7F, /**< Do not print anything */ + AZX_LOG_LEVEL_NONE = 0, /**< Do not print anything */ + AZX_LOG_LEVEL_TRACE = 1, /**< Prints every message, adds a "TRACE" at the beginning of the message*/ + AZX_LOG_LEVEL_DEBUG = 2, /**< Prints most of the messages, adds a "DEBUG" at the beginning of the message*/ + AZX_LOG_LEVEL_INFO = 3, /**< print the message only, without any additional info */ + AZX_LOG_LEVEL_WARN = 4, /**< like DEBUG, but adds a "WARNING" at the beginning of the message. */ + AZX_LOG_LEVEL_ERROR = 5, /**< like DEBUG, but adds an "ERROR" at the beginning of the message */ + AZX_LOG_LEVEL_CRITICAL = 6, /**< like DEBUG, but adds an "CRITICAL" at the beginning of the message */ } AZX_LOG_LEVEL_E; @@ -209,37 +208,4 @@ void azx_log_setLevel(AZX_LOG_LEVEL_E level); */ AZX_LOG_LEVEL_E azx_log_getLevel(void); -/** - * @brief Gets the logging component to output to a file. - * - * Once this is called all the logs will be sent to a named file. The file will be appended to, so - * existing logs there will not be removed. - * - * Logs will continue to be sent to USB/UART if that is so configured. - * - * Only one file can be used at the same time, so calling this again with a new filename means that - * all logs will go to the new file instead of the old one. - * - * The logging can be configured to be done in a circular way by setting circular_chunks to a value - * greater than 0. Each chunk will have at most max_size_kb KB. - * - * @param filename The name of the file to log to. If NULL, this function does nothing. - * @param circular_chunks The number of chunks to store circularly (apart from the original one). - * @param min_level The minimum level of the logs to be stored. - * @param max_size_kb The maximum size in KB of each size of the log file. Once the file reaches - * that limit, no further logging will be made to it. - * - * @return TRUE if the file can be created and opened, FALSE otherwise - */ -BOOLEAN azx_log_send_to_file(const CHAR* filename, UINT32 circular_chunks, - AZX_LOG_LEVEL_E min_level, UINT32 max_size_kb); - -/** - * @brief Flushes any outstanding logs to the file. - * - * Without calling this, there is no guarantee of when the logs will be written to the filesystem. - * It may take longer due to caching. - */ -void azx_log_flush_to_file(void); - #endif /* HDR_AZX_LOG_H_ */ diff --git a/Samples/BRAVO_Tampering_Demo/azx/hdr/azx_utils.h b/Samples/BRAVO_Tampering_Demo/azx/hdr/azx_utils.h index d0ffd84..b4905da 100644 --- a/Samples/BRAVO_Tampering_Demo/azx/hdr/azx_utils.h +++ b/Samples/BRAVO_Tampering_Demo/azx/hdr/azx_utils.h @@ -1,11 +1,10 @@ -/*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/ -/* See LICENSE file in the project root for full license information. */ - +/* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */ +/* See LICENSE file in the project root for full license information. */ #ifndef HDR_M2M_UTILS_H_ #define HDR_M2M_UTILS_H_ /** * @file azx_utils.h - * @version 1.0.1 + * @version 1.0.0 * @dependencies azx_log * @author Ioannis Demetriou * @author Sorin Basca @@ -68,7 +67,7 @@ const CHAR* azx_hex_dump(const void* data, UINT32 len); */ /*-----------------------------------------------------------------------------------------------*/ -void azx_reboot_now(void); +void azx_reboot_now(); /** @brief Shuts the modem down straight away. @@ -81,7 +80,7 @@ void azx_reboot_now(void); */ /*-----------------------------------------------------------------------------------------------*/ -void azx_shutdown_now(void); +void azx_shutdown_now(); diff --git a/Samples/BRAVO_Tampering_Demo/azx/src/azx_log.c b/Samples/BRAVO_Tampering_Demo/azx/src/azx_log.c index abade1f..eb6be31 100644 --- a/Samples/BRAVO_Tampering_Demo/azx/src/azx_log.c +++ b/Samples/BRAVO_Tampering_Demo/azx/src/azx_log.c @@ -1,5 +1,5 @@ -/*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/ -/* See LICENSE file in the project root for full license information. */ +/* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */ +/* See LICENSE file in the project root for full license information. */ /* Include files =============================================================*/ @@ -12,17 +12,13 @@ #include "m2mb_usb.h" #include "m2mb_uart.h" -#include "m2mb_fs_posix.h" -#include "m2mb_fs_stdio.h" -#include "m2mb_rtc.h" - #include "app_cfg.h" #include "azx_log.h" /* Local defines =============================================================*/ #define USB_CH_MAX 3 #define LOG_BUFFER_SIZE 2048 -#define MAX_FILE_LOG_CACHE 10000 + #define NO_COLOUR "\033[0m" #define BOLD "\033[1m" @@ -70,15 +66,6 @@ ); \ break -#define LOG_FILE_PREFIX(tag) \ - case AZX_LOG_LEVEL_##tag: \ - offset = snprintf(log_buffer, LOG_BUFFER_SIZE, \ - prefix_fmt_file, get_date_time(), \ - ((now / 10) % 100), #tag, \ - get_file_title(file), line \ - ); \ - break - /* Local typedefs ============================================================*/ /* Local statics =============================================================*/ static struct @@ -89,49 +76,19 @@ static struct INT32 ch_fd; BOOLEAN colouredLogs; M2MB_OS_SEM_HANDLE CSSemHandle; -} log_cfg = {/*.isInit*/ FALSE, /*.level*/ AZX_LOG_LEVEL_NONE, /*.channel*/ AZX_LOG_TO_MAX, /*.ch_fd */ -1, /*.colouredLogs*/ FALSE, /*.CSSemHandle */ NULL}; +} log_cfg = {.isInit=FALSE, .level=AZX_LOG_LEVEL_NONE, .channel=AZX_LOG_TO_MAX, .ch_fd = -1, .colouredLogs=FALSE, .CSSemHandle = NULL}; static CHAR log_buffer[LOG_BUFFER_SIZE] = { 0 }; static CHAR task_name[64]; -static CHAR dateTime[32] = { 0 }; -static struct -{ - M2MB_FILE_T* fd; - CHAR name[32]; - CHAR current_name[40]; - UINT32 circular_chunks; - UINT32 max_size_kb; - AZX_LOG_LEVEL_E min_level; - UINT32 cache_idx; - CHAR cache[MAX_FILE_LOG_CACHE]; -} logFile = { - /*.fd */ - 0, - /*.name */ - { 0 }, - /*.current_name */ - { 0 }, - /*.circular_chunks */ - 0, - /*.max_size_kb */ - 0, - /*.min_level */ - AZX_LOG_LEVEL_CRITICAL, - /*.cache_idx */ - 0, - /*.cache */ - { 0 } -}; static const CHAR* prefix_fmt_colour = "[%s%-5s%s] %3.2f " CYAN "%s" NO_COLOUR ":" BOLD CYAN "%d" NO_COLOUR " - %s{" BOLD WHITE "%s" NO_COLOUR "}$ "; static const CHAR* prefix_fmt_no_colour = "[%s%-5s%s] %3.2f %s:%d - %s{%s}$ "; -static const CHAR* prefix_fmt_file = "%s.%.2u [%-5s] %s:%d "; /* Local function prototypes =================================================*/ @@ -174,13 +131,6 @@ static INT32 log_print_to_USB (const CHAR *path, const CHAR *message ); static UINT32 get_uptime(void); static const char* get_file_title(const CHAR* path); static char* get_current_task_name(CHAR *name); -static BOOLEAN check_file_size(const CHAR* filename, UINT32 max_size_kb); -static void flush_log_to_file(); -static void file_log_or_cache(const CHAR* buffer); -static const CHAR* get_next_log_filename(const CHAR* filename, - UINT32 circular_chunks, UINT32 max_size_kb); -static BOOLEAN rotate_log_files(const CHAR* filename, UINT32 circular_chunks); -static const char* get_date_time(); /* Static functions ==========================================================*/ @@ -301,8 +251,6 @@ static UINT32 get_uptime(void) } -static CHAR fileTitle[12] = ""; - /*-----------------------------------------------------------------------------------------------*/ /*! \brief Removes the file path from the provided path, leaving only filename @@ -315,27 +263,15 @@ static CHAR fileTitle[12] = ""; static const char* get_file_title(const CHAR* path) { const CHAR* p = path; - const CHAR* start = path; - const CHAR* end = path; while (*p) { if (*p == '/' || *p == '\\') { - start = p + 1; - } - - if(*p == '.') { - end = p; + return p + 1; } p++; } - - if(end <= start) { - end = p; - } - - snprintf(fileTitle, sizeof(fileTitle), "%.*s", (INT32)(end - start), start); - return fileTitle; + return path; } @@ -365,29 +301,6 @@ static char* get_current_task_name(CHAR *name) } } -static const char* get_date_time(void) -{ - INT32 fd = m2mb_rtc_open( "/dev/rtc0", 0 ); - M2MB_RTC_TIME_T ts = { 0 }; - if(fd == -1) - { - dateTime[0] = '\0'; - return dateTime; - } - - if(-1 == m2mb_rtc_ioctl( fd, M2MB_RTC_IOCTL_GET_SYSTEM_TIME, &ts )) - { - m2mb_rtc_close( fd ); - dateTime[0] = '\0'; - return dateTime; - } - m2mb_rtc_close( fd ); - snprintf(dateTime, sizeof(dateTime), "%02u-%02u %02u:%02u:%02u", - ts.mon, ts.day, - ts.hour, ts.min, ts.sec); - return dateTime; -} - /* Global functions ==========================================================*/ @@ -573,210 +486,8 @@ INT32 azx_log_formatted(AZX_LOG_LEVEL_E level, /* Print the message on the selected output stream */ sent = log_base_function(log_buffer); - if(logFile.fd && level >= logFile.min_level) - { - if(!check_file_size(logFile.current_name, logFile.max_size_kb)) - { - /* Log limit reached, so we'll need to open the next file in the rotation. Log in the file - * that this limit is reached and then get the next filename */ - m2mb_fs_fputs("=== Log file size limit reached\r\n", logFile.fd); - m2mb_fs_fclose(logFile.fd); - logFile.fd = 0; - - snprintf(logFile.current_name, sizeof(logFile.current_name), "%s", - get_next_log_filename(logFile.name, logFile.circular_chunks, - logFile.max_size_kb)); - - if(logFile.current_name[0] == '\0') - { - goto end; - } - - logFile.fd = m2mb_fs_fopen(logFile.current_name, "a"); - - if(!logFile.fd) - { - goto end; - } - } - - switch(level) - { - LOG_FILE_PREFIX(TRACE); - LOG_FILE_PREFIX(DEBUG); - LOG_FILE_PREFIX(INFO); - LOG_FILE_PREFIX(WARN); - LOG_FILE_PREFIX(ERROR); - LOG_FILE_PREFIX(CRITICAL); - default: - break; - } - - va_start(arg, fmt); - vsnprintf(log_buffer + offset, LOG_BUFFER_SIZE - offset, fmt, arg); - va_end(arg); - file_log_or_cache(log_buffer); - } - -end: m2mb_os_sem_put(log_cfg.CSSemHandle); } return sent; } - -static BOOLEAN check_file_size(const CHAR* filename, UINT32 max_size_kb) -{ - struct M2MB_STAT stat; - if(-1 == m2mb_fs_stat(filename, &stat)) - { - /* Most likely the file doesn't exist, so return true */ - return TRUE; - } - return ((stat.st_size >> 10) < max_size_kb); -} - -static void flush_log_to_file(void) -{ - logFile.cache[logFile.cache_idx] = '\0'; - m2mb_fs_fwrite(logFile.cache, logFile.cache_idx, 1, logFile.fd); - logFile.cache_idx = 0; -} - -static void file_log_or_cache(const CHAR* buffer) -{ - const UINT32 size = strlen(buffer); - - if(MAX_FILE_LOG_CACHE - 1 - size < logFile.cache_idx) - { - flush_log_to_file(); - } - - memcpy(&logFile.cache[logFile.cache_idx], buffer, size); - logFile.cache_idx += size; -} - -static CHAR filenameInUse[40] = ""; - -static BOOLEAN rotate_log_files(const CHAR* filename, UINT32 circular_chunks) -{ - CHAR from[40] = ""; - CHAR to[40] = ""; - UINT32 i = 0; - - /* This will move log.1 to log.2, log.2 to log.3 and so on until the last one */ - snprintf(from, sizeof(from), "%s.%u", filename, circular_chunks); - - m2mb_fs_remove(from); - - for(i = circular_chunks - 1; i > 0; --i) - { - snprintf(from, sizeof(from), "%s.%u", filename, i); - snprintf(to, sizeof(to), "%s.%u", filename, i+1); - if(-1 == m2mb_fs_rename(from, to)) - { - /* Only return FALSE when the final file cannot be renamed - the other renames could be - * failing if there are no files there */ - if(i == 1) - { - return FALSE; - } - } - } - return TRUE; -} - -static const CHAR* get_next_log_filename(const CHAR* filename, - UINT32 circular_chunks, UINT32 max_size_kb) -{ - filenameInUse[0] = '\0'; - - if(!filename) - { - goto end; - } - - /* First try the original file */ - snprintf(filenameInUse, sizeof(filenameInUse), "%s", filename); - - if(check_file_size(filenameInUse, max_size_kb)) - { - goto end; - } - - /* If there is no circular logging and the original file is full, just return empty string */ - if(circular_chunks == 0) - { - filenameInUse[0] = '\0'; - goto end; - } - - /* We should log to filename.1, but if that's full we need to rotate logs and then still use - * filename.1 (since the old one got moved to filename.2) */ - snprintf(filenameInUse, sizeof(filenameInUse), "%s.1", filename); - - if(check_file_size(filenameInUse, max_size_kb)) - { - goto end; - } - - if(!rotate_log_files(filename, circular_chunks)) - { - /* Since we failed to rotate, just wipe filename.1 so it can be reused */ - m2mb_fs_remove(filenameInUse); - goto end; - } - -end: - return filenameInUse; -} - -BOOLEAN azx_log_send_to_file(const CHAR* filename, UINT32 circular_chunks, - AZX_LOG_LEVEL_E min_level, UINT32 max_size_kb) - -{ - if(!filename) - { - return FALSE; - } - - if(circular_chunks == 0 && !check_file_size(filename, max_size_kb)) - { - return FALSE; - } - - if(logFile.fd) - { - m2mb_fs_fclose(logFile.fd); - logFile.fd = 0; - } - - snprintf(logFile.current_name, sizeof(logFile.current_name), "%s", - get_next_log_filename(filename, circular_chunks, max_size_kb)); - - if(logFile.current_name[0] == '\0') - { - return FALSE; - } - - logFile.fd = m2mb_fs_fopen(logFile.current_name, "a"); - - if(!logFile.fd) - { - return FALSE; - } - - snprintf(logFile.name, sizeof(logFile.name), "%s", filename); - logFile.circular_chunks = circular_chunks; - logFile.min_level = min_level; - logFile.max_size_kb = max_size_kb; - logFile.cache_idx = 0; - return TRUE; -} - -void azx_log_flush_to_file(void) -{ - m2mb_os_sem_get(log_cfg.CSSemHandle, M2MB_OS_WAIT_FOREVER ); - flush_log_to_file(); - m2mb_os_sem_put(log_cfg.CSSemHandle); -} diff --git a/Samples/BRAVO_Tampering_Demo/azx/src/azx_utils.c b/Samples/BRAVO_Tampering_Demo/azx/src/azx_utils.c index a15c5cf..af11062 100644 --- a/Samples/BRAVO_Tampering_Demo/azx/src/azx_utils.c +++ b/Samples/BRAVO_Tampering_Demo/azx/src/azx_utils.c @@ -1,5 +1,5 @@ -/*Copyright (C) 2020 Telit Communications S.p.A. Italy - All Rights Reserved.*/ -/* See LICENSE file in the project root for full license information. */ +/* Copyright (C) Telit Communications S.p.A. Italy All Rights Reserved. */ +/* See LICENSE file in the project root for full license information. */ #include #include @@ -43,26 +43,24 @@ const CHAR* azx_hex_dump(const void* data, UINT32 len) return buff; } -void azx_reboot_now(void) +void azx_reboot_now() { M2MB_POWER_HANDLE h = NULL; if(M2MB_RESULT_SUCCESS == m2mb_power_init(&h, NULL, NULL)) { - AZX_LOG_DEBUG("It's dead, Jim!\r\n"); - AZX_LOG_INFO("Rebooting device\r\n"); + AZX_LOG_ERROR("It's dead, Jim!\r\n"); m2mb_power_reboot(h); } } -void azx_shutdown_now(void) +void azx_shutdown_now() { M2MB_POWER_HANDLE h = NULL; if(M2MB_RESULT_SUCCESS == m2mb_power_init(&h, NULL, NULL)) { - AZX_LOG_DEBUG("It's dead, Jim!\r\n"); - AZX_LOG_INFO("Shutting down device\r\n"); + AZX_LOG_ERROR("It's dead, Jim!\r\n"); m2mb_power_shutdown(h); } } diff --git a/Samples/BRAVO_Tampering_Demo/hdr/app_cfg.h b/Samples/BRAVO_Tampering_Demo/hdr/app_cfg.h index 7f96af8..711dd51 100644 --- a/Samples/BRAVO_Tampering_Demo/hdr/app_cfg.h +++ b/Samples/BRAVO_Tampering_Demo/hdr/app_cfg.h @@ -23,7 +23,7 @@ /** * @brief The current version of the Samples */ -#define VERSION "1.0.3" +#define VERSION "1.0.4" /** * @name Log Settings diff --git a/Samples/BRAVO_Tampering_Demo/src/demo_utils/lwm2m.c b/Samples/BRAVO_Tampering_Demo/src/demo_utils/lwm2m.c index 0a3eeb1..364da7f 100644 --- a/Samples/BRAVO_Tampering_Demo/src/demo_utils/lwm2m.c +++ b/Samples/BRAVO_Tampering_Demo/src/demo_utils/lwm2m.c @@ -15,7 +15,7 @@ @author FabioPi @date - 2020-02-15 + 2021-01-20 */ /* Include files ================================================================================*/ #include @@ -47,7 +47,7 @@ /* Local statics ================================================================================*/ /* ONEEDGE */ -static M2MB_LWM2M_HANDLE _h; +static M2MB_LWM2M_HANDLE lwm2mHandle; static M2MB_LWM2M_OBJ_URI_T _obj_telit_service_uri = {.uriLen = 4, .obj = 33211, .objInst = 0, .resource = 0, .resourceInst = 1}; @@ -92,6 +92,7 @@ void lwm2mIndCB( M2MB_LWM2M_HANDLE h, M2MB_LWM2M_EVENT_E event, UINT16 resp_size if(resp->result == M2MB_LWM2M_RES_SUCCESS) { AZX_LOG_DEBUG( "LWM2M enable result OK\r\n"); + m2mb_os_ev_set(lwm2m_evHandle, EV_LWM2M_ENABLE_RES_BIT, M2MB_OS_EV_SET); } else { @@ -106,6 +107,7 @@ void lwm2mIndCB( M2MB_LWM2M_HANDLE h, M2MB_LWM2M_EVENT_E event, UINT16 resp_size if(resp->result == M2MB_LWM2M_RES_SUCCESS) { AZX_LOG_DEBUG( "LWM2M set result OK\r\n"); + m2mb_os_ev_set(lwm2m_evHandle, EV_LWM2M_SET_RES_BIT, M2MB_OS_EV_SET); } else { @@ -120,6 +122,7 @@ void lwm2mIndCB( M2MB_LWM2M_HANDLE h, M2MB_LWM2M_EVENT_E event, UINT16 resp_size if(resp->result == M2MB_LWM2M_RES_SUCCESS) { AZX_LOG_TRACE( "LWM2M write result OK\r\n"); + m2mb_os_ev_set(lwm2m_evHandle, EV_LWM2M_WRITE_RES_BIT, M2MB_OS_EV_SET); } else { @@ -173,7 +176,7 @@ void lwm2mIndCB( M2MB_LWM2M_HANDLE h, M2MB_LWM2M_EVENT_E event, UINT16 resp_size break; case M2MB_LWM2M_CL_STATE_REGISTERED: AZX_LOG_DEBUG( "resp->info == M2MB_LWM2M_CL_STATE_REGISTERED\r\n" ); - m2mb_os_ev_set(lwm2m_evHandle, EV_SRV_REG_BIT, M2MB_OS_EV_SET); + m2mb_os_ev_set(lwm2m_evHandle, EV_LWM2M_SRV_REG_BIT, M2MB_OS_EV_SET); break; case M2MB_LWM2M_CL_STATE_DEREGISTERING: AZX_LOG_DEBUG( "resp->info == M2MB_LWM2M_CL_STATE_DEREGISTERING\r\n" ); @@ -242,7 +245,7 @@ uint8_t oneedge_init( INT32 obj_id ) { m2mb_os_ev_setAttrItem( &evAttrHandle, M2MB_OS_EV_SEL_CMD_DEL_ATTR, NULL ); AZX_LOG_CRITICAL("m2mb_os_ev_init failed!\r\n"); - return 0; + return -1; } else { @@ -250,43 +253,64 @@ uint8_t oneedge_init( INT32 obj_id ) } - //get the handle of the lwm2m client on _h - retVal = m2mb_lwm2m_init( &_h, lwm2mIndCB, ( void * )NULL ); + //get the handle of the lwm2m client on lwm2mHandle + retVal = m2mb_lwm2m_init( &lwm2mHandle, lwm2mIndCB, ( void * )NULL ); if( retVal != M2MB_RESULT_SUCCESS ) { AZX_LOG_ERROR( "m2mb_lwm2m_init returned error %d\r\n", retVal ); + m2mb_os_ev_deinit( lwm2m_evHandle ); return -1; } - retVal = m2mb_lwm2m_write( _h, &_obj_telit_service_uri, &service_enable, sizeof( INT32 ) ); + retVal = m2mb_lwm2m_write( lwm2mHandle, &_obj_telit_service_uri, &service_enable, sizeof( INT32 ) ); if( retVal != M2MB_RESULT_SUCCESS ) { AZX_LOG_ERROR( "m2mb_lwm2m_write returned error %d\r\n", retVal ); + m2mb_os_ev_deinit( lwm2m_evHandle ); + + m2mb_lwm2m_deinit( lwm2mHandle ); return -1; } //AT#LWM2MENA=1 memset( &pars, 0, sizeof( M2MB_LWM2M_ENABLE_REQ_T ) ); - pars.apnclass = 0; - pars.guardRequestEventSecs = 0; - pars.guardReleaseEventSecs = 0; + pars.apnclass = 1; /*CID*/ + pars.guardRequestEventSecs = 5; + pars.guardReleaseEventSecs = 5; pars.commandType = M2MB_LWM2MENA_CMD_TYPE_SET; pars.mode = M2MB_LWM2M_MODE_NO_ACK; - retVal = m2mb_lwm2m_enable( _h, &pars ); - - - + retVal = m2mb_lwm2m_enable( lwm2mHandle, &pars ); if( retVal != M2MB_RESULT_SUCCESS ) { AZX_LOG_ERROR( "m2mb_lwm2m_enable returned error %d\r\n", retVal ); + m2mb_os_ev_deinit( lwm2m_evHandle ); + m2mb_lwm2m_deinit( lwm2mHandle ); return -1; } + if(M2MB_OS_SUCCESS != m2mb_os_ev_get( + lwm2m_evHandle, + EV_LWM2M_ENABLE_RES_BIT, + M2MB_OS_EV_GET_ANY_AND_CLEAR, + &curEvBits, + M2MB_OS_MS2TICKS(10000) /*wait 10 seconds for the event to occur*/ + ) + ) + { + AZX_LOG_ERROR("m2mb_lwm2m_enable timeout!\r\n"); + m2mb_os_ev_deinit( lwm2m_evHandle ); + azx_sleep_ms(2000); + m2mb_lwm2m_deinit(lwm2mHandle); + return -1; + } + + azx_sleep_ms(1000); + /*new object instance information*/ uri.obj = obj_id; uri.objInst = 0; @@ -294,20 +318,27 @@ uint8_t oneedge_init( INT32 obj_id ) new_inst_params.agent = 0; /*Telit Agent*/ /*If OK the instance was not present, and so it was created. If an error is received, it is likely because the instance already exists.*/ - retVal = m2mb_lwm2m_newinst( _h, &uri, &new_inst_params ); + retVal = m2mb_lwm2m_newinst( lwm2mHandle, &uri, &new_inst_params ); if( retVal != M2MB_RESULT_SUCCESS ) { AZX_LOG_ERROR( "m2mb_lwm2m_newinst returned error %d\r\n", retVal ); + m2mb_os_ev_deinit( lwm2m_evHandle ); + m2mb_lwm2m_deinit( lwm2mHandle ); return -1; } - AZX_LOG_DEBUG("Waiting LWM2M Registering (60 seconds)...\r\n"); - osRes = m2mb_os_ev_get(lwm2m_evHandle, EV_SRV_REG_BIT, M2MB_OS_EV_GET_ANY_AND_CLEAR, &curEvBits, M2MB_OS_MS2TICKS(60000)); + AZX_LOG_DEBUG("Waiting LWM2M Registering (120 seconds timeout)...\r\n"); + osRes = m2mb_os_ev_get(lwm2m_evHandle, EV_LWM2M_SRV_REG_BIT, M2MB_OS_EV_GET_ANY_AND_CLEAR, &curEvBits, M2MB_OS_MS2TICKS(120000)); if(osRes != M2MB_OS_SUCCESS) { AZX_LOG_ERROR("LWM2M Register timeout!\r\n"); - return 1; + m2mb_os_ev_deinit( lwm2m_evHandle ); + + m2mb_lwm2m_disable(lwm2mHandle); + azx_sleep_ms(2000); + m2mb_lwm2m_deinit(lwm2mHandle); + return -1; } return 0; @@ -317,7 +348,7 @@ uint8_t oneedge_init( INT32 obj_id ) /*-----------------------------------------------------------------------------------------------*/ void update_tamper_LWM2MObject( int value ) { - M2MB_RESULT_E retVal = m2mb_lwm2m_write( _h, &_obj_tamper_uri, &value, sizeof( int ) ); + M2MB_RESULT_E retVal = m2mb_lwm2m_write( lwm2mHandle, &_obj_tamper_uri, &value, sizeof( int ) ); if( retVal != M2MB_RESULT_SUCCESS ) { @@ -330,13 +361,13 @@ void update_tamper_LWM2MObject( int value ) /*-----------------------------------------------------------------------------------------------*/ void update_environment_LWM2MObject( float _t, float _p, float _rh, INT16 _iaq ) { - M2MB_RESULT_E retVal = m2mb_lwm2m_set( _h, &_obj_environment_uri_t, &_t, sizeof( float ) ); + M2MB_RESULT_E retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_environment_uri_t, &_t, sizeof( float ) ); azx_sleep_ms( 10 ); - retVal = m2mb_lwm2m_set( _h, &_obj_environment_uri_p, &_p, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_environment_uri_p, &_p, sizeof( float ) ); azx_sleep_ms( 10 ); - retVal = m2mb_lwm2m_set( _h, &_obj_environment_uri_h, &_rh, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_environment_uri_h, &_rh, sizeof( float ) ); azx_sleep_ms( 10 ); - retVal = m2mb_lwm2m_set( _h, &_obj_environment_uri_iaq, &_iaq, sizeof( INT16 ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_environment_uri_iaq, &_iaq, sizeof( INT16 ) ); if( retVal != M2MB_RESULT_SUCCESS ) { @@ -350,15 +381,15 @@ void update_environment_LWM2MObject( float _t, float _p, float _rh, INT16 _iaq ) void update_rotation_LWM2MObject( float _w, float _x, float _y, float _z, INT16 _acc ) { M2MB_RESULT_E retVal; - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_w, &_w, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_w, &_w, sizeof( float ) ); //azx_sleep_ms(100); - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_x, &_x, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_x, &_x, sizeof( float ) ); //azx_sleep_ms(100); - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_y, &_y, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_y, &_y, sizeof( float ) ); //azx_sleep_ms(100); - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_z, &_z, sizeof( float ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_z, &_z, sizeof( float ) ); //azx_sleep_ms(100); - retVal = m2mb_lwm2m_set( _h, &_obj_rotation_uri_a, &_acc, sizeof( INT16 ) ); + retVal = m2mb_lwm2m_set( lwm2mHandle, &_obj_rotation_uri_a, &_acc, sizeof( INT16 ) ); if( retVal != M2MB_RESULT_SUCCESS ) { @@ -371,7 +402,7 @@ void update_rotation_LWM2MObject( float _w, float _x, float _y, float _z, INT16 /*-----------------------------------------------------------------------------------------------*/ void update_smartlock_LWM2MObject( int value ) { - M2MB_RESULT_E retVal = m2mb_lwm2m_write( _h, &_obj_smartlock_uri, &value, sizeof( int ) ); + M2MB_RESULT_E retVal = m2mb_lwm2m_write( lwm2mHandle, &_obj_smartlock_uri, &value, sizeof( int ) ); if( retVal != M2MB_RESULT_SUCCESS ) { diff --git a/Samples/BRAVO_Tampering_Demo/src/demo_utils/lwm2m.h b/Samples/BRAVO_Tampering_Demo/src/demo_utils/lwm2m.h index 52a7ac0..266a936 100644 --- a/Samples/BRAVO_Tampering_Demo/src/demo_utils/lwm2m.h +++ b/Samples/BRAVO_Tampering_Demo/src/demo_utils/lwm2m.h @@ -33,7 +33,14 @@ #define SMARTLOCK_OBJ_ID 26247 -#define EV_SRV_REG_BIT (UINT32)0x1 /*0x0000000000000001*/ +#define EV_LWM2M_ENABLE_RES_BIT (UINT32)0x00000001 +#define EV_LWM2M_SET_RES_BIT (UINT32)0x00000002 +#define EV_LWM2M_GET_RES_BIT (UINT32)0x00000004 +#define EV_LWM2M_MON_RES_BIT (UINT32)0x00000008 +#define EV_LWM2M_WRITE_RES_BIT (UINT32)0x00000010 +#define EV_LWM2M_READ_RES_BIT (UINT32)0x00000020 +#define EV_LWM2M_SRV_REG_BIT (UINT32)0x00000040 +#define EV_LWM2M_GET_STAT_RES_BIT (UINT32)0x00000080 /** diff --git a/Samples/README.md b/Samples/README.md index 544a431..3cef994 100644 --- a/Samples/README.md +++ b/Samples/README.md @@ -4,7 +4,7 @@ -Package Version: **1.0.3** +Package Version: **1.0.4** Firmware Version: **30.00.XX8** @@ -77,7 +77,7 @@ The applications code follow the structure below: ##Applications -### Bravo Tampering demo +### Bravo Environment demo @@ -86,41 +86,47 @@ The applications code follow the structure below: --- - Connect to LWM2M Portal -- Retrieve movement information from BMI160 sensor -- Update portal about current status (IDLE, TAMPER, WALKING... ) +- Retrieve environment information with BSEC library sensor --- -#### Prerequisites +#### Prerequisites on the module -This application requires the file **object_26242.xml** (provided) to be stored into module's `/mod/` folder, along with the application binary itself. +This application requires the file **object_26251.xml** (provided) to be stored into module's `/mod/` folder, along with the application binary itself. To load it, use -`AT#M2MWRITE=/mod/object_26242.xml,1358` +`AT#M2MWRITE=/mod/object_26251.xml,1971` And at prompt, send the file content in raw mode. #### Prerequisites on the OneEdge Portal -This application requires the **object_26242.xml** content to be stored in your OneEdge organization object registry. The latter can be accessed from the link https:///lwm2m/object_registry +This application requires the **object_26251.xml** content to be stored in your OneEdge organization object registry. The latter can be accessed from the link https:///lwm2m/object_registry where could be for example `portal-dev.telit.com`. open the xml file in a notepad tool, select all the content and copy it. Then, in the object registry webpage, press "New Object" button on the right and paste the content of the xml file, then press Add button. -Now from Developer webpage, go in **Thing Definitions** page from the list on the left and press `Import` button on the right. Press `Attach File` and provide `json/bravo_TamperDemo_thing_def.json` from the project root, then press `Import`. +Now from Developer webpage, go in **Thing Definitions** page from the list on the left and press `Import` button on the right. Press `Attach File` and provide `json/bravo_EnvironmentalDemo_thing_def.json` from the project root, then press `Import`. -Again from the Developer webpage, select **Device Profiles**, `Import` button, `Attach File` and provide `json/bravo_TamperDemo_device_profile.json`, then press `Import`. +Again from the Developer webpage, select **Device Profiles**, `Import` button, `Attach File` and provide `json/bravo_EnvironmentalDemo_device_profile.json`, then press `Import`. + + +** External Libraries ** + +To build the application it is required to put `libalgobsec.ar` file into the project's BOSCH/BSEC folder. The library can be retrieved at the link +https://www.bosch-sensortec.com/software-tools/software/bsec/ . Download BSEC 1.4.7.4 version archive, then extract the library `libalgobsec.a` from the ZIP file and rename as `libalgobsec.ar`. It can be found in the directory +/BSEC_1.4.7.4_Generic_Release/algo/normal_version/bin/gcc/Cortex_A7/ -Lastly, from the Developer webpage, select **Triggers**, `Actions` menu on the right, `Import` , `Attach File` and provide `json/bravo_TamperDemo_triggers.json`, then press `Import`. Now open the trigger **bravo_TamperDemo_state_trigger** by pressing the View button (the eye icon on the left) and be sure to press the `play` button, and that the trigger status is 'started'. --- -Tampering Demo application. Debug prints on **MAIN UART** +Environment Demo application. Debug prints on **MAIN UART** -### Bravo Environment demo + +### Bravo Rotation demo @@ -129,47 +135,40 @@ Tampering Demo application. Debug prints on **MAIN UART** --- - Connect to LWM2M Portal -- Retrieve environment information with BSEC library sensor +- Retrieve rotation information from BMI160 sensor +- Update portal about current status (X,Y,Z,W and accuracy values) --- -#### Prerequisites on the module +#### Prerequisites -This application requires the file **object_26251.xml** (provided) to be stored into module's `/mod/` folder, along with the application binary itself. +This application requires the file **object_26250.xml** (provided) to be stored into module's `/mod/` folder, along with the application binary itself. To load it, use -`AT#M2MWRITE=/mod/object_26251.xml,1971` +`AT#M2MWRITE=/mod/object_26250.xml,2249` And at prompt, send the file content in raw mode. #### Prerequisites on the OneEdge Portal -This application requires the **object_26251.xml** content to be stored in your OneEdge organization object registry. The latter can be accessed from the link https:///lwm2m/object_registry +This application requires the **object_26250.xml** content to be stored in your OneEdge organization object registry. The latter can be accessed from the link https:///lwm2m/object_registry where could be for example `portal-dev.telit.com`. open the xml file in a notepad tool, select all the content and copy it. Then, in the object registry webpage, press "New Object" button on the right and paste the content of the xml file, then press Add button. -Now from Developer webpage, go in **Thing Definitions** page from the list on the left and press `Import` button on the right. Press `Attach File` and provide `json/bravo_EnvironmentalDemo_thing_def.json` from the project root, then press `Import`. - -Again from the Developer webpage, select **Device Profiles**, `Import` button, `Attach File` and provide `json/bravo_EnvironmentalDemo_device_profile.json`, then press `Import`. - - -** External Libraries ** +Now from Developer webpage, go in **Thing Definitions** page from the list on the left and press `Import` button on the right. Press `Attach File` and provide `json/bravo_3D-RotationDemo_thing_def.json` from the project root, then press `Import`. -To build the application it is required to put `libalgobsec.ar` file into the project's BOSCH/BSEC folder. The library can be retrieved at the link -https://www.bosch-sensortec.com/software-tools/software/bsec/ . Download BSEC 1.4.7.4 version archive, then extract the library `libalgobsec.a` from the ZIP file and rename as `libalgobsec.ar`. It can be found in the directory -/BSEC_1.4.7.4_Generic_Release/algo/normal_version/bin/gcc/Cortex_A7/ +Again from the Developer webpage, select **Device Profiles**, `Import` button, `Attach File` and provide `json/bravo_3D-RotationDemo_device_profile.json`, then press `Import`. --- - -Environment Demo application. Debug prints on **MAIN UART** +Rotation Demo application. Debug prints on **MAIN UART** -### Bravo Rotation demo +### Bravo Tampering demo @@ -178,34 +177,35 @@ Environment Demo application. Debug prints on **MAIN UART** --- - Connect to LWM2M Portal -- Retrieve rotation information from BMI160 sensor -- Update portal about current status (X,Y,Z,W and accuracy values) +- Retrieve movement information from BMI160 sensor +- Update portal about current status (IDLE, TAMPER, WALKING... ) --- #### Prerequisites -This application requires the file **object_26250.xml** (provided) to be stored into module's `/mod/` folder, along with the application binary itself. +This application requires the file **object_26242.xml** (provided) to be stored into module's `/mod/` folder, along with the application binary itself. To load it, use -`AT#M2MWRITE=/mod/object_26250.xml,2249` +`AT#M2MWRITE=/mod/object_26242.xml,1358` And at prompt, send the file content in raw mode. #### Prerequisites on the OneEdge Portal -This application requires the **object_26250.xml** content to be stored in your OneEdge organization object registry. The latter can be accessed from the link https:///lwm2m/object_registry +This application requires the **object_26242.xml** content to be stored in your OneEdge organization object registry. The latter can be accessed from the link https:///lwm2m/object_registry where could be for example `portal-dev.telit.com`. open the xml file in a notepad tool, select all the content and copy it. Then, in the object registry webpage, press "New Object" button on the right and paste the content of the xml file, then press Add button. -Now from Developer webpage, go in **Thing Definitions** page from the list on the left and press `Import` button on the right. Press `Attach File` and provide `json/bravo_3D-RotationDemo_thing_def.json` from the project root, then press `Import`. +Now from Developer webpage, go in **Thing Definitions** page from the list on the left and press `Import` button on the right. Press `Attach File` and provide `json/bravo_TamperDemo_thing_def.json` from the project root, then press `Import`. -Again from the Developer webpage, select **Device Profiles**, `Import` button, `Attach File` and provide `json/bravo_3D-RotationDemo_device_profile.json`, then press `Import`. +Again from the Developer webpage, select **Device Profiles**, `Import` button, `Attach File` and provide `json/bravo_TamperDemo_device_profile.json`, then press `Import`. +Lastly, from the Developer webpage, select **Triggers**, `Actions` menu on the right, `Import` , `Attach File` and provide `json/bravo_TamperDemo_triggers.json`, then press `Import`. Now open the trigger **bravo_TamperDemo_state_trigger** by pressing the View button (the eye icon on the left) and be sure to press the `play` button, and that the trigger status is 'started'. --- -Rotation Demo application. Debug prints on **MAIN UART** +Tampering Demo application. Debug prints on **MAIN UART**