@@ -142,3 +142,32 @@ void dump_log()
142142 HAL_UART_Transmit (& hcom_uart [COM_ActiveLogPort ], (uint8_t * ) & index , sizeof (index ) , COM_POLL_TIMEOUT );
143143 HAL_UART_Transmit (& hcom_uart [COM_ActiveLogPort ], lwl_data .buffer , LWL_BUFFER_SIZE , COM_POLL_TIMEOUT );
144144}
145+
146+
147+ #if __has_include ("mqtt_client.h" )
148+ #include "mqtt_client.h"
149+ void dump_log_mqtt ()
150+ {
151+ // make sure it does not change while dumping. We may loose a few entries while dumping but it is better than corrupting the data.
152+ lwl_driver .is_initialized = false;
153+
154+ uint8_t metadata [ sizeof (lwl_data .next_entry_index ) + sizeof (uint32_t ) ];
155+ memcpy ( & (metadata [0 ]) , & (lwl_data .next_entry_index ) , sizeof (lwl_data .next_entry_index ) );
156+ memcpy ( & (metadata [sizeof (lwl_data .next_entry_index )]) , & (uint32_t ){LWL_BUFFER_SIZE } , sizeof (uint32_t ) );
157+
158+ mqtt_publish ( mqtt_data .client , MQTT_PUB_LWL_INDEX_ID , metadata , sizeof (metadata ) , 0 , 0 , NULL , NULL );
159+
160+ int32_t current_sent_size = 0 ;
161+ for ( int32_t remaining_data = LWL_BUFFER_SIZE ; remaining_data > 0 ; remaining_data -= current_sent_size )
162+ {
163+ const int32_t payload_max_size = MQTT_OUTPUT_RINGBUF_SIZE - sizeof (MQTT_PUB_LWL_DATA_ID ) - 5 ; // dont know why -5. According to mqtt, largest outgoing publish message = topic+payloads
164+ current_sent_size = ( remaining_data > payload_max_size ) ? payload_max_size : remaining_data ;
165+
166+ err_t rv ;
167+ do {
168+ rv = mqtt_publish ( mqtt_data .client , MQTT_PUB_LWL_DATA_ID , & (lwl_data .buffer [LWL_BUFFER_SIZE - remaining_data ]) , current_sent_size , 0 , 0 , NULL , NULL );
169+ } while ( rv == ERR_MEM );
170+ }
171+ lwl_driver .is_initialized = true;
172+ }
173+ #endif
0 commit comments