| *** Variables *** |
| ${ACCEL} sysbus.i2c1.accel |
| ${UART} sysbus.usart2 |
| ${ACCEL_POLLING_SAMPLE} @https://dl.antmicro.com/projects/renode/b_l072z_lrwan1--zephyr-accel_polling.elf-s_731368-a41b79116936bdadbee51e497847273f971ed409 |
| ${ACCEL_POLLING_SAMPLE_14BIT} @https://dl.antmicro.com/projects/renode/b_l072z_lrwan1--zephyr-accel_polling-high_performance.elf-s_731368-049f6743622eb0b8068dbc2a24742561c8fa046a |
| ${CSV2RESD} ${RENODETOOLS}/csv2resd/csv2resd.py |
| |
| *** Keywords *** |
| Execute Python Script |
| [Arguments] ${path} ${args} |
| |
| Evaluate subprocess.run([sys.executable, "${path}", ${args}]) sys,subprocess |
| |
| Create Machine |
| Execute Command using sysbus |
| Execute Command mach create |
| Execute Command machine LoadPlatformDescription @platforms/cpus/stm32l072.repl |
| Execute Command machine LoadPlatformDescriptionFromString 'accel: Sensors.LIS2DW12 @ i2c1 0x2d' |
| Create Terminal Tester ${UART} |
| Create Log Tester 0 |
| Execute Command logLevel -1 ${ACCEL} |
| |
| Format Fixed Point Integer As Decimal |
| [Arguments] ${value} ${places} |
| |
| ${minus}= Set Variable ${EMPTY} |
| IF ${value} < 0 |
| ${minus}= Set Variable - |
| ${value}= Evaluate abs(${value}) |
| END |
| |
| ${divisor}= Evaluate 10**${places} |
| ${units}= Evaluate ${value} / ${divisor} |
| ${fraction}= Evaluate ${value} % ${divisor} |
| ${string}= Evaluate "${minus}%d.%0${places}d" % (${units}, ${fraction}) |
| |
| [Return] ${string} |
| |
| Wait For Peripheral Reading |
| [Arguments] ${microg} ${resolution} |
| |
| IF ${resolution} == 12 |
| ${sensitivity}= Set Variable 976 |
| ${shift}= Set Variable 4 |
| ELSE IF ${resolution} == 14 |
| ${sensitivity}= Set Variable 244 |
| ${shift}= Set Variable 2 |
| ELSE |
| Fail Invalid resolution ${resolution} bits |
| END |
| |
| ${steps}= Evaluate int(${microg} / ${sensitivity}) |
| ${outValue}= Evaluate ${steps} * ${sensitivity} |
| ${outStr}= Format Fixed Point Integer As Decimal ${outValue} 6 |
| |
| ${lsbs}= Evaluate abs(${steps}) << ${shift} |
| # Use twos-complement representation if negative |
| IF ${steps} < 0 |
| ${lsbs}= Evaluate (abs(${lsbs}) ^ 0xffff) + 1 |
| END |
| ${lsbsStr}= Convert To Hex ${lsbs} prefix=0x length=4 |
| |
| Wait For Line On Uart lis2dw12@2d *\\[g]: *\\( *${outStr}, *${outStr}, *${outStr}\\) treatAsRegex=true pauseEmulation=true |
| Wait For Log Entry Conversion done with sensitivity: 0.${sensitivity}, result: ${lsbsStr} |
| |
| Wait For Peripheral Reading For Set Value And Known LSBs |
| [Arguments] ${microg} ${resolution} ${lsbs} |
| |
| ${g}= Format Fixed Point Integer As Decimal ${microg} 6 |
| # For LIS2DW12 operating in FIFO mode, setting `DefaultAcceleration` would be enough |
| # as it would start returning default samples after RESD stream is finished. |
| # For Bypass mode it needs to be set explicitly (through `Acceleration` properties), |
| # because the actual sample is kept until it is overwritten by a new sample. |
| Execute Command ${ACCEL} DefaultAccelerationX ${g} |
| Execute Command ${ACCEL} DefaultAccelerationY ${g} |
| Execute Command ${ACCEL} DefaultAccelerationZ ${g} |
| Execute Command ${ACCEL} AccelerationX ${g} |
| Execute Command ${ACCEL} AccelerationY ${g} |
| Execute Command ${ACCEL} AccelerationZ ${g} |
| # Wait for the expected LSBs value keeping the entry for use by the following keyword |
| Wait For Log Entry result: ${lsbs} timeout=2 pauseEmulation=true keep=true |
| Wait For Peripheral Reading ${microg} ${resolution} |
| |
| Create RESD File |
| [Arguments] ${resdArgs} |
| ${resdPath}= Evaluate tempfile.mktemp() tempfile |
| ${resdArgs}= Catenate SEPARATOR=, ${resdArgs} r"${resdPath}" |
| |
| Execute Python Script ${CSV2RESD} ${resdArgs} |
| |
| [Return] ${resdPath} |
| |
| Test Teardown And Cleanup RESD File |
| [Arguments] ${resdPath} |
| |
| Test Teardown |
| Remove File ${resdPath} |
| |
| LIS2DW12 Should Return Data From RESD |
| [Arguments] ${firmware} ${resolution} |
| ${resdArgs}= Catenate SEPARATOR=, |
| ... "--input", r"${CURDIR}/LIS2DW12-samples.csv" |
| ... "--frequency", "1" |
| ... "--start-time", "0" |
| ... "--map", "acceleration:x,y,z:x,y,z" |
| |
| ${resdPath}= Create RESD File ${resdArgs} |
| |
| Create Machine |
| |
| Execute Command sysbus LoadELF ${firmware} |
| Wait For Line On Uart Booting Zephyr OS pauseEmulation=true |
| |
| Execute Command ${ACCEL} FeedAccelerationSamplesFromRESD @${resdPath} |
| |
| Wait For Peripheral Reading 100000 ${resolution} |
| Wait For Peripheral Reading 200000 ${resolution} |
| Wait For Peripheral Reading 300000 ${resolution} |
| Wait For Peripheral Reading 400000 ${resolution} |
| Wait For Peripheral Reading 500000 ${resolution} |
| Wait For Peripheral Reading 600000 ${resolution} |
| Wait For Peripheral Reading 700000 ${resolution} |
| Wait For Peripheral Reading -100000 ${resolution} |
| Wait For Peripheral Reading -200000 ${resolution} |
| |
| # Run for an additional second to allow RESD stream to finish before setting an actual sample to an arbitrary value. |
| # Otherwise set sample will be overridden by the one fed from RESD. |
| Execute Command emulation RunFor "1" |
| |
| [Return] ${resdPath} |
| |
| Prepare Multi-Frequency Data Test |
| # 3 blocks starting one after the other: low-frequency, high-frequency, low-frequency |
| ${resdArgs}= Catenate SEPARATOR=, |
| ... "--input", r"${CURDIR}/LIS2DW12-samples_lowfreq1.csv" |
| ... "--frequency", "100" |
| ... "--start-time", "0" |
| ... "--map", "acceleration:x,y,z:x,y,z" |
| ... "--input", r"${CURDIR}/LIS2DW12-samples_highfreq.csv" |
| ... "--frequency", "1600" |
| ... "--start-time", "320000000" |
| ... "--map", "acceleration:x,y,z:x,y,z" |
| ... "--input", r"${CURDIR}/LIS2DW12-samples_lowfreq2.csv" |
| ... "--frequency", "100" |
| ... "--start-time", "340000000" |
| ... "--map", "acceleration:x,y,z:x,y,z" |
| |
| ${resdPath}= Create RESD File ${resdArgs} |
| |
| Execute Command allowPrivates true |
| Execute Command using sysbus |
| Execute Command mach create |
| Execute Command machine LoadPlatformDescriptionFromString "i2c1: I2C.STM32F7_I2C @ sysbus 0x10000000" |
| Execute Command machine LoadPlatformDescriptionFromString "accel: Sensors.LIS2DW12 @ i2c1 0" |
| Execute Command logLevel -1 ${ACCEL} |
| |
| # The accelerometer starts at 100 Hz, which we'll call the "low frequency" |
| Execute Command ${ACCEL} SampleRate 100 |
| Execute Command ${ACCEL} FeedAccelerationSamplesFromRESD @${resdPath} type=MultiFrequency |
| |
| [Return] ${resdPath} |
| |
| Acceleration Should Be |
| [Arguments] ${major} ${minor} |
| |
| ${actual}= Execute Command ${ACCEL} AccelerationX |
| ${minor}= Evaluate "{:03}".format(${minor}) |
| # Why 2 separate rstrips? To turn 0.010 into 0.01, but 0.000 into 0 and not "" |
| ${expected}= Evaluate "${major}.${minor}".rstrip("0").rstrip(".") |
| Should Be Equal ${actual.strip()} ${expected} |
| |
| *** Test Cases *** |
| LIS2DW12 Should Return Data From RESD In 12-Bit Mode |
| ${resdPath}= LIS2DW12 Should Return Data From RESD ${ACCEL_POLLING_SAMPLE} 12 |
| |
| # Test Teardown must be called from a test teardown as it uses Run Keyword If Test Failed, so |
| # we have to repeat this here instead of in LIS2DW12 Should Return Data From RESD |
| [Teardown] Test Teardown And Cleanup RESD File ${resdPath} |
| |
| LIS2DW12 Should Return Data From RESD In 14-Bit Mode |
| ${resdPath}= LIS2DW12 Should Return Data From RESD ${ACCEL_POLLING_SAMPLE_14BIT} 14 |
| |
| # Additionally verify the examples from ST AN5038. In the app note the calculated |
| # mg values are rounded to integers, these are exact values. |
| Wait For Peripheral Reading For Set Value And Known LSBs -40992 14 0xFD60 |
| Wait For Peripheral Reading For Set Value And Known LSBs 7320 14 0x0078 |
| Wait For Peripheral Reading For Set Value And Known LSBs 1046028 14 0x42FC |
| |
| [Teardown] Test Teardown And Cleanup RESD File ${resdPath} |
| |
| LIS2DW12 Should Return Multi-Frequency Data - Switch Late |
| ${resdPath}= Prepare Multi-Frequency Data Test |
| |
| # the full low-frequency block #1 |
| FOR ${i} IN RANGE 32 |
| Acceleration Should Be 0 ${i} # the first low-frequency block has values 0, 0.001, ... |
| Execute Command emulation RunFor "0.01" # play one low-frequency point |
| END |
| # 3 more HF sample periods, staying at the low frequency |
| FOR ${i} IN RANGE 3 |
| Acceleration Should Be 0 31 # the last low-frequency sample repeating |
| Execute Command emulation RunFor "0.000625" # play one high-frequency point |
| END |
| Execute Command ${ACCEL} SampleRate 1600 |
| FOR ${i} IN RANGE 32 |
| Acceleration Should Be 1 ${i} # the high-frequency block has values 1, 1.001, ... |
| Execute Command emulation RunFor "0.000625" # play one high-frequency point |
| END |
| # 3 more HF sample periods, staying at the high frequency |
| FOR ${i} IN RANGE 3 |
| Acceleration Should Be 1 31 # the last high-frequency sample repeating |
| Execute Command emulation RunFor "0.000625" # play one high-frequency point |
| END |
| Execute Command ${ACCEL} SampleRate 100 |
| FOR ${i} IN RANGE 32 |
| Acceleration Should Be 2 ${i} # the second low-frequency block has values 2, 2.001, ... |
| Execute Command emulation RunFor "0.01" # play one low-frequency point |
| END |
| |
| [Teardown] Test Teardown And Cleanup RESD File ${resdPath} |
| |
| LIS2DW12 Should Return Multi-Frequency Data - Switch Early |
| ${resdPath}= Prepare Multi-Frequency Data Test |
| |
| # the first 16 samples of low-frequency block #1 |
| FOR ${i} IN RANGE 16 |
| Acceleration Should Be 0 ${i} # the first low-frequency block has values 0, 0.001, ... |
| Execute Command emulation RunFor "0.01" # play one low-frequency point |
| END |
| Execute Command ${ACCEL} SampleRate 1600 |
| # the first 20 samples of the high-frequency block |
| FOR ${i} IN RANGE 20 |
| Acceleration Should Be 1 ${i} # the high-frequency block has values 1, 1.001, ... |
| Execute Command emulation RunFor "0.000625" # play one high-frequency point |
| END |
| Execute Command ${ACCEL} SampleRate 100 |
| FOR ${i} IN RANGE 32 |
| Acceleration Should Be 2 ${i} # the second low-frequency block has values 2, 2.001, ... |
| Execute Command emulation RunFor "0.01" # play one low-frequency point |
| END |
| |
| [Teardown] Test Teardown And Cleanup RESD File ${resdPath} |