blob: 1170d079336dc3d9a5d4d2474a0cd5d96ced45e5 [file] [log] [blame]
*** 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}