From c75c48e53c2085d15bb8fe2b2787cdc6892578c8 Mon Sep 17 00:00:00 2001 From: jaseg Date: Mon, 23 Jun 2025 16:40:07 +0200 Subject: [PATCH] Add new measurement recording infrastructure --- fw/.gdbinit | 8 +- fw/adc_serve.py | 64 +++++++--- fw/src/main.c | 108 ++++++++++++---- fw/templates/index.html | 275 +++++++++++++++++++--------------------- fw/upstream/stm32square | 2 +- 5 files changed, 259 insertions(+), 198 deletions(-) diff --git a/fw/.gdbinit b/fw/.gdbinit index 0ea6483..73e4a2c 100644 --- a/fw/.gdbinit +++ b/fw/.gdbinit @@ -21,16 +21,12 @@ svd_load upstream/stm32square/svd/STM32G474.svd break debug_plot_hook commands - dump binary memory /tmp/adc1_readings.bin adc1_readings adc1_readings+(sizeof(adc1_readings)/sizeof(*adc1_readings)) - dump binary memory /tmp/adc1_variance.bin adc1_variance adc1_variance+(sizeof(adc1_readings)/sizeof(*adc1_readings)) - dump binary memory /tmp/adc2_readings.bin adc2_readings adc2_readings+(sizeof(adc1_readings)/sizeof(*adc1_readings)) - dump binary memory /tmp/adc2_variance.bin adc2_variance adc2_variance+(sizeof(adc1_readings)/sizeof(*adc1_readings)) + dump binary memory /tmp/adc_stats.bin &host_data &host_data+1 restore /tmp/dbg_settings.bin binary dbg_settings p/x dbg_settings cont end -dump binary memory /tmp/dbg_settings.bin &dbg_settings &dbg_settings+1 - load +dump binary memory /tmp/dbg_settings.bin &dbg_settings &dbg_settings+1 cont diff --git a/fw/adc_serve.py b/fw/adc_serve.py index de7ded9..5df1f84 100644 --- a/fw/adc_serve.py +++ b/fw/adc_serve.py @@ -22,15 +22,14 @@ dbg_settings = None def index(): return render_template('index.html') -def watch_adc_graphs(sock): +def watch_adc_graphs(sock, stat_path='/tmp/adc_stats.bin'): + stat_path = Path(stat_path) + def handler(): - Path('/tmp/adc1_readings.bin').touch() - Path('/tmp/adc2_readings.bin').touch() - Path('/tmp/adc1_variance.bin').touch() - Path('/tmp/adc2_variance.bin').touch() + stat_path.touch() in_handle = inotify.adapters.Inotify() - in_handle.add_watch('/tmp/adc2_variance.bin', mask=inotify.constants.IN_CLOSE_WRITE) + in_handle.add_watch(str(stat_path), mask=inotify.constants.IN_CLOSE_WRITE) for event in in_handle.event_gen(yield_nones=False): if dbg_settings is None: # not yet initialized from UI print('ignoring update') @@ -40,16 +39,43 @@ def watch_adc_graphs(sock): oversampling = int(dbg_settings['oversampling']); scale = 3.3 / (2**12) / oversampling; - def read_data(fn, scale): - data = np.frombuffer(Path(fn).read_bytes(), dtype=np.uint32) - data = data[::-1] # restore causality ;) - data = data * scale - return data.tolist() - - sock.emit('graph_update', {'adc1': read_data('/tmp/adc1_readings.bin', scale), - 'var1': read_data('/tmp/adc1_variance.bin', scale**2/oversampling), - 'adc2': read_data('/tmp/adc2_readings.bin', scale), - 'var2': read_data('/tmp/adc2_variance.bin', scale**2/oversampling)}) + data = np.frombuffer(stat_path.read_bytes(), dtype=np.uint32) + # cast to python ints for arbitrary precision arithmetic + mcu_serial = int(data[0]) | (int(data[1])<<32) | (int(data[2])<<64); + mcu_serial = f'{mcu_serial:024x}' + + chip_type = { + '203632423631500f003f0034': 'pi3hdx12211', + 'b': 'tdp0604', + }.get(mcu_serial, 'unknown') + + data = data[3:].astype(float).reshape((7, 4, -1)) + data[:,:,:] = data[:,:,::-1] # restore causality ;) + + # Scale mean data + data[:,0,:] *= scale + data[:,2,:] *= scale + + # Scale variance data + data[:,1,:] *= scale**2/oversampling + data[:,3,:] *= scale**2/oversampling + + sock.emit('graph_update', { + 'mcu_serial': mcu_serial, + 'chip_type': chip_type, + 'data': {key: { + 'adc1': data[idx][0].tolist(), + 'var1': data[idx][1].tolist(), + 'adc2': data[idx][2].tolist(), + 'var2': data[idx][3].tolist(), + } for idx, key in enumerate([ + 'cal', + 'open_fwd', + 'open_flip', + 'load_fwd', + 'load_flip', + 'short_fwd', + 'short_flip'])}}) adc_thr = threading.Thread(target=handler, daemon=True) adc_thr.start() @@ -62,11 +88,7 @@ def handle(data): else: dbg_settings.update(data) - out = 0 - for i, key in enumerate(['mesh_flip_n', 'mesh_flip', 'rf_term', 'rf_term_short']): - if dbg_settings[key]: - out |= 1<BSRR = 1<<4; } else { GPIOC->BRR = 1<<4; } - if (dbg_settings[0] & DBG_MESH_FLIP_N) { + + if (now.flip_n) { GPIOB->BSRR = 1<<1; } else { GPIOB->BRR = 1<<1; } - if (dbg_settings[0] & DBG_RF_TERM) { + + if (now.term) { GPIOC->BSRR = 1<<14; } else { GPIOC->BRR = 1<<14; } - if (dbg_settings[0] & DBG_RF_TERM_SHORT) { + + if (now.term_short) { GPIOC->BSRR = 1<<15; } else { GPIOC->BRR = 1<<15; } +} + +void debug_plot_hook(void); +void debug_plot_hook(void){ sampling_phase_var = (dbg_settings[0]>>4) & 0xff; sampling_width = (dbg_settings[0]>>12) & 0xff; stim_offset = (dbg_settings[0]>>20) & 0xff; @@ -232,6 +276,11 @@ int main(void) { GPIOC->BRR = (1<<4) | (1<<7) | (1<<14) | (1<<15); /* Clear all outputs on this bank */ GPIOC->BSRR = 0xf; + const uint32_t *mcu_uid_reg = (const uint32_t *)UID_BASE; + host_data.mcu_serial[0] = mcu_uid_reg[0]; + host_data.mcu_serial[1] = mcu_uid_reg[1]; + host_data.mcu_serial[2] = mcu_uid_reg[2]; + /* GPIOD: * 2 - SFP5 * @@ -335,7 +384,7 @@ int main(void) { HRTIM1->sTimerxRegs[1].TIMxCR = HRTIM_TIMCR_MSTU; HRTIM1->sTimerxRegs[1].PERxR = HRTIM1->sMasterRegs.MPER; HRTIM1->sTimerxRegs[1].RSTxR = HRTIM_RSTR_MSTPER; - int sampling_phase_var = (dbg_settings[0]>>4) & 0x3f; + //int sampling_phase_var = (dbg_settings[0]>>4) & 0x3f; //HRTIM1->sTimerxRegs[1].CMP3xR = (global_sampling_offset + sampling_phase_var) * 0x20; //HRTIM1->sTimerxRegs[1].CMP4xR = (global_sampling_offset + sampling_phase_var) * 0x20; @@ -479,7 +528,7 @@ void DMA1_Channel1_IRQHandler(void) { * width anyway. */ int mean1 = 0, sqmean1 = 0; int mean2 = 0, sqmean2 = 0; - for (size_t i=2; iBRR = 1<<2; - debug_plot_hook(); - GPIOC->BSRR = 1<<2; - for (size_t i=0; iBRR = 1<<2; + debug_plot_hook(); + GPIOC->BSRR = 1<<2; + + meas_pb_now = 0; + + memset(&host_data.adc_stats, 0, sizeof(host_data.adc_stats)); } } diff --git a/fw/templates/index.html b/fw/templates/index.html index b6e84b2..5613133 100644 --- a/fw/templates/index.html +++ b/fw/templates/index.html @@ -9,31 +9,17 @@

Device settings

- - - - @@ -50,122 +36,84 @@

Download data

-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+
+ + + + + +
+
-

ADC 1

-
-
-
Threshold
+
+ + + - + + + - + + + -
- - - - - - - - - - - - - - - - - - - - - - -
101001000
Mean [ns]
Stdev [ps]
Min [ns]
Max [ns]
-
+ + + + +
+ +
+ +
+ +
-

ADC 2

-
-
-
Threshold
+