| *** Keywords *** |
| Create Machine With Button And LED |
| [Arguments] ${firmware} ${usart}=2 ${button_port}=B ${button_pin}=2 ${led_port}=A ${led_pin}=5 |
| IF "${firmware}" == "button" |
| Execute Command $bin = @https://dl.antmicro.com/projects/renode/b_l072z_lrwan1--zephyr-button.elf-s_402204-2343dc7268dedc253893a84300f3dbd02bc63a2a |
| ELSE IF "${firmware}" == "blinky" |
| Execute Command $bin = @https://dl.antmicro.com/projects/renode/b_l072z_lrwan1--zephyr-blinky.elf-s_395652-4d2c6106335435629d3611d2a732e37ca9f17eeb |
| ELSE IF "${firmware}" == "led_shell" |
| Execute Command $bin = @https://dl.antmicro.com/projects/renode/b_l072z_lrwan1--zephyr-led_shell.elf-s_1471160-5398b2ac0ab1c71ec144eba55f4840d86ddb921a |
| ELSE IF "${firmware}" == "pwm_shell" |
| Execute Command $bin = @https://dl.antmicro.com/projects/renode/b_l072z_lrwan1--zephyr-custom_shell_pwm.elf-s_884872-f36f63ef9435aaf89f37922d3c78428c52be1320 |
| ELSE |
| Fail Unknown firmware '${firmware}' |
| END |
| Execute Command include @scripts/single-node/stm32l072.resc |
| Execute Command machine LoadPlatformDescriptionFromString "gpioPort${led_port}: { ${led_pin} -> led@0 }; led: Miscellaneous.LED @ gpioPort${led_port} ${led_pin}" |
| Execute Command machine LoadPlatformDescriptionFromString "button: Miscellaneous.Button @ gpioPort${button_port} ${button_pin} { invert: true; -> gpioPort${button_port}@${button_pin} }" |
| |
| Create Terminal Tester sysbus.usart${usart} |
| Create LED Tester sysbus.gpioPort${led_port}.led defaultTimeout=2 |
| |
| Emulation Should Be Paused |
| ${st}= Execute Command emulation IsStarted |
| Should Contain ${st} False |
| |
| Emulation Should Be Paused At Time |
| [Arguments] ${time} |
| Emulation Should Be Paused |
| ${ts}= Execute Command machine GetTimeSourceInfo |
| Should Contain ${ts} Elapsed Virtual Time: ${time} |
| |
| Emulation Should Not Be Paused |
| ${st}= Execute Command emulation IsStarted |
| Should Contain ${st} True |
| |
| *** Test Cases *** |
| Terminal Tester Assert Should Start Emulation |
| Create Machine With Button And LED button |
| |
| Emulation Should Be Paused |
| |
| Wait For Line On Uart Press the button |
| |
| Emulation Should Not Be Paused |
| |
| Terminal Tester Idle Assert Should Start Emulation |
| # We attach the tester to usart1 because nothing is printed to it |
| Create Machine With Button And LED button usart=1 |
| |
| Emulation Should Be Paused |
| |
| Test If Uart Is Idle 2 |
| |
| Emulation Should Not Be Paused |
| |
| Terminal Tester Assert Should Not Start Emulation If Matching String Has Already Been Printed |
| Create Machine With Button And LED button |
| |
| # Give the sample plenty of virtual time to print the string |
| Execute Command emulation RunFor "0.1" |
| |
| Emulation Should Be Paused At Time 00:00:00.100000 |
| |
| Provides string-printed-without-assert |
| |
| Wait For Line On Uart Press the button |
| |
| Emulation Should Be Paused At Time 00:00:00.100000 |
| |
| Terminal Tester Assert Should Not Start Emulation With Timeout 0 |
| Requires string-printed-without-assert |
| |
| Run Keyword And Expect Error *Terminal tester failed* Wait For Line On Uart String that was not printed timeout=0 |
| |
| Emulation Should Be Paused At Time 00:00:00.100000 |
| |
| Terminal Tester Assert Should Precisely Pause Emulation |
| Create Machine With Button And LED button |
| |
| Wait For Line On Uart Press the button pauseEmulation=true |
| |
| Execute Command gpioPortB.button Press |
| |
| ${l}= Wait For Line On Uart Button pressed at (\\d+) pauseEmulation=true treatAsRegex=true |
| Should Be Equal ${l.groups[0]} 6401 |
| |
| Emulation Should Be Paused At Time 00:00:00.000226 |
| PC Should Be Equal 0x8002c0a # this is the next instruction after STR that writes to TDR in LL_USART_TransmitData8 |
| |
| Emulation Should Pause Precisely Between Translation Blocks |
| Create Machine With Button And LED button |
| # Forcing all blocks to contain a single instruction will force the precise pauses to be handled between blocks |
| Execute Command cpu MaximumBlockSize 1 |
| |
| Wait For Line On Uart Press the button pauseEmulation=true |
| |
| Execute Command gpioPortB.button Press |
| |
| ${l}= Wait For Line On Uart Button pressed at (\\d+) pauseEmulation=true treatAsRegex=true |
| Should Be Equal ${l.groups[0]} 6401 |
| |
| Emulation Should Be Paused At Time 00:00:00.000226 |
| PC Should Be Equal 0x8002c0a # this is the next instruction after STR that writes to TDR in LL_USART_TransmitData8 |
| |
| Quantum Should Not Impact Tester Pause PC |
| Create Machine With Button And LED button |
| Execute Command emulation SetGlobalQuantum "0.010000" |
| |
| Wait For Line On Uart Press the button pauseEmulation=true |
| |
| Execute Command gpioPortB.button Press |
| |
| Wait For Line On Uart Button pressed at (\\d+) pauseEmulation=true treatAsRegex=true |
| |
| PC Should Be Equal 0x8002c0a |
| |
| RunFor Should Work After Precise Pause |
| Create Machine With Button And LED button |
| |
| Wait For Line On Uart Press the button pauseEmulation=true |
| Emulation Should Be Paused At Time 00:00:00.000179 |
| |
| Execute Command emulation RunFor "0.1" |
| Emulation Should Be Paused At Time 00:00:00.100179 |
| |
| LED Tester Assert Should Start Emulation Unless The State Already Matches |
| Create Machine With Button And LED blinky |
| |
| # The LED state is false by default on reset because it is not inverted, so this assert |
| # should pass immediately without starting the emulation |
| Assert LED State false |
| Emulation Should Be Paused At Time 00:00:00.000000 |
| |
| # And this one should start the emulation |
| Assert LED State true |
| Emulation Should Not Be Paused |
| |
| LED Tester Assert Should Not Start Emulation With Timeout 0 |
| Create Machine With Button And LED blinky |
| |
| # The LED state is false by default, so this assert should fail immediately without |
| # starting the emulation because the timeout is 0 |
| Run Keyword And Expect Error *LED assertion not met* Assert LED State true 0 |
| |
| Emulation Should Be Paused At Time 00:00:00.000000 |
| |
| LED Tester Assert Should Precisely Pause Emulation |
| Create Machine With Button And LED blinky |
| |
| Assert LED State true pauseEmulation=true |
| Emulation Should Be Paused At Time 00:00:00.000120 |
| PC Should Be Equal 0x8002a48 # this is the next instruction after STR that writes to BSRR in gpio_stm32_port_set_bits_raw |
| |
| Assert LED State false pauseEmulation=true |
| Emulation Should Be Paused At Time 00:00:01.000211 |
| PC Should Be Equal 0x80028a4 # this is the next instruction after STR that writes to BRR in LL_GPIO_ResetOutputPin |
| |
| Provides synced-blinky |
| |
| LED Tester Assert And Hold Should Precisely Pause Emulation |
| Requires synced-blinky |
| |
| # The expected times have 3 decimal places because the default quantum is 0.000100 |
| ${state}= Set Variable False |
| FOR ${i} IN RANGE 2 5 |
| Assert And Hold LED State ${state} timeoutAssert=1 timeoutHold=1 pauseEmulation=true |
| Emulation Should Be Paused At Time 00:00:0${i}.000 |
| ${state}= Evaluate not ${state} |
| END |
| |
| LED Tester Assert Is Blinking Should Precisely Pause Emulation |
| Requires synced-blinky |
| |
| Assert LED Is Blinking testDuration=5 onDuration=1 offDuration=1 pauseEmulation=true |
| Emulation Should Be Paused At Time 00:00:06.000300 |
| |
| LED Tester Assert Duty Cycle Should Precisely Pause Emulation |
| Requires synced-blinky |
| |
| Assert LED Duty Cycle testDuration=5 expectedDutyCycle=0.5 pauseEmulation=true |
| Emulation Should Be Paused At Time 00:00:06.000300 |
| |
| LED And Terminal Testers Should Cooperate |
| Create Machine With Button And LED led_shell |
| |
| Wait For Prompt On Uart $ pauseEmulation=true |
| Write Line To Uart led on leds 0 waitForEcho=false |
| Wait For Line On Uart leds: turning on LED 0 pauseEmulation=true |
| Emulation Should Be Paused At Time 00:00:00.001239 |
| PC Should Be Equal 0x800b26c |
| # The LED should not be turned on yet: the string is printed before actually changing the GPIO |
| Assert LED State false 0 |
| |
| # Now wait for the LED to turn on |
| Assert LED State true pauseEmulation=true |
| Emulation Should Be Paused At Time 00:00:00.001243 |
| PC Should Be Equal 0x800af0c |
| |
| LED Tester Assertion Triggered By PWM Should Not Log Errors |
| Create Log Tester 0 |
| Create Machine With Button And LED pwm_shell led_port=B led_pin=10 |
| |
| ${pwm}= Wait For Line On Uart pwm device: (\\w+) treatAsRegex=true pauseEmulation=true |
| ${pwm}= Set Variable ${pwm.groups[0]} |
| |
| Write Line To Uart pwm cycles ${pwm} 3 256 127 pauseEmulation=true |
| Wait For Prompt On Uart $ pauseEmulation=true |
| |
| # The LED state is true at this point, so this will wait for it to turn off |
| Assert LED State false pauseEmulation=true |
| |
| # There should be a warning but no errors |
| Wait For Log Entry Failed to restart translation block for precise pause keep=true |
| Should Not Be In Log ${EMPTY} level=Error |
| |
| Log Tester Assert Should Precisely Pause Emulation |
| Create Log Tester 5 |
| Create Machine With Button And LED pwm_shell led_port=B led_pin=10 |
| |
| ${pwm}= Wait For Line On Uart pwm device: (\\w+) treatAsRegex=true pauseEmulation=true |
| ${pwm}= Set Variable ${pwm.groups[0]} |
| |
| Write Line To Uart pwm cycles ${pwm} 3 256 127 waitForEcho=false |
| |
| Provides waiting-for-unhandled-write-log |
| |
| Wait For Log Entry Unhandled write to offset 0x1C. pauseEmulation=true |
| Emulation Should Be Paused At Time 00:00:00.001297 |
| |
| Provides paused-at-log-assertion |
| |
| Log Tester Should Not Be In Log Assert Should Precisely Pause Emulation |
| Requires paused-at-log-assertion |
| |
| Should Not Be In Log No such random message in log timeout=2 pauseEmulation=true |
| # The time gets rounded to the sync point |
| Emulation Should Be Paused At Time 00:00:02.001300 |
| |
| Log Tester Should Not Be In Log Assert Should Not Pause Emulation Later If The Matching String Actually Gets Logged |
| Requires waiting-for-unhandled-write-log |
| |
| Run Keyword And Expect Error *Unexpected line detected in the log* Should Not Be In Log Unhandled write to offset 0x1C. timeout=2 pauseEmulation=true |
| Emulation Should Be Paused At Time 00:00:00.001297 |
| |
| Execute Command emulation RunFor "3" |
| Emulation Should Be Paused At Time 00:00:03.001297 |