3.2. Interactive Run

PikaScript supports reading strings directly to run Python scripts, so to support interactive operation, you only need to make a serial port receiving driver.

3.2.2. Option 2: Run by byte input

The obj_runChar kernel API can specify an object to execute a script with one byte of input.

You need to run obj_runCharInit() before you can use obj_runChar.

Example code.

PikaObj* pikaMain = pikaScriptInit();

obj_runCharInit(pikaMain);

while(1){
    char ch = my_get_char();
    obj_runChar(pikaMain, ch);
}

3.2.2.1. Caution.

Kernel version needs to be no less than v1.8.3

3.2.3. Option 3: Read and run the entire line

obj_run kernel API can specify an object to execute a script, and use this API to execute a single-line or multi-line script. The following is an example of the interactive running driver of CH32. This interactive running support is written in the main loop of the firmware and starts to execute after the pikaScriptInit() initialization script is executed.

    PikaObj *PikaMain = pikaScriptInit();
    printf(">>>");
    while(1)
    {
        if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)
        {
            is_Rx_start = 1;
            t_start = rt_tick_get();
            rxCh = USART_ReceiveData(USART1);
            if(rxCh < 128){
                RxBuffer[RxCnt++] = rxCh;
            }
        }
        if( (is_Rx_start == 1) && (rt_tick_get() - t_start > 10) ){
            is_Rx_start = 0;
            for(int i = 0; i< RxCnt; i ++)
            {
                USART_SendData(USART1, RxBuffer[i]);
                while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)== RESET);
            }
            obj_run(PikaMain, RxBuffer);
            printf(">>>");
            memset(RxBuffer, 0, 256);
            RxCnt = 0;
        }
    }

3.2.3.1. Driven Content

  • Poll to receive characters and store them in the buffer.

  • A reception is considered complete when no new characters are received for more than 10ms. Using the idle time to determine the completion of the transmission of the string can support interactive running of multi-line scripts. If you only need to run the single-numbered script, you can use the newline character '\n' to determine the end of the string reception. When running a single-line script, the '\n' line break can be omitted, and a multi-line script needs to have a '\n' line break. Newlines of the form "\r\n" are also supported.

  • Echo the received string after receiving.

  • Execute scripts using the obj_run kernel API. The specified object is the root object created by the pikaScriptInit() init script, and the execution content is the received string.

  • Clean up the receive buffer.

3.2.3.2. Notes:

  • Kernel version needs to be at least v1.2.6

  • When executing a multi-line script, you need to pass in a complete code block For example: the following script is a complete code block, especially the 4th line, which needs to have an indent of 0 to mark the end of the code block. and the last line needs to have a blank line, which means print('the end') with a newline at the end of the script.

while a < 10:
a = a + 1
    print(a)
print('the end')

The following example is also possible

while a < 10:
a = a + 1
    print(a)

The following example does not work

# Missing final newline
while a < 10:
a = a + 1
    print(a)
# The content of the while block is missing
while a < 10:

3.2.4. Quit Interaction

Type exit() to exit the interactive run.