<p>Kévin Redon has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10313">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add synchronous UART transmission and use it in exceptions<br><br>The default ISR (particularly the HardFault handler) print information,<br>but this information was not displayed on the console because the UART<br>IRQ is lower than some default blocking IRQ.<br>Allowing to set synchronous transfer corrects this.<br><br>The underlying Atmel exception library had to be modified to use the<br>synchronous output, and is now specific to this project since it<br>includes the uart_console library.<br>Making UART_PutChar always synchronous when called from an ISR is not<br>desired because we use TRACE_ macros is some ISR. The synchronous<br>output must be set explicitly.<br><br>Change-Id: I1b4ace5185cf2dc32684934ed12bf6a8682e9bad<br>---<br>M firmware/atmel_softpack_libraries/libchip_sam3s/source/exceptions.c<br>M firmware/libboard/common/include/uart_console.h<br>M firmware/libboard/common/source/uart_console.c<br>3 files changed, 74 insertions(+), 8 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/simtrace2 refs/changes/13/10313/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/firmware/atmel_softpack_libraries/libchip_sam3s/source/exceptions.c b/firmware/atmel_softpack_libraries/libchip_sam3s/source/exceptions.c</span><br><span>index 74e0fbd..e1e8306 100644</span><br><span>--- a/firmware/atmel_softpack_libraries/libchip_sam3s/source/exceptions.c</span><br><span>+++ b/firmware/atmel_softpack_libraries/libchip_sam3s/source/exceptions.c</span><br><span>@@ -2,6 +2,7 @@</span><br><span>  *         ATMEL Microcontroller Software Support</span><br><span>  * ----------------------------------------------------------------------------</span><br><span>  * Copyright (c) 2009, Atmel Corporation</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (c) 2018, sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de></span><br><span>  *</span><br><span>  * All rights reserved.</span><br><span>  *</span><br><span>@@ -42,6 +43,7 @@</span><br><span>  *----------------------------------------------------------------------------*/</span><br><span> </span><br><span> #include "chip.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "uart_console.h"</span><br><span> </span><br><span> /*----------------------------------------------------------------------------</span><br><span>  *        Exported functions</span><br><span>@@ -52,6 +54,7 @@</span><br><span>  */</span><br><span> void IrqHandlerNotUsed( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("NotUsed\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -61,6 +64,7 @@</span><br><span>  */</span><br><span> WEAK void NMI_Handler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("NMI\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -81,6 +85,7 @@</span><br><span> </span><br><span> void hard_fault_handler_c(struct hardfault_args *args)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("\r\nHardFault\r\n");</span><br><span>     printf("R0=%08x, R1=%08x, R2=%08x, R3=%08x, R12=%08x\r\n",</span><br><span>       args->r0, args->r1, args->r2, args->r3, args->r12);</span><br><span>@@ -158,6 +163,7 @@</span><br><span>  */</span><br><span> WEAK void MemManage_Handler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("MemManage\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -167,6 +173,7 @@</span><br><span>  */</span><br><span> WEAK void BusFault_Handler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("BusFault\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -176,6 +183,7 @@</span><br><span>  */</span><br><span> WEAK void UsageFault_Handler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("UsageFault\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -185,6 +193,7 @@</span><br><span>  */</span><br><span> WEAK void SVC_Handler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("SVC\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -194,6 +203,7 @@</span><br><span>  */</span><br><span> WEAK void DebugMon_Handler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("DebugMon\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -203,6 +213,7 @@</span><br><span>  */</span><br><span> WEAK void PendSV_Handler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("PendSV\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -212,6 +223,7 @@</span><br><span>  */</span><br><span> WEAK void SysTick_Handler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("SysTick\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -221,6 +233,7 @@</span><br><span>  */</span><br><span> WEAK void SUPC_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("SUPC\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -230,6 +243,7 @@</span><br><span>  */</span><br><span> WEAK void RSTC_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("RSTC\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -239,6 +253,7 @@</span><br><span>  */</span><br><span> WEAK void RTC_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("RTC\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -248,6 +263,7 @@</span><br><span>  */</span><br><span> WEAK void RTT_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("RTT\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -257,6 +273,7 @@</span><br><span>  */</span><br><span> WEAK void WDT_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("WDT\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -266,6 +283,7 @@</span><br><span>  */</span><br><span> WEAK void PMC_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("PMC\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -275,6 +293,7 @@</span><br><span>  */</span><br><span> WEAK void EEFC_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("EEFC\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -284,6 +303,7 @@</span><br><span>  */</span><br><span> WEAK void UART0_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("UART0\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -293,6 +313,7 @@</span><br><span>  */</span><br><span> WEAK void UART1_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("UART1\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -302,6 +323,7 @@</span><br><span>  */</span><br><span> WEAK void SMC_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("SMC\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -311,6 +333,7 @@</span><br><span>  */</span><br><span> WEAK void PIOA_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("PIOA\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -320,6 +343,7 @@</span><br><span>  */</span><br><span> WEAK void PIOB_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("PIOB\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -329,6 +353,7 @@</span><br><span>  */</span><br><span> WEAK void PIOC_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("PIOC\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -338,6 +363,7 @@</span><br><span>  */</span><br><span> WEAK void USART0_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("USART0\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -347,6 +373,7 @@</span><br><span>  */</span><br><span> WEAK void USART1_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("USART1\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -356,6 +383,7 @@</span><br><span>  */</span><br><span> WEAK void MCI_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("MCI\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -365,6 +393,7 @@</span><br><span>  */</span><br><span> WEAK void TWI0_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("TWI0\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -374,6 +403,7 @@</span><br><span>  */</span><br><span> WEAK void TWI1_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("TWI1\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -383,6 +413,7 @@</span><br><span>  */</span><br><span> WEAK void SPI_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("SPI\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -392,6 +423,7 @@</span><br><span>  */</span><br><span> WEAK void SSC_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("SSC\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -401,6 +433,7 @@</span><br><span>  */</span><br><span> WEAK void TC0_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("TC0\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -410,6 +443,7 @@</span><br><span>  */</span><br><span> WEAK void TC1_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("TC1\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -419,6 +453,7 @@</span><br><span>  */</span><br><span> WEAK void TC2_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("TC2\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -428,6 +463,7 @@</span><br><span>  */</span><br><span> WEAK void TC3_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("TC3\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -437,6 +473,7 @@</span><br><span>  */</span><br><span> WEAK void TC4_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("TC4\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -446,6 +483,7 @@</span><br><span>  */</span><br><span> WEAK void TC5_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("TC5\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -455,6 +493,7 @@</span><br><span>  */</span><br><span> WEAK void ADC_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("ADC\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -464,6 +503,7 @@</span><br><span>  */</span><br><span> WEAK void DAC_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("DAC\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -473,6 +513,7 @@</span><br><span>  */</span><br><span> WEAK void PWM_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("PWM\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -482,6 +523,7 @@</span><br><span>  */</span><br><span> WEAK void CRCCU_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("CRCCU\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -491,6 +533,7 @@</span><br><span>  */</span><br><span> WEAK void ACC_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("ACC\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>@@ -500,6 +543,7 @@</span><br><span>  */</span><br><span> WEAK void USBD_IrqHandler( void )</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+    UART_SetSync( true );</span><br><span>     printf("USBD\r\n");</span><br><span>     while ( 1 ) ;</span><br><span> }</span><br><span>diff --git a/firmware/libboard/common/include/uart_console.h b/firmware/libboard/common/include/uart_console.h</span><br><span>index c0ee3a7..40c9141 100644</span><br><span>--- a/firmware/libboard/common/include/uart_console.h</span><br><span>+++ b/firmware/libboard/common/include/uart_console.h</span><br><span>@@ -33,12 +33,12 @@</span><br><span> #include <stdint.h></span><br><span> </span><br><span> extern void UART_Configure( uint32_t dwBaudrate, uint32_t dwMasterClock ) ;</span><br><span style="color: hsl(0, 100%, 40%);">-extern void UART_Exit(void) ;</span><br><span style="color: hsl(120, 100%, 40%);">+extern void UART_Exit( void ) ;</span><br><span> extern void UART_PutChar( uint8_t uc ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+extern void UART_SetSync( _Bool sync ) ;</span><br><span> extern uint32_t UART_GetChar( void ) ;</span><br><span> extern uint32_t UART_IsRxReady( void ) ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> extern void UART_DumpFrame( uint8_t* pucFrame, uint32_t dwSize ) ;</span><br><span> extern void UART_DumpMemory( uint8_t* pucBuffer, uint32_t dwSize, uint32_t dwAddress ) ;</span><br><span> extern uint32_t UART_GetInteger( uint32_t* pdwValue ) ;</span><br><span>diff --git a/firmware/libboard/common/source/uart_console.c b/firmware/libboard/common/source/uart_console.c</span><br><span>index 3ce7331..e936378 100644</span><br><span>--- a/firmware/libboard/common/source/uart_console.c</span><br><span>+++ b/firmware/libboard/common/source/uart_console.c</span><br><span>@@ -2,6 +2,7 @@</span><br><span>  *         ATMEL Microcontroller Software Support</span><br><span>  * ----------------------------------------------------------------------------</span><br><span>  * Copyright (c) 2009, Atmel Corporation</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (c) 2018, sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de></span><br><span>  *</span><br><span>  * All rights reserved.</span><br><span>  *</span><br><span>@@ -57,6 +58,8 @@</span><br><span> static uint8_t _ucIsConsoleInitialized=0;</span><br><span> /** Ring buffer to queue data to be sent */</span><br><span> static ringbuf uart_tx_buffer;</span><br><span style="color: hsl(120, 100%, 40%);">+/** If UART_PutChar is synchronous (i.e. using blocking polling until character transfer is complete) or asynchronous (i.e. using a buffer and interrupts to complete the transfer). */</span><br><span style="color: hsl(120, 100%, 40%);">+static bool uart_tx_sync = false;</span><br><span> </span><br><span> /**</span><br><span>  * \brief Configures an USART peripheral with the specified parameters.</span><br><span>@@ -119,6 +122,17 @@</span><br><span>       NVIC_DisableIRQ(CONSOLE_IRQ);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/**</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Set if UART_PutChar is synchronous (i.e. using blocking polling until character transfer is complete) or asynchronous (i.e. using a buffer and interrupts to complete the transfer).</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * \note Per default the transfer is asynchronous.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param sync True for synchronous, false for asynchronous.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void UART_SetSync( _Bool sync )</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    uart_tx_sync = sync;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /** Interrupt Service routine to transmit queued data */</span><br><span> void CONSOLE_ISR(void)</span><br><span> {</span><br><span>@@ -148,12 +162,20 @@</span><br><span>                 UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Only store input if buffer is not full, else drop it */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!rbuf_is_full(&uart_tx_buffer)) {</span><br><span style="color: hsl(0, 100%, 40%);">-               rbuf_write(&uart_tx_buffer, c);</span><br><span style="color: hsl(0, 100%, 40%);">-             if (!(pUart->UART_IMR & UART_IMR_TXRDY)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       pUart->UART_IER = UART_IER_TXRDY;</span><br><span style="color: hsl(0, 100%, 40%);">-                    CONSOLE_ISR();</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Send depending on synchronous mode set */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (uart_tx_sync) { /* Send the data synchronously (using blocking polling and waiting for the transfer to complete) */</span><br><span style="color: hsl(120, 100%, 40%);">+               while (!(pUart->UART_SR & UART_SR_TXRDY)); /* Wait for transfer buffer to be empty */</span><br><span style="color: hsl(120, 100%, 40%);">+          pUart->UART_THR = c; /* Send data to UART peripheral */</span><br><span style="color: hsl(120, 100%, 40%);">+            while (!(pUart->UART_SR & UART_SR_TXRDY)); /* Wait for transfer buffer to transferred to shift register */</span><br><span style="color: hsl(120, 100%, 40%);">+             while (!(pUart->UART_SR & UART_SR_TXEMPTY)); /* Wait for transfer shift register to be empty (i.e. transfer is complete) */</span><br><span style="color: hsl(120, 100%, 40%);">+    } else { /* Send the data asynchronously (using a buffer and interrupts) */</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Only store input if buffer is not full, else drop it */</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!rbuf_is_full(&uart_tx_buffer)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     rbuf_write(&uart_tx_buffer, c);</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (!(pUart->UART_IMR & UART_IMR_TXRDY)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             pUart->UART_IER = UART_IER_TXRDY;</span><br><span style="color: hsl(120, 100%, 40%);">+                          CONSOLE_ISR();</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span>            }</span><br><span>    }</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10313">change 10313</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/10313"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: simtrace2 </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I1b4ace5185cf2dc32684934ed12bf6a8682e9bad </div>
<div style="display:none"> Gerrit-Change-Number: 10313 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Kévin Redon <kredon@sysmocom.de> </div>