From 086990710cf1f43966c49c7c49547e93814fd572 Mon Sep 17 00:00:00 2001 From: lyon Date: Wed, 6 Oct 2021 23:06:25 +0800 Subject: [PATCH] remove file but main.py and requsetment.txt --- bsp/stm32g030c8/pikascript/PikaObj.py | 14 - bsp/stm32g030c8/pikascript/PikaPiZero.py | 21 - bsp/stm32g030c8/pikascript/PikaStdDevice.py | 149 ---- bsp/stm32g030c8/pikascript/PikaStdLib.py | 27 - bsp/stm32g030c8/pikascript/STM32.py | 71 -- .../pikascript/pikascript-api/PikaMain-api.c | 27 - .../pikascript/pikascript-api/PikaMain.h | 13 - .../pikascript-api/PikaPiZero_RGB-api.c | 51 -- .../pikascript-api/PikaPiZero_RGB.h | 20 - .../pikascript-api/PikaStdDevice_ADC-api.c | 48 -- .../pikascript-api/PikaStdDevice_ADC.h | 19 - .../pikascript-api/PikaStdDevice_GPIO-api.c | 88 -- .../pikascript-api/PikaStdDevice_GPIO.h | 27 - .../pikascript-api/PikaStdDevice_PWM-api.c | 75 -- .../pikascript-api/PikaStdDevice_PWM.h | 23 - .../pikascript-api/PikaStdDevice_Time-api.c | 25 - .../pikascript-api/PikaStdDevice_Time.h | 15 - .../pikascript-api/PikaStdDevice_UART-api.c | 70 -- .../pikascript-api/PikaStdDevice_UART.h | 22 - .../PikaStdLib_MemChecker-api.c | 28 - .../pikascript-api/PikaStdLib_MemChecker.h | 16 - .../pikascript-api/PikaStdLib_SysObj-api.c | 38 - .../pikascript-api/PikaStdLib_SysObj.h | 17 - .../pikascript/pikascript-api/STM32_ADC-api.c | 26 - .../pikascript/pikascript-api/STM32_ADC.h | 15 - .../pikascript-api/STM32_GPIO-api.c | 39 - .../pikascript/pikascript-api/STM32_GPIO.h | 18 - .../pikascript/pikascript-api/STM32_PWM-api.c | 35 - .../pikascript/pikascript-api/STM32_PWM.h | 16 - .../pikascript-api/STM32_Time-api.c | 25 - .../pikascript/pikascript-api/STM32_Time.h | 15 - .../pikascript-api/STM32_UART-api.c | 35 - .../pikascript/pikascript-api/STM32_UART.h | 16 - .../pikascript-api/compiler-info.txt | 1 - .../pikascript/pikascript-api/pikaScript.c | 34 - .../pikascript/pikascript-api/pikaScript.h | 13 - .../pikascript/pikascript-core/.gitignore | 2 - .../pikascript/pikascript-core/BaseObj.c | 160 ---- .../pikascript/pikascript-core/BaseObj.h | 19 - .../pikascript/pikascript-core/PikaBlock.c | 88 -- .../pikascript/pikascript-core/PikaBlock.h | 22 - .../pikascript/pikascript-core/PikaIf.c | 39 - .../pikascript/pikascript-core/PikaIf.h | 13 - .../pikascript/pikascript-core/PikaInvoke.c | 296 ------- .../pikascript/pikascript-core/PikaInvoke.h | 9 - .../pikascript/pikascript-core/PikaObj.c | 783 ------------------ .../pikascript/pikascript-core/PikaObj.h | 99 --- .../pikascript/pikascript-core/PikaObj.py | 14 - .../pikascript/pikascript-core/PikaWhile.c | 47 -- .../pikascript/pikascript-core/PikaWhile.h | 14 - .../pikascript/pikascript-core/README.md | 1 - .../pikascript/pikascript-core/TinyObj.c | 34 - .../pikascript/pikascript-core/TinyObj.h | 10 - .../pikascript/pikascript-core/dataArg.c | 327 -------- .../pikascript/pikascript-core/dataArg.h | 65 -- .../pikascript/pikascript-core/dataArgs.c | 502 ----------- .../pikascript/pikascript-core/dataArgs.h | 71 -- .../pikascript/pikascript-core/dataLink.c | 87 -- .../pikascript/pikascript-core/dataLink.h | 24 - .../pikascript/pikascript-core/dataLinkNode.c | 20 - .../pikascript/pikascript-core/dataLinkNode.h | 15 - .../pikascript/pikascript-core/dataMemory.c | 44 - .../pikascript/pikascript-core/dataMemory.h | 24 - .../pikascript/pikascript-core/dataString.c | 267 ------ .../pikascript/pikascript-core/dataString.h | 38 - .../pikascript/pikascript-core/dataStrs.c | 105 --- .../pikascript/pikascript-core/dataStrs.h | 21 - .../pikascript/pikascript-core/method.c | 30 - .../pikascript/pikascript-core/method.h | 16 - .../pikascript/pikascript-core/pikaPlatform.c | 29 - .../pikascript/pikascript-core/pikaPlatform.h | 19 - .../pikascript-lib/PikaPiZero/PikaPiZero.py | 21 - .../PikaPiZero/PikaPiZero_RGB.c | 95 --- .../pikascript-lib/PikaPiZero/RGB_ASM.c | 38 - .../pikascript-lib/PikaPiZero/RGB_ASM.h | 3 - .../pikascript-lib/PikaPiZero/RGB_ASM.lib | Bin 4380 -> 0 bytes .../PikaStdDevice/PikaStdDeivce_GPIO.c | 80 -- .../PikaStdDevice/PikaStdDevice.py | 149 ---- .../PikaStdDevice/PikaStdDevice_ADC.c | 30 - .../PikaStdDevice/PikaStdDevice_PWM.c | 52 -- .../PikaStdDevice/PikaStdDevice_Time.c | 11 - .../PikaStdDevice/PikaStdDevice_UART.c | 40 - .../pikascript-lib/PikaStdLib/PikaStdLib.py | 27 - .../PikaStdLib/PikaStdLib_MemChecker.c | 14 - .../PikaStdLib/PikaStdLib_SysObj.c | 98 --- .../pikascript/pikascript-lib/STM32/STM32.py | 71 -- .../pikascript-lib/STM32/STM32_ADC.c | 167 ---- .../pikascript-lib/STM32/STM32_Code.c | 137 --- .../pikascript-lib/STM32/STM32_GPIO.c | 142 ---- .../pikascript-lib/STM32/STM32_PWM.c | 366 -------- .../pikascript-lib/STM32/STM32_Time.c | 14 - .../pikascript-lib/STM32/STM32_UART.c | 438 ---------- .../pikascript-lib/STM32/STM32_common.c | 168 ---- .../pikascript-lib/STM32/STM32_common.h | 83 -- .../pikascript/rust-msc-latest-win10.exe | Bin 622592 -> 0 bytes 95 files changed, 6790 deletions(-) delete mode 100644 bsp/stm32g030c8/pikascript/PikaObj.py delete mode 100644 bsp/stm32g030c8/pikascript/PikaPiZero.py delete mode 100644 bsp/stm32g030c8/pikascript/PikaStdDevice.py delete mode 100644 bsp/stm32g030c8/pikascript/PikaStdLib.py delete mode 100644 bsp/stm32g030c8/pikascript/STM32.py delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaMain-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaMain.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaPiZero_RGB-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaPiZero_RGB.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_ADC-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_ADC.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_GPIO-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_GPIO.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_PWM-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_PWM.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_Time-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_Time.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_UART-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_UART.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_MemChecker-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_MemChecker.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_SysObj-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_SysObj.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/STM32_ADC-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/STM32_ADC.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/STM32_GPIO-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/STM32_GPIO.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/STM32_PWM-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/STM32_PWM.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/STM32_Time-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/STM32_Time.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/STM32_UART-api.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/STM32_UART.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/compiler-info.txt delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/pikaScript.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-api/pikaScript.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/.gitignore delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/BaseObj.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/BaseObj.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/PikaBlock.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/PikaBlock.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/PikaIf.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/PikaIf.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/PikaInvoke.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/PikaInvoke.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/PikaObj.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/PikaObj.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/PikaObj.py delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/PikaWhile.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/PikaWhile.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/README.md delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/TinyObj.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/TinyObj.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataArg.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataArg.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataArgs.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataArgs.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataLink.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataLink.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataLinkNode.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataLinkNode.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataMemory.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataMemory.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataString.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataString.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataStrs.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/dataStrs.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/method.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/method.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/pikaPlatform.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-core/pikaPlatform.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/PikaPiZero.py delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/PikaPiZero_RGB.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/RGB_ASM.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/RGB_ASM.h delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/RGB_ASM.lib delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDeivce_GPIO.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice.py delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_ADC.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_PWM.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_Time.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_UART.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdLib/PikaStdLib.py delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_MemChecker.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32.py delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_ADC.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_Code.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_GPIO.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_PWM.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_Time.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_UART.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_common.c delete mode 100644 bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_common.h delete mode 100644 bsp/stm32g030c8/pikascript/rust-msc-latest-win10.exe diff --git a/bsp/stm32g030c8/pikascript/PikaObj.py b/bsp/stm32g030c8/pikascript/PikaObj.py deleted file mode 100644 index ab97533ba..000000000 --- a/bsp/stm32g030c8/pikascript/PikaObj.py +++ /dev/null @@ -1,14 +0,0 @@ -class TinyObj: - pass - - -class BaseObj(TinyObj): - pass - - -def print(val: any): - pass - - -def set(argPath: str, val: any): - pass diff --git a/bsp/stm32g030c8/pikascript/PikaPiZero.py b/bsp/stm32g030c8/pikascript/PikaPiZero.py deleted file mode 100644 index 64e6c69fb..000000000 --- a/bsp/stm32g030c8/pikascript/PikaPiZero.py +++ /dev/null @@ -1,21 +0,0 @@ -from PikaObj import * -import PikaStdLib -import STM32 - -class RGB(PikaStdLib.SysObj): - pin = STM32.GPIO() - def init(): - pass - def enable(): - pass - def red(): - pass - def green(): - pass - def blue(): - pass - def white(): - pass - def flow(): - pass - diff --git a/bsp/stm32g030c8/pikascript/PikaStdDevice.py b/bsp/stm32g030c8/pikascript/PikaStdDevice.py deleted file mode 100644 index 3d39ed4c6..000000000 --- a/bsp/stm32g030c8/pikascript/PikaStdDevice.py +++ /dev/null @@ -1,149 +0,0 @@ -from PikaObj import * - - -class GPIO(TinyObj): - def init(): - pass - - def setPin(pinName: str): - pass - - def getPin() -> str: - pass - - def setMode(mode: str): - pass - - def getMode() -> str: - pass - - def enable(): - pass - - def disable(): - pass - - def high(): - pass - - def low(): - pass - - # need be overrid - def platformHigh(): - pass - - # need override - def platformLow(): - pass - - # need override - def platformEnable(): - pass - - # need override - def platformDisable(): - pass - - # need override - def platformSetMode(mode: str): - pass - - -class Time(TinyObj): - # need override - def sleep_s(s: int): - pass - - # need override - def sleep_ms(ms: int): - pass - - -class ADC(TinyObj): - def init(): - pass - - def setPin(pin: str): - pass - - def enable(): - pass - - def read() -> float: - pass - - # need override - def platformEnable(pin: str): - pass - - # need override - def platformRead(pin: str) -> float: - pass - - -class UART(TinyObj): - def init(): - pass - - def setBaudRate(baudRate: int): - pass - - def setId(id: int): - pass - - def enable(): - pass - - def write(data: str): - pass - - def read(length: int) -> str: - pass - - # need override - def platformEnable(id: int, baudRate: int): - pass - - # need override - def platformWrite(id: int, data: str): - pass - - # need override - def platformRead(id: int, length: int) -> str: - pass - - -class PWM(TinyObj): - def init(): - pass - - def setPin(pin: str): - pass - - def setFrequency(freq: int): - pass - - def setDuty(duty: float): - pass - - def enable(): - pass - - def getFrequency() -> int: - pass - - def getDuty() -> float: - pass - - # need override - def platformEnable(pin: str, freq: int, duty: float): - pass - - # need override - def platformSetFrequency(pin: str, freq: int): - pass - - # need override - def platformSetDuty(pin: str, duty: float): - pass diff --git a/bsp/stm32g030c8/pikascript/PikaStdLib.py b/bsp/stm32g030c8/pikascript/PikaStdLib.py deleted file mode 100644 index 801b6d9e7..000000000 --- a/bsp/stm32g030c8/pikascript/PikaStdLib.py +++ /dev/null @@ -1,27 +0,0 @@ -from PikaObj import * - - -class MemChecker(BaseObj): - def max(): - pass - - def now(): - pass - - def resetMax(): - pass - - -class SysObj(BaseObj): - - def type(argPath: str): - pass - - def ls(objPath: str): - pass - - def remove(argPath: str): - pass - - def new(objPath: str, classPath: str): - pass diff --git a/bsp/stm32g030c8/pikascript/STM32.py b/bsp/stm32g030c8/pikascript/STM32.py deleted file mode 100644 index 3c1c4295c..000000000 --- a/bsp/stm32g030c8/pikascript/STM32.py +++ /dev/null @@ -1,71 +0,0 @@ -from typing import overload -import PikaStdDevice - - -class GPIO(PikaStdDevice.GPIO): - # override - def platformHigh(): - pass - - # override - def platformLow(): - pass - - # override - def platformEnable(): - pass - - # override - def platformDisable(): - pass - - # override - def platformSetMode(mode: str): - pass - - -class Time(PikaStdDevice.Time): - # override - def sleep_s(s: int): - pass - - # override - def sleep_ms(ms: int): - pass - - -class ADC(PikaStdDevice.ADC): - # override - def platformEnable(pin: str): - pass - - # override - def platformRead(pin: str) -> float: - pass - - -class UART(PikaStdDevice.UART): - # override - def platformEnable(id: int, baudRate: int): - pass - - # override - def platformWrite(id: int, data: str): - pass - - # override - def platformRead(id: int, length: int) -> str: - pass - -class PWM(PikaStdDevice.PWM): - # override - def platformEnable(pin: str, freq: int, duty: float): - pass - - # override - def platformSetFrequency(pin: str, freq: int): - pass - - # override - def platformSetDuty(pin: str, duty: float): - pass \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaMain-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/PikaMain-api.c deleted file mode 100644 index 1563234ed..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaMain-api.c +++ /dev/null @@ -1,27 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "PikaMain.h" -#include "PikaStdLib_SysObj.h" -#include "STM32_ADC.h" -#include "PikaStdLib_MemChecker.h" -#include "STM32_GPIO.h" -#include "STM32_PWM.h" -#include "PikaPiZero_RGB.h" -#include "STM32_Time.h" -#include "STM32_UART.h" -#include -#include -#include "BaseObj.h" - -PikaObj *New_PikaMain(Args *args){ - PikaObj *self = New_PikaStdLib_SysObj(args); - obj_import(self, "STM32_ADC", New_STM32_ADC); - obj_import(self, "PikaStdLib_MemChecker", New_PikaStdLib_MemChecker); - obj_import(self, "STM32_GPIO", New_STM32_GPIO); - obj_import(self, "STM32_PWM", New_STM32_PWM); - obj_import(self, "PikaPiZero_RGB", New_PikaPiZero_RGB); - obj_import(self, "STM32_Time", New_STM32_Time); - obj_import(self, "STM32_UART", New_STM32_UART); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaMain.h b/bsp/stm32g030c8/pikascript/pikascript-api/PikaMain.h deleted file mode 100644 index 36803c79d..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaMain.h +++ /dev/null @@ -1,13 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __PikaMain__H -#define __PikaMain__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_PikaMain(Args *args); - - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaPiZero_RGB-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/PikaPiZero_RGB-api.c deleted file mode 100644 index 1f690cd36..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaPiZero_RGB-api.c +++ /dev/null @@ -1,51 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "PikaPiZero_RGB.h" -#include "PikaStdLib_SysObj.h" -#include "STM32_GPIO.h" -#include -#include -#include "BaseObj.h" - -void PikaPiZero_RGB_blueMethod(PikaObj *self, Args *args){ - PikaPiZero_RGB_blue(self); -} - -void PikaPiZero_RGB_enableMethod(PikaObj *self, Args *args){ - PikaPiZero_RGB_enable(self); -} - -void PikaPiZero_RGB_flowMethod(PikaObj *self, Args *args){ - PikaPiZero_RGB_flow(self); -} - -void PikaPiZero_RGB_greenMethod(PikaObj *self, Args *args){ - PikaPiZero_RGB_green(self); -} - -void PikaPiZero_RGB_initMethod(PikaObj *self, Args *args){ - PikaPiZero_RGB_init(self); -} - -void PikaPiZero_RGB_redMethod(PikaObj *self, Args *args){ - PikaPiZero_RGB_red(self); -} - -void PikaPiZero_RGB_whiteMethod(PikaObj *self, Args *args){ - PikaPiZero_RGB_white(self); -} - -PikaObj *New_PikaPiZero_RGB(Args *args){ - PikaObj *self = New_PikaStdLib_SysObj(args); - obj_import(self, "STM32_GPIO", New_STM32_GPIO); - obj_newObj(self, "pin", "STM32_GPIO"); - class_defineMethod(self, "blue()", PikaPiZero_RGB_blueMethod); - class_defineMethod(self, "enable()", PikaPiZero_RGB_enableMethod); - class_defineMethod(self, "flow()", PikaPiZero_RGB_flowMethod); - class_defineMethod(self, "green()", PikaPiZero_RGB_greenMethod); - class_defineMethod(self, "init()", PikaPiZero_RGB_initMethod); - class_defineMethod(self, "red()", PikaPiZero_RGB_redMethod); - class_defineMethod(self, "white()", PikaPiZero_RGB_whiteMethod); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaPiZero_RGB.h b/bsp/stm32g030c8/pikascript/pikascript-api/PikaPiZero_RGB.h deleted file mode 100644 index 098fff4b5..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaPiZero_RGB.h +++ /dev/null @@ -1,20 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __PikaPiZero_RGB__H -#define __PikaPiZero_RGB__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_PikaPiZero_RGB(Args *args); - -void PikaPiZero_RGB_blue(PikaObj *self); -void PikaPiZero_RGB_enable(PikaObj *self); -void PikaPiZero_RGB_flow(PikaObj *self); -void PikaPiZero_RGB_green(PikaObj *self); -void PikaPiZero_RGB_init(PikaObj *self); -void PikaPiZero_RGB_red(PikaObj *self); -void PikaPiZero_RGB_white(PikaObj *self); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_ADC-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_ADC-api.c deleted file mode 100644 index c3715d9ef..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_ADC-api.c +++ /dev/null @@ -1,48 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "PikaStdDevice_ADC.h" -#include "TinyObj.h" -#include -#include -#include "BaseObj.h" - -void PikaStdDevice_ADC_enableMethod(PikaObj *self, Args *args){ - PikaStdDevice_ADC_enable(self); -} - -void PikaStdDevice_ADC_initMethod(PikaObj *self, Args *args){ - PikaStdDevice_ADC_init(self); -} - -void PikaStdDevice_ADC_platformEnableMethod(PikaObj *self, Args *args){ - char * pin = args_getStr(args, "pin"); - PikaStdDevice_ADC_platformEnable(self, pin); -} - -void PikaStdDevice_ADC_platformReadMethod(PikaObj *self, Args *args){ - char * pin = args_getStr(args, "pin"); - float res = PikaStdDevice_ADC_platformRead(self, pin); - method_returnFloat(args, res); -} - -void PikaStdDevice_ADC_readMethod(PikaObj *self, Args *args){ - float res = PikaStdDevice_ADC_read(self); - method_returnFloat(args, res); -} - -void PikaStdDevice_ADC_setPinMethod(PikaObj *self, Args *args){ - char * pin = args_getStr(args, "pin"); - PikaStdDevice_ADC_setPin(self, pin); -} - -PikaObj *New_PikaStdDevice_ADC(Args *args){ - PikaObj *self = New_TinyObj(args); - class_defineMethod(self, "enable()", PikaStdDevice_ADC_enableMethod); - class_defineMethod(self, "init()", PikaStdDevice_ADC_initMethod); - class_defineMethod(self, "platformEnable(pin:str)", PikaStdDevice_ADC_platformEnableMethod); - class_defineMethod(self, "platformRead(pin:str)->float", PikaStdDevice_ADC_platformReadMethod); - class_defineMethod(self, "read()->float", PikaStdDevice_ADC_readMethod); - class_defineMethod(self, "setPin(pin:str)", PikaStdDevice_ADC_setPinMethod); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_ADC.h b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_ADC.h deleted file mode 100644 index 36299b499..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_ADC.h +++ /dev/null @@ -1,19 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __PikaStdDevice_ADC__H -#define __PikaStdDevice_ADC__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_PikaStdDevice_ADC(Args *args); - -void PikaStdDevice_ADC_enable(PikaObj *self); -void PikaStdDevice_ADC_init(PikaObj *self); -void PikaStdDevice_ADC_platformEnable(PikaObj *self, char * pin); -float PikaStdDevice_ADC_platformRead(PikaObj *self, char * pin); -float PikaStdDevice_ADC_read(PikaObj *self); -void PikaStdDevice_ADC_setPin(PikaObj *self, char * pin); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_GPIO-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_GPIO-api.c deleted file mode 100644 index a9c9fbb17..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_GPIO-api.c +++ /dev/null @@ -1,88 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "PikaStdDevice_GPIO.h" -#include "TinyObj.h" -#include -#include -#include "BaseObj.h" - -void PikaStdDevice_GPIO_disableMethod(PikaObj *self, Args *args){ - PikaStdDevice_GPIO_disable(self); -} - -void PikaStdDevice_GPIO_enableMethod(PikaObj *self, Args *args){ - PikaStdDevice_GPIO_enable(self); -} - -void PikaStdDevice_GPIO_getModeMethod(PikaObj *self, Args *args){ - char * res = PikaStdDevice_GPIO_getMode(self); - method_returnStr(args, res); -} - -void PikaStdDevice_GPIO_getPinMethod(PikaObj *self, Args *args){ - char * res = PikaStdDevice_GPIO_getPin(self); - method_returnStr(args, res); -} - -void PikaStdDevice_GPIO_highMethod(PikaObj *self, Args *args){ - PikaStdDevice_GPIO_high(self); -} - -void PikaStdDevice_GPIO_initMethod(PikaObj *self, Args *args){ - PikaStdDevice_GPIO_init(self); -} - -void PikaStdDevice_GPIO_lowMethod(PikaObj *self, Args *args){ - PikaStdDevice_GPIO_low(self); -} - -void PikaStdDevice_GPIO_platformDisableMethod(PikaObj *self, Args *args){ - PikaStdDevice_GPIO_platformDisable(self); -} - -void PikaStdDevice_GPIO_platformEnableMethod(PikaObj *self, Args *args){ - PikaStdDevice_GPIO_platformEnable(self); -} - -void PikaStdDevice_GPIO_platformHighMethod(PikaObj *self, Args *args){ - PikaStdDevice_GPIO_platformHigh(self); -} - -void PikaStdDevice_GPIO_platformLowMethod(PikaObj *self, Args *args){ - PikaStdDevice_GPIO_platformLow(self); -} - -void PikaStdDevice_GPIO_platformSetModeMethod(PikaObj *self, Args *args){ - char * mode = args_getStr(args, "mode"); - PikaStdDevice_GPIO_platformSetMode(self, mode); -} - -void PikaStdDevice_GPIO_setModeMethod(PikaObj *self, Args *args){ - char * mode = args_getStr(args, "mode"); - PikaStdDevice_GPIO_setMode(self, mode); -} - -void PikaStdDevice_GPIO_setPinMethod(PikaObj *self, Args *args){ - char * pinName = args_getStr(args, "pinName"); - PikaStdDevice_GPIO_setPin(self, pinName); -} - -PikaObj *New_PikaStdDevice_GPIO(Args *args){ - PikaObj *self = New_TinyObj(args); - class_defineMethod(self, "disable()", PikaStdDevice_GPIO_disableMethod); - class_defineMethod(self, "enable()", PikaStdDevice_GPIO_enableMethod); - class_defineMethod(self, "getMode()->str", PikaStdDevice_GPIO_getModeMethod); - class_defineMethod(self, "getPin()->str", PikaStdDevice_GPIO_getPinMethod); - class_defineMethod(self, "high()", PikaStdDevice_GPIO_highMethod); - class_defineMethod(self, "init()", PikaStdDevice_GPIO_initMethod); - class_defineMethod(self, "low()", PikaStdDevice_GPIO_lowMethod); - class_defineMethod(self, "platformDisable()", PikaStdDevice_GPIO_platformDisableMethod); - class_defineMethod(self, "platformEnable()", PikaStdDevice_GPIO_platformEnableMethod); - class_defineMethod(self, "platformHigh()", PikaStdDevice_GPIO_platformHighMethod); - class_defineMethod(self, "platformLow()", PikaStdDevice_GPIO_platformLowMethod); - class_defineMethod(self, "platformSetMode(mode:str)", PikaStdDevice_GPIO_platformSetModeMethod); - class_defineMethod(self, "setMode(mode:str)", PikaStdDevice_GPIO_setModeMethod); - class_defineMethod(self, "setPin(pinName:str)", PikaStdDevice_GPIO_setPinMethod); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_GPIO.h b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_GPIO.h deleted file mode 100644 index 5917789d2..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_GPIO.h +++ /dev/null @@ -1,27 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __PikaStdDevice_GPIO__H -#define __PikaStdDevice_GPIO__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_PikaStdDevice_GPIO(Args *args); - -void PikaStdDevice_GPIO_disable(PikaObj *self); -void PikaStdDevice_GPIO_enable(PikaObj *self); -char * PikaStdDevice_GPIO_getMode(PikaObj *self); -char * PikaStdDevice_GPIO_getPin(PikaObj *self); -void PikaStdDevice_GPIO_high(PikaObj *self); -void PikaStdDevice_GPIO_init(PikaObj *self); -void PikaStdDevice_GPIO_low(PikaObj *self); -void PikaStdDevice_GPIO_platformDisable(PikaObj *self); -void PikaStdDevice_GPIO_platformEnable(PikaObj *self); -void PikaStdDevice_GPIO_platformHigh(PikaObj *self); -void PikaStdDevice_GPIO_platformLow(PikaObj *self); -void PikaStdDevice_GPIO_platformSetMode(PikaObj *self, char * mode); -void PikaStdDevice_GPIO_setMode(PikaObj *self, char * mode); -void PikaStdDevice_GPIO_setPin(PikaObj *self, char * pinName); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_PWM-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_PWM-api.c deleted file mode 100644 index 0ca58bdef..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_PWM-api.c +++ /dev/null @@ -1,75 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "PikaStdDevice_PWM.h" -#include "TinyObj.h" -#include -#include -#include "BaseObj.h" - -void PikaStdDevice_PWM_enableMethod(PikaObj *self, Args *args){ - PikaStdDevice_PWM_enable(self); -} - -void PikaStdDevice_PWM_getDutyMethod(PikaObj *self, Args *args){ - float res = PikaStdDevice_PWM_getDuty(self); - method_returnFloat(args, res); -} - -void PikaStdDevice_PWM_getFrequencyMethod(PikaObj *self, Args *args){ - int res = PikaStdDevice_PWM_getFrequency(self); - method_returnInt(args, res); -} - -void PikaStdDevice_PWM_initMethod(PikaObj *self, Args *args){ - PikaStdDevice_PWM_init(self); -} - -void PikaStdDevice_PWM_platformEnableMethod(PikaObj *self, Args *args){ - float duty = args_getFloat(args, "duty"); - int freq = args_getInt(args, "freq"); - char * pin = args_getStr(args, "pin"); - PikaStdDevice_PWM_platformEnable(self, duty, freq, pin); -} - -void PikaStdDevice_PWM_platformSetDutyMethod(PikaObj *self, Args *args){ - float duty = args_getFloat(args, "duty"); - char * pin = args_getStr(args, "pin"); - PikaStdDevice_PWM_platformSetDuty(self, duty, pin); -} - -void PikaStdDevice_PWM_platformSetFrequencyMethod(PikaObj *self, Args *args){ - int freq = args_getInt(args, "freq"); - char * pin = args_getStr(args, "pin"); - PikaStdDevice_PWM_platformSetFrequency(self, freq, pin); -} - -void PikaStdDevice_PWM_setDutyMethod(PikaObj *self, Args *args){ - float duty = args_getFloat(args, "duty"); - PikaStdDevice_PWM_setDuty(self, duty); -} - -void PikaStdDevice_PWM_setFrequencyMethod(PikaObj *self, Args *args){ - int freq = args_getInt(args, "freq"); - PikaStdDevice_PWM_setFrequency(self, freq); -} - -void PikaStdDevice_PWM_setPinMethod(PikaObj *self, Args *args){ - char * pin = args_getStr(args, "pin"); - PikaStdDevice_PWM_setPin(self, pin); -} - -PikaObj *New_PikaStdDevice_PWM(Args *args){ - PikaObj *self = New_TinyObj(args); - class_defineMethod(self, "enable()", PikaStdDevice_PWM_enableMethod); - class_defineMethod(self, "getDuty()->float", PikaStdDevice_PWM_getDutyMethod); - class_defineMethod(self, "getFrequency()->int", PikaStdDevice_PWM_getFrequencyMethod); - class_defineMethod(self, "init()", PikaStdDevice_PWM_initMethod); - class_defineMethod(self, "platformEnable(pin:str,freq:int,duty:float)", PikaStdDevice_PWM_platformEnableMethod); - class_defineMethod(self, "platformSetDuty(pin:str,duty:float)", PikaStdDevice_PWM_platformSetDutyMethod); - class_defineMethod(self, "platformSetFrequency(pin:str,freq:int)", PikaStdDevice_PWM_platformSetFrequencyMethod); - class_defineMethod(self, "setDuty(duty:float)", PikaStdDevice_PWM_setDutyMethod); - class_defineMethod(self, "setFrequency(freq:int)", PikaStdDevice_PWM_setFrequencyMethod); - class_defineMethod(self, "setPin(pin:str)", PikaStdDevice_PWM_setPinMethod); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_PWM.h b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_PWM.h deleted file mode 100644 index 597ff509b..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_PWM.h +++ /dev/null @@ -1,23 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __PikaStdDevice_PWM__H -#define __PikaStdDevice_PWM__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_PikaStdDevice_PWM(Args *args); - -void PikaStdDevice_PWM_enable(PikaObj *self); -float PikaStdDevice_PWM_getDuty(PikaObj *self); -int PikaStdDevice_PWM_getFrequency(PikaObj *self); -void PikaStdDevice_PWM_init(PikaObj *self); -void PikaStdDevice_PWM_platformEnable(PikaObj *self, float duty, int freq, char * pin); -void PikaStdDevice_PWM_platformSetDuty(PikaObj *self, float duty, char * pin); -void PikaStdDevice_PWM_platformSetFrequency(PikaObj *self, int freq, char * pin); -void PikaStdDevice_PWM_setDuty(PikaObj *self, float duty); -void PikaStdDevice_PWM_setFrequency(PikaObj *self, int freq); -void PikaStdDevice_PWM_setPin(PikaObj *self, char * pin); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_Time-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_Time-api.c deleted file mode 100644 index dfee97b48..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_Time-api.c +++ /dev/null @@ -1,25 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "PikaStdDevice_Time.h" -#include "TinyObj.h" -#include -#include -#include "BaseObj.h" - -void PikaStdDevice_Time_sleep_msMethod(PikaObj *self, Args *args){ - int ms = args_getInt(args, "ms"); - PikaStdDevice_Time_sleep_ms(self, ms); -} - -void PikaStdDevice_Time_sleep_sMethod(PikaObj *self, Args *args){ - int s = args_getInt(args, "s"); - PikaStdDevice_Time_sleep_s(self, s); -} - -PikaObj *New_PikaStdDevice_Time(Args *args){ - PikaObj *self = New_TinyObj(args); - class_defineMethod(self, "sleep_ms(ms:int)", PikaStdDevice_Time_sleep_msMethod); - class_defineMethod(self, "sleep_s(s:int)", PikaStdDevice_Time_sleep_sMethod); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_Time.h b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_Time.h deleted file mode 100644 index 8c3bbd648..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_Time.h +++ /dev/null @@ -1,15 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __PikaStdDevice_Time__H -#define __PikaStdDevice_Time__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_PikaStdDevice_Time(Args *args); - -void PikaStdDevice_Time_sleep_ms(PikaObj *self, int ms); -void PikaStdDevice_Time_sleep_s(PikaObj *self, int s); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_UART-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_UART-api.c deleted file mode 100644 index 02dd223fd..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_UART-api.c +++ /dev/null @@ -1,70 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "PikaStdDevice_UART.h" -#include "TinyObj.h" -#include -#include -#include "BaseObj.h" - -void PikaStdDevice_UART_enableMethod(PikaObj *self, Args *args){ - PikaStdDevice_UART_enable(self); -} - -void PikaStdDevice_UART_initMethod(PikaObj *self, Args *args){ - PikaStdDevice_UART_init(self); -} - -void PikaStdDevice_UART_platformEnableMethod(PikaObj *self, Args *args){ - int baudRate = args_getInt(args, "baudRate"); - int id = args_getInt(args, "id"); - PikaStdDevice_UART_platformEnable(self, baudRate, id); -} - -void PikaStdDevice_UART_platformReadMethod(PikaObj *self, Args *args){ - int id = args_getInt(args, "id"); - int length = args_getInt(args, "length"); - char * res = PikaStdDevice_UART_platformRead(self, id, length); - method_returnStr(args, res); -} - -void PikaStdDevice_UART_platformWriteMethod(PikaObj *self, Args *args){ - char * data = args_getStr(args, "data"); - int id = args_getInt(args, "id"); - PikaStdDevice_UART_platformWrite(self, data, id); -} - -void PikaStdDevice_UART_readMethod(PikaObj *self, Args *args){ - int length = args_getInt(args, "length"); - char * res = PikaStdDevice_UART_read(self, length); - method_returnStr(args, res); -} - -void PikaStdDevice_UART_setBaudRateMethod(PikaObj *self, Args *args){ - int baudRate = args_getInt(args, "baudRate"); - PikaStdDevice_UART_setBaudRate(self, baudRate); -} - -void PikaStdDevice_UART_setIdMethod(PikaObj *self, Args *args){ - int id = args_getInt(args, "id"); - PikaStdDevice_UART_setId(self, id); -} - -void PikaStdDevice_UART_writeMethod(PikaObj *self, Args *args){ - char * data = args_getStr(args, "data"); - PikaStdDevice_UART_write(self, data); -} - -PikaObj *New_PikaStdDevice_UART(Args *args){ - PikaObj *self = New_TinyObj(args); - class_defineMethod(self, "enable()", PikaStdDevice_UART_enableMethod); - class_defineMethod(self, "init()", PikaStdDevice_UART_initMethod); - class_defineMethod(self, "platformEnable(id:int,baudRate:int)", PikaStdDevice_UART_platformEnableMethod); - class_defineMethod(self, "platformRead(id:int,length:int)->str", PikaStdDevice_UART_platformReadMethod); - class_defineMethod(self, "platformWrite(id:int,data:str)", PikaStdDevice_UART_platformWriteMethod); - class_defineMethod(self, "read(length:int)->str", PikaStdDevice_UART_readMethod); - class_defineMethod(self, "setBaudRate(baudRate:int)", PikaStdDevice_UART_setBaudRateMethod); - class_defineMethod(self, "setId(id:int)", PikaStdDevice_UART_setIdMethod); - class_defineMethod(self, "write(data:str)", PikaStdDevice_UART_writeMethod); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_UART.h b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_UART.h deleted file mode 100644 index 6cd88fa5f..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdDevice_UART.h +++ /dev/null @@ -1,22 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __PikaStdDevice_UART__H -#define __PikaStdDevice_UART__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_PikaStdDevice_UART(Args *args); - -void PikaStdDevice_UART_enable(PikaObj *self); -void PikaStdDevice_UART_init(PikaObj *self); -void PikaStdDevice_UART_platformEnable(PikaObj *self, int baudRate, int id); -char * PikaStdDevice_UART_platformRead(PikaObj *self, int id, int length); -void PikaStdDevice_UART_platformWrite(PikaObj *self, char * data, int id); -char * PikaStdDevice_UART_read(PikaObj *self, int length); -void PikaStdDevice_UART_setBaudRate(PikaObj *self, int baudRate); -void PikaStdDevice_UART_setId(PikaObj *self, int id); -void PikaStdDevice_UART_write(PikaObj *self, char * data); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_MemChecker-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_MemChecker-api.c deleted file mode 100644 index 3bf130d4c..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_MemChecker-api.c +++ /dev/null @@ -1,28 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "PikaStdLib_MemChecker.h" -#include "BaseObj.h" -#include -#include -#include "BaseObj.h" - -void PikaStdLib_MemChecker_maxMethod(PikaObj *self, Args *args){ - PikaStdLib_MemChecker_max(self); -} - -void PikaStdLib_MemChecker_nowMethod(PikaObj *self, Args *args){ - PikaStdLib_MemChecker_now(self); -} - -void PikaStdLib_MemChecker_resetMaxMethod(PikaObj *self, Args *args){ - PikaStdLib_MemChecker_resetMax(self); -} - -PikaObj *New_PikaStdLib_MemChecker(Args *args){ - PikaObj *self = New_BaseObj(args); - class_defineMethod(self, "max()", PikaStdLib_MemChecker_maxMethod); - class_defineMethod(self, "now()", PikaStdLib_MemChecker_nowMethod); - class_defineMethod(self, "resetMax()", PikaStdLib_MemChecker_resetMaxMethod); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_MemChecker.h b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_MemChecker.h deleted file mode 100644 index 55290f8ed..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_MemChecker.h +++ /dev/null @@ -1,16 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __PikaStdLib_MemChecker__H -#define __PikaStdLib_MemChecker__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_PikaStdLib_MemChecker(Args *args); - -void PikaStdLib_MemChecker_max(PikaObj *self); -void PikaStdLib_MemChecker_now(PikaObj *self); -void PikaStdLib_MemChecker_resetMax(PikaObj *self); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_SysObj-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_SysObj-api.c deleted file mode 100644 index 8b237384a..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_SysObj-api.c +++ /dev/null @@ -1,38 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "PikaStdLib_SysObj.h" -#include "BaseObj.h" -#include -#include -#include "BaseObj.h" - -void PikaStdLib_SysObj_lsMethod(PikaObj *self, Args *args){ - char * objPath = args_getStr(args, "objPath"); - PikaStdLib_SysObj_ls(self, objPath); -} - -void PikaStdLib_SysObj_newMethod(PikaObj *self, Args *args){ - char * classPath = args_getStr(args, "classPath"); - char * objPath = args_getStr(args, "objPath"); - PikaStdLib_SysObj_new(self, classPath, objPath); -} - -void PikaStdLib_SysObj_removeMethod(PikaObj *self, Args *args){ - char * argPath = args_getStr(args, "argPath"); - PikaStdLib_SysObj_remove(self, argPath); -} - -void PikaStdLib_SysObj_typeMethod(PikaObj *self, Args *args){ - char * argPath = args_getStr(args, "argPath"); - PikaStdLib_SysObj_type(self, argPath); -} - -PikaObj *New_PikaStdLib_SysObj(Args *args){ - PikaObj *self = New_BaseObj(args); - class_defineMethod(self, "ls(objPath:str)", PikaStdLib_SysObj_lsMethod); - class_defineMethod(self, "new(objPath:str,classPath:str)", PikaStdLib_SysObj_newMethod); - class_defineMethod(self, "remove(argPath:str)", PikaStdLib_SysObj_removeMethod); - class_defineMethod(self, "type(argPath:str)", PikaStdLib_SysObj_typeMethod); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_SysObj.h b/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_SysObj.h deleted file mode 100644 index 94c21b904..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/PikaStdLib_SysObj.h +++ /dev/null @@ -1,17 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __PikaStdLib_SysObj__H -#define __PikaStdLib_SysObj__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_PikaStdLib_SysObj(Args *args); - -void PikaStdLib_SysObj_ls(PikaObj *self, char * objPath); -void PikaStdLib_SysObj_new(PikaObj *self, char * classPath, char * objPath); -void PikaStdLib_SysObj_remove(PikaObj *self, char * argPath); -void PikaStdLib_SysObj_type(PikaObj *self, char * argPath); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_ADC-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/STM32_ADC-api.c deleted file mode 100644 index f0e67ba34..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_ADC-api.c +++ /dev/null @@ -1,26 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "STM32_ADC.h" -#include "PikaStdDevice_ADC.h" -#include -#include -#include "BaseObj.h" - -void STM32_ADC_platformEnableMethod(PikaObj *self, Args *args){ - char * pin = args_getStr(args, "pin"); - STM32_ADC_platformEnable(self, pin); -} - -void STM32_ADC_platformReadMethod(PikaObj *self, Args *args){ - char * pin = args_getStr(args, "pin"); - float res = STM32_ADC_platformRead(self, pin); - method_returnFloat(args, res); -} - -PikaObj *New_STM32_ADC(Args *args){ - PikaObj *self = New_PikaStdDevice_ADC(args); - class_defineMethod(self, "platformEnable(pin:str)", STM32_ADC_platformEnableMethod); - class_defineMethod(self, "platformRead(pin:str)->float", STM32_ADC_platformReadMethod); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_ADC.h b/bsp/stm32g030c8/pikascript/pikascript-api/STM32_ADC.h deleted file mode 100644 index d2c519a6f..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_ADC.h +++ /dev/null @@ -1,15 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __STM32_ADC__H -#define __STM32_ADC__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_STM32_ADC(Args *args); - -void STM32_ADC_platformEnable(PikaObj *self, char * pin); -float STM32_ADC_platformRead(PikaObj *self, char * pin); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_GPIO-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/STM32_GPIO-api.c deleted file mode 100644 index 82a162abd..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_GPIO-api.c +++ /dev/null @@ -1,39 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "STM32_GPIO.h" -#include "PikaStdDevice_GPIO.h" -#include -#include -#include "BaseObj.h" - -void STM32_GPIO_platformDisableMethod(PikaObj *self, Args *args){ - STM32_GPIO_platformDisable(self); -} - -void STM32_GPIO_platformEnableMethod(PikaObj *self, Args *args){ - STM32_GPIO_platformEnable(self); -} - -void STM32_GPIO_platformHighMethod(PikaObj *self, Args *args){ - STM32_GPIO_platformHigh(self); -} - -void STM32_GPIO_platformLowMethod(PikaObj *self, Args *args){ - STM32_GPIO_platformLow(self); -} - -void STM32_GPIO_platformSetModeMethod(PikaObj *self, Args *args){ - char * mode = args_getStr(args, "mode"); - STM32_GPIO_platformSetMode(self, mode); -} - -PikaObj *New_STM32_GPIO(Args *args){ - PikaObj *self = New_PikaStdDevice_GPIO(args); - class_defineMethod(self, "platformDisable()", STM32_GPIO_platformDisableMethod); - class_defineMethod(self, "platformEnable()", STM32_GPIO_platformEnableMethod); - class_defineMethod(self, "platformHigh()", STM32_GPIO_platformHighMethod); - class_defineMethod(self, "platformLow()", STM32_GPIO_platformLowMethod); - class_defineMethod(self, "platformSetMode(mode:str)", STM32_GPIO_platformSetModeMethod); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_GPIO.h b/bsp/stm32g030c8/pikascript/pikascript-api/STM32_GPIO.h deleted file mode 100644 index 1db1d981f..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_GPIO.h +++ /dev/null @@ -1,18 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __STM32_GPIO__H -#define __STM32_GPIO__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_STM32_GPIO(Args *args); - -void STM32_GPIO_platformDisable(PikaObj *self); -void STM32_GPIO_platformEnable(PikaObj *self); -void STM32_GPIO_platformHigh(PikaObj *self); -void STM32_GPIO_platformLow(PikaObj *self); -void STM32_GPIO_platformSetMode(PikaObj *self, char * mode); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_PWM-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/STM32_PWM-api.c deleted file mode 100644 index d8bf5a3f0..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_PWM-api.c +++ /dev/null @@ -1,35 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "STM32_PWM.h" -#include "PikaStdDevice_PWM.h" -#include -#include -#include "BaseObj.h" - -void STM32_PWM_platformEnableMethod(PikaObj *self, Args *args){ - float duty = args_getFloat(args, "duty"); - int freq = args_getInt(args, "freq"); - char * pin = args_getStr(args, "pin"); - STM32_PWM_platformEnable(self, duty, freq, pin); -} - -void STM32_PWM_platformSetDutyMethod(PikaObj *self, Args *args){ - float duty = args_getFloat(args, "duty"); - char * pin = args_getStr(args, "pin"); - STM32_PWM_platformSetDuty(self, duty, pin); -} - -void STM32_PWM_platformSetFrequencyMethod(PikaObj *self, Args *args){ - int freq = args_getInt(args, "freq"); - char * pin = args_getStr(args, "pin"); - STM32_PWM_platformSetFrequency(self, freq, pin); -} - -PikaObj *New_STM32_PWM(Args *args){ - PikaObj *self = New_PikaStdDevice_PWM(args); - class_defineMethod(self, "platformEnable(pin:str,freq:int,duty:float)", STM32_PWM_platformEnableMethod); - class_defineMethod(self, "platformSetDuty(pin:str,duty:float)", STM32_PWM_platformSetDutyMethod); - class_defineMethod(self, "platformSetFrequency(pin:str,freq:int)", STM32_PWM_platformSetFrequencyMethod); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_PWM.h b/bsp/stm32g030c8/pikascript/pikascript-api/STM32_PWM.h deleted file mode 100644 index 662cbf7ea..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_PWM.h +++ /dev/null @@ -1,16 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __STM32_PWM__H -#define __STM32_PWM__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_STM32_PWM(Args *args); - -void STM32_PWM_platformEnable(PikaObj *self, float duty, int freq, char * pin); -void STM32_PWM_platformSetDuty(PikaObj *self, float duty, char * pin); -void STM32_PWM_platformSetFrequency(PikaObj *self, int freq, char * pin); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_Time-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/STM32_Time-api.c deleted file mode 100644 index daa2fcf6a..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_Time-api.c +++ /dev/null @@ -1,25 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "STM32_Time.h" -#include "PikaStdDevice_Time.h" -#include -#include -#include "BaseObj.h" - -void STM32_Time_sleep_msMethod(PikaObj *self, Args *args){ - int ms = args_getInt(args, "ms"); - STM32_Time_sleep_ms(self, ms); -} - -void STM32_Time_sleep_sMethod(PikaObj *self, Args *args){ - int s = args_getInt(args, "s"); - STM32_Time_sleep_s(self, s); -} - -PikaObj *New_STM32_Time(Args *args){ - PikaObj *self = New_PikaStdDevice_Time(args); - class_defineMethod(self, "sleep_ms(ms:int)", STM32_Time_sleep_msMethod); - class_defineMethod(self, "sleep_s(s:int)", STM32_Time_sleep_sMethod); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_Time.h b/bsp/stm32g030c8/pikascript/pikascript-api/STM32_Time.h deleted file mode 100644 index 2003580f8..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_Time.h +++ /dev/null @@ -1,15 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __STM32_Time__H -#define __STM32_Time__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_STM32_Time(Args *args); - -void STM32_Time_sleep_ms(PikaObj *self, int ms); -void STM32_Time_sleep_s(PikaObj *self, int s); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_UART-api.c b/bsp/stm32g030c8/pikascript/pikascript-api/STM32_UART-api.c deleted file mode 100644 index 148abf071..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_UART-api.c +++ /dev/null @@ -1,35 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "STM32_UART.h" -#include "PikaStdDevice_UART.h" -#include -#include -#include "BaseObj.h" - -void STM32_UART_platformEnableMethod(PikaObj *self, Args *args){ - int baudRate = args_getInt(args, "baudRate"); - int id = args_getInt(args, "id"); - STM32_UART_platformEnable(self, baudRate, id); -} - -void STM32_UART_platformReadMethod(PikaObj *self, Args *args){ - int id = args_getInt(args, "id"); - int length = args_getInt(args, "length"); - char * res = STM32_UART_platformRead(self, id, length); - method_returnStr(args, res); -} - -void STM32_UART_platformWriteMethod(PikaObj *self, Args *args){ - char * data = args_getStr(args, "data"); - int id = args_getInt(args, "id"); - STM32_UART_platformWrite(self, data, id); -} - -PikaObj *New_STM32_UART(Args *args){ - PikaObj *self = New_PikaStdDevice_UART(args); - class_defineMethod(self, "platformEnable(id:int,baudRate:int)", STM32_UART_platformEnableMethod); - class_defineMethod(self, "platformRead(id:int,length:int)->str", STM32_UART_platformReadMethod); - class_defineMethod(self, "platformWrite(id:int,data:str)", STM32_UART_platformWriteMethod); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_UART.h b/bsp/stm32g030c8/pikascript/pikascript-api/STM32_UART.h deleted file mode 100644 index 55fe5e983..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/STM32_UART.h +++ /dev/null @@ -1,16 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __STM32_UART__H -#define __STM32_UART__H -#include -#include -#include "PikaObj.h" - -PikaObj *New_STM32_UART(Args *args); - -void STM32_UART_platformEnable(PikaObj *self, int baudRate, int id); -char * STM32_UART_platformRead(PikaObj *self, int id, int length); -void STM32_UART_platformWrite(PikaObj *self, char * data, int id); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/compiler-info.txt b/bsp/stm32g030c8/pikascript/pikascript-api/compiler-info.txt deleted file mode 100644 index ec4df5d52..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/compiler-info.txt +++ /dev/null @@ -1 +0,0 @@ -Compiler { dist_path: "pikascript-api/", source_path: "", class_list: {"PikaMain": ClassInfo { this_class_name: "PikaMain", super_class_name: "PikaStdLib_SysObj", method_list: {}, object_list: {"adc": ObjectInfo { class_name: "PikaMain", name: "adc", import_class_name: "STM32_ADC" }, "mem": ObjectInfo { class_name: "PikaMain", name: "mem", import_class_name: "PikaStdLib_MemChecker" }, "pin": ObjectInfo { class_name: "PikaMain", name: "pin", import_class_name: "STM32_GPIO" }, "pwm": ObjectInfo { class_name: "PikaMain", name: "pwm", import_class_name: "STM32_PWM" }, "rgb": ObjectInfo { class_name: "PikaMain", name: "rgb", import_class_name: "PikaPiZero_RGB" }, "time": ObjectInfo { class_name: "PikaMain", name: "time", import_class_name: "STM32_Time" }, "uart": ObjectInfo { class_name: "PikaMain", name: "uart", import_class_name: "STM32_UART" }}, import_list: {}, script_list: Script { content: " obj_run(pikaMain, \"time = STM32.Time()\");\r\n obj_run(pikaMain, \"uart = STM32.UART()\");\r\n obj_run(pikaMain, \"adc = STM32.ADC()\");\r\n obj_run(pikaMain, \"pin = STM32.GPIO()\");\r\n obj_run(pikaMain, \"pwm = STM32.PWM()\");\r\n obj_run(pikaMain, \"uart = STM32.UART()\");\r\n obj_run(pikaMain, \"rgb = PikaPiZero.RGB()\");\r\n obj_run(pikaMain, \"mem = PikaStdLib.MemChecker()\");\r\n obj_run(pikaMain, \"uart.init()\");\r\n obj_run(pikaMain, \"uart.setId(1)\");\r\n obj_run(pikaMain, \"uart.setBaudRate(115200)\");\r\n obj_run(pikaMain, \"uart.enable()\");\r\n obj_run(pikaMain, \"rgb.init()\");\r\n obj_run(pikaMain, \"rgb.enable()\");\r\n obj_run(pikaMain, \"print('hello 2')\");\r\n obj_run(pikaMain, \"print('mem used max:')\");\r\n obj_run(pikaMain, \"mem.max()\");\r\n obj_run(pikaMain, \"while True:\");\r\n obj_run(pikaMain, \" time.sleep_ms(10)\");\r\n obj_run(pikaMain, \" rgb.flow()\");\r\n obj_run(pikaMain, \" print('flowing...')\");\r\n" } }, "PikaPiZero_RGB": ClassInfo { this_class_name: "PikaPiZero_RGB", super_class_name: "PikaStdLib_SysObj", method_list: {"blue": MethodInfo { class_name: "PikaPiZero_RGB", name: "blue", arg_list: None, return_type: None }, "enable": MethodInfo { class_name: "PikaPiZero_RGB", name: "enable", arg_list: None, return_type: None }, "flow": MethodInfo { class_name: "PikaPiZero_RGB", name: "flow", arg_list: None, return_type: None }, "green": MethodInfo { class_name: "PikaPiZero_RGB", name: "green", arg_list: None, return_type: None }, "init": MethodInfo { class_name: "PikaPiZero_RGB", name: "init", arg_list: None, return_type: None }, "red": MethodInfo { class_name: "PikaPiZero_RGB", name: "red", arg_list: None, return_type: None }, "white": MethodInfo { class_name: "PikaPiZero_RGB", name: "white", arg_list: None, return_type: None }}, object_list: {"pin": ObjectInfo { class_name: "PikaPiZero_RGB", name: "pin", import_class_name: "STM32_GPIO" }}, import_list: {}, script_list: Script { content: "" } }, "PikaStdDevice_ADC": ClassInfo { this_class_name: "PikaStdDevice_ADC", super_class_name: "TinyObj", method_list: {"enable": MethodInfo { class_name: "PikaStdDevice_ADC", name: "enable", arg_list: None, return_type: None }, "init": MethodInfo { class_name: "PikaStdDevice_ADC", name: "init", arg_list: None, return_type: None }, "platformEnable": MethodInfo { class_name: "PikaStdDevice_ADC", name: "platformEnable", arg_list: Some(ArgList { py_arg_list: "pin:str", list: {"pin": PyArg { py_type: PyType { type_name: "str" }, name: "pin" }} }), return_type: None }, "platformRead": MethodInfo { class_name: "PikaStdDevice_ADC", name: "platformRead", arg_list: Some(ArgList { py_arg_list: "pin:str", list: {"pin": PyArg { py_type: PyType { type_name: "str" }, name: "pin" }} }), return_type: Some(PyType { type_name: "float" }) }, "read": MethodInfo { class_name: "PikaStdDevice_ADC", name: "read", arg_list: None, return_type: Some(PyType { type_name: "float" }) }, "setPin": MethodInfo { class_name: "PikaStdDevice_ADC", name: "setPin", arg_list: Some(ArgList { py_arg_list: "pin:str", list: {"pin": PyArg { py_type: PyType { type_name: "str" }, name: "pin" }} }), return_type: None }}, object_list: {}, import_list: {}, script_list: Script { content: "" } }, "PikaStdDevice_GPIO": ClassInfo { this_class_name: "PikaStdDevice_GPIO", super_class_name: "TinyObj", method_list: {"disable": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "disable", arg_list: None, return_type: None }, "enable": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "enable", arg_list: None, return_type: None }, "getMode": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "getMode", arg_list: None, return_type: Some(PyType { type_name: "str" }) }, "getPin": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "getPin", arg_list: None, return_type: Some(PyType { type_name: "str" }) }, "high": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "high", arg_list: None, return_type: None }, "init": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "init", arg_list: None, return_type: None }, "low": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "low", arg_list: None, return_type: None }, "platformDisable": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "platformDisable", arg_list: None, return_type: None }, "platformEnable": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "platformEnable", arg_list: None, return_type: None }, "platformHigh": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "platformHigh", arg_list: None, return_type: None }, "platformLow": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "platformLow", arg_list: None, return_type: None }, "platformSetMode": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "platformSetMode", arg_list: Some(ArgList { py_arg_list: "mode:str", list: {"mode": PyArg { py_type: PyType { type_name: "str" }, name: "mode" }} }), return_type: None }, "setMode": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "setMode", arg_list: Some(ArgList { py_arg_list: "mode:str", list: {"mode": PyArg { py_type: PyType { type_name: "str" }, name: "mode" }} }), return_type: None }, "setPin": MethodInfo { class_name: "PikaStdDevice_GPIO", name: "setPin", arg_list: Some(ArgList { py_arg_list: "pinName:str", list: {"pinName": PyArg { py_type: PyType { type_name: "str" }, name: "pinName" }} }), return_type: None }}, object_list: {}, import_list: {}, script_list: Script { content: "" } }, "PikaStdDevice_PWM": ClassInfo { this_class_name: "PikaStdDevice_PWM", super_class_name: "TinyObj", method_list: {"enable": MethodInfo { class_name: "PikaStdDevice_PWM", name: "enable", arg_list: None, return_type: None }, "getDuty": MethodInfo { class_name: "PikaStdDevice_PWM", name: "getDuty", arg_list: None, return_type: Some(PyType { type_name: "float" }) }, "getFrequency": MethodInfo { class_name: "PikaStdDevice_PWM", name: "getFrequency", arg_list: None, return_type: Some(PyType { type_name: "int" }) }, "init": MethodInfo { class_name: "PikaStdDevice_PWM", name: "init", arg_list: None, return_type: None }, "platformEnable": MethodInfo { class_name: "PikaStdDevice_PWM", name: "platformEnable", arg_list: Some(ArgList { py_arg_list: "pin:str,freq:int,duty:float", list: {"duty": PyArg { py_type: PyType { type_name: "float" }, name: "duty" }, "freq": PyArg { py_type: PyType { type_name: "int" }, name: "freq" }, "pin": PyArg { py_type: PyType { type_name: "str" }, name: "pin" }} }), return_type: None }, "platformSetDuty": MethodInfo { class_name: "PikaStdDevice_PWM", name: "platformSetDuty", arg_list: Some(ArgList { py_arg_list: "pin:str,duty:float", list: {"duty": PyArg { py_type: PyType { type_name: "float" }, name: "duty" }, "pin": PyArg { py_type: PyType { type_name: "str" }, name: "pin" }} }), return_type: None }, "platformSetFrequency": MethodInfo { class_name: "PikaStdDevice_PWM", name: "platformSetFrequency", arg_list: Some(ArgList { py_arg_list: "pin:str,freq:int", list: {"freq": PyArg { py_type: PyType { type_name: "int" }, name: "freq" }, "pin": PyArg { py_type: PyType { type_name: "str" }, name: "pin" }} }), return_type: None }, "setDuty": MethodInfo { class_name: "PikaStdDevice_PWM", name: "setDuty", arg_list: Some(ArgList { py_arg_list: "duty:float", list: {"duty": PyArg { py_type: PyType { type_name: "float" }, name: "duty" }} }), return_type: None }, "setFrequency": MethodInfo { class_name: "PikaStdDevice_PWM", name: "setFrequency", arg_list: Some(ArgList { py_arg_list: "freq:int", list: {"freq": PyArg { py_type: PyType { type_name: "int" }, name: "freq" }} }), return_type: None }, "setPin": MethodInfo { class_name: "PikaStdDevice_PWM", name: "setPin", arg_list: Some(ArgList { py_arg_list: "pin:str", list: {"pin": PyArg { py_type: PyType { type_name: "str" }, name: "pin" }} }), return_type: None }}, object_list: {}, import_list: {}, script_list: Script { content: "" } }, "PikaStdDevice_Time": ClassInfo { this_class_name: "PikaStdDevice_Time", super_class_name: "TinyObj", method_list: {"sleep_ms": MethodInfo { class_name: "PikaStdDevice_Time", name: "sleep_ms", arg_list: Some(ArgList { py_arg_list: "ms:int", list: {"ms": PyArg { py_type: PyType { type_name: "int" }, name: "ms" }} }), return_type: None }, "sleep_s": MethodInfo { class_name: "PikaStdDevice_Time", name: "sleep_s", arg_list: Some(ArgList { py_arg_list: "s:int", list: {"s": PyArg { py_type: PyType { type_name: "int" }, name: "s" }} }), return_type: None }}, object_list: {}, import_list: {}, script_list: Script { content: "" } }, "PikaStdDevice_UART": ClassInfo { this_class_name: "PikaStdDevice_UART", super_class_name: "TinyObj", method_list: {"enable": MethodInfo { class_name: "PikaStdDevice_UART", name: "enable", arg_list: None, return_type: None }, "init": MethodInfo { class_name: "PikaStdDevice_UART", name: "init", arg_list: None, return_type: None }, "platformEnable": MethodInfo { class_name: "PikaStdDevice_UART", name: "platformEnable", arg_list: Some(ArgList { py_arg_list: "id:int,baudRate:int", list: {"baudRate": PyArg { py_type: PyType { type_name: "int" }, name: "baudRate" }, "id": PyArg { py_type: PyType { type_name: "int" }, name: "id" }} }), return_type: None }, "platformRead": MethodInfo { class_name: "PikaStdDevice_UART", name: "platformRead", arg_list: Some(ArgList { py_arg_list: "id:int,length:int", list: {"id": PyArg { py_type: PyType { type_name: "int" }, name: "id" }, "length": PyArg { py_type: PyType { type_name: "int" }, name: "length" }} }), return_type: Some(PyType { type_name: "str" }) }, "platformWrite": MethodInfo { class_name: "PikaStdDevice_UART", name: "platformWrite", arg_list: Some(ArgList { py_arg_list: "id:int,data:str", list: {"data": PyArg { py_type: PyType { type_name: "str" }, name: "data" }, "id": PyArg { py_type: PyType { type_name: "int" }, name: "id" }} }), return_type: None }, "read": MethodInfo { class_name: "PikaStdDevice_UART", name: "read", arg_list: Some(ArgList { py_arg_list: "length:int", list: {"length": PyArg { py_type: PyType { type_name: "int" }, name: "length" }} }), return_type: Some(PyType { type_name: "str" }) }, "setBaudRate": MethodInfo { class_name: "PikaStdDevice_UART", name: "setBaudRate", arg_list: Some(ArgList { py_arg_list: "baudRate:int", list: {"baudRate": PyArg { py_type: PyType { type_name: "int" }, name: "baudRate" }} }), return_type: None }, "setId": MethodInfo { class_name: "PikaStdDevice_UART", name: "setId", arg_list: Some(ArgList { py_arg_list: "id:int", list: {"id": PyArg { py_type: PyType { type_name: "int" }, name: "id" }} }), return_type: None }, "write": MethodInfo { class_name: "PikaStdDevice_UART", name: "write", arg_list: Some(ArgList { py_arg_list: "data:str", list: {"data": PyArg { py_type: PyType { type_name: "str" }, name: "data" }} }), return_type: None }}, object_list: {}, import_list: {}, script_list: Script { content: "" } }, "PikaStdLib_MemChecker": ClassInfo { this_class_name: "PikaStdLib_MemChecker", super_class_name: "BaseObj", method_list: {"max": MethodInfo { class_name: "PikaStdLib_MemChecker", name: "max", arg_list: None, return_type: None }, "now": MethodInfo { class_name: "PikaStdLib_MemChecker", name: "now", arg_list: None, return_type: None }, "resetMax": MethodInfo { class_name: "PikaStdLib_MemChecker", name: "resetMax", arg_list: None, return_type: None }}, object_list: {}, import_list: {}, script_list: Script { content: "" } }, "PikaStdLib_SysObj": ClassInfo { this_class_name: "PikaStdLib_SysObj", super_class_name: "BaseObj", method_list: {"ls": MethodInfo { class_name: "PikaStdLib_SysObj", name: "ls", arg_list: Some(ArgList { py_arg_list: "objPath:str", list: {"objPath": PyArg { py_type: PyType { type_name: "str" }, name: "objPath" }} }), return_type: None }, "new": MethodInfo { class_name: "PikaStdLib_SysObj", name: "new", arg_list: Some(ArgList { py_arg_list: "objPath:str,classPath:str", list: {"classPath": PyArg { py_type: PyType { type_name: "str" }, name: "classPath" }, "objPath": PyArg { py_type: PyType { type_name: "str" }, name: "objPath" }} }), return_type: None }, "remove": MethodInfo { class_name: "PikaStdLib_SysObj", name: "remove", arg_list: Some(ArgList { py_arg_list: "argPath:str", list: {"argPath": PyArg { py_type: PyType { type_name: "str" }, name: "argPath" }} }), return_type: None }, "type": MethodInfo { class_name: "PikaStdLib_SysObj", name: "type", arg_list: Some(ArgList { py_arg_list: "argPath:str", list: {"argPath": PyArg { py_type: PyType { type_name: "str" }, name: "argPath" }} }), return_type: None }}, object_list: {}, import_list: {}, script_list: Script { content: "" } }, "STM32_ADC": ClassInfo { this_class_name: "STM32_ADC", super_class_name: "PikaStdDevice_ADC", method_list: {"platformEnable": MethodInfo { class_name: "STM32_ADC", name: "platformEnable", arg_list: Some(ArgList { py_arg_list: "pin:str", list: {"pin": PyArg { py_type: PyType { type_name: "str" }, name: "pin" }} }), return_type: None }, "platformRead": MethodInfo { class_name: "STM32_ADC", name: "platformRead", arg_list: Some(ArgList { py_arg_list: "pin:str", list: {"pin": PyArg { py_type: PyType { type_name: "str" }, name: "pin" }} }), return_type: Some(PyType { type_name: "float" }) }}, object_list: {}, import_list: {}, script_list: Script { content: "" } }, "STM32_GPIO": ClassInfo { this_class_name: "STM32_GPIO", super_class_name: "PikaStdDevice_GPIO", method_list: {"platformDisable": MethodInfo { class_name: "STM32_GPIO", name: "platformDisable", arg_list: None, return_type: None }, "platformEnable": MethodInfo { class_name: "STM32_GPIO", name: "platformEnable", arg_list: None, return_type: None }, "platformHigh": MethodInfo { class_name: "STM32_GPIO", name: "platformHigh", arg_list: None, return_type: None }, "platformLow": MethodInfo { class_name: "STM32_GPIO", name: "platformLow", arg_list: None, return_type: None }, "platformSetMode": MethodInfo { class_name: "STM32_GPIO", name: "platformSetMode", arg_list: Some(ArgList { py_arg_list: "mode:str", list: {"mode": PyArg { py_type: PyType { type_name: "str" }, name: "mode" }} }), return_type: None }}, object_list: {}, import_list: {}, script_list: Script { content: "" } }, "STM32_PWM": ClassInfo { this_class_name: "STM32_PWM", super_class_name: "PikaStdDevice_PWM", method_list: {"platformEnable": MethodInfo { class_name: "STM32_PWM", name: "platformEnable", arg_list: Some(ArgList { py_arg_list: "pin:str,freq:int,duty:float", list: {"duty": PyArg { py_type: PyType { type_name: "float" }, name: "duty" }, "freq": PyArg { py_type: PyType { type_name: "int" }, name: "freq" }, "pin": PyArg { py_type: PyType { type_name: "str" }, name: "pin" }} }), return_type: None }, "platformSetDuty": MethodInfo { class_name: "STM32_PWM", name: "platformSetDuty", arg_list: Some(ArgList { py_arg_list: "pin:str,duty:float", list: {"duty": PyArg { py_type: PyType { type_name: "float" }, name: "duty" }, "pin": PyArg { py_type: PyType { type_name: "str" }, name: "pin" }} }), return_type: None }, "platformSetFrequency": MethodInfo { class_name: "STM32_PWM", name: "platformSetFrequency", arg_list: Some(ArgList { py_arg_list: "pin:str,freq:int", list: {"freq": PyArg { py_type: PyType { type_name: "int" }, name: "freq" }, "pin": PyArg { py_type: PyType { type_name: "str" }, name: "pin" }} }), return_type: None }}, object_list: {}, import_list: {}, script_list: Script { content: "" } }, "STM32_Time": ClassInfo { this_class_name: "STM32_Time", super_class_name: "PikaStdDevice_Time", method_list: {"sleep_ms": MethodInfo { class_name: "STM32_Time", name: "sleep_ms", arg_list: Some(ArgList { py_arg_list: "ms:int", list: {"ms": PyArg { py_type: PyType { type_name: "int" }, name: "ms" }} }), return_type: None }, "sleep_s": MethodInfo { class_name: "STM32_Time", name: "sleep_s", arg_list: Some(ArgList { py_arg_list: "s:int", list: {"s": PyArg { py_type: PyType { type_name: "int" }, name: "s" }} }), return_type: None }}, object_list: {}, import_list: {}, script_list: Script { content: "" } }, "STM32_UART": ClassInfo { this_class_name: "STM32_UART", super_class_name: "PikaStdDevice_UART", method_list: {"platformEnable": MethodInfo { class_name: "STM32_UART", name: "platformEnable", arg_list: Some(ArgList { py_arg_list: "id:int,baudRate:int", list: {"baudRate": PyArg { py_type: PyType { type_name: "int" }, name: "baudRate" }, "id": PyArg { py_type: PyType { type_name: "int" }, name: "id" }} }), return_type: None }, "platformRead": MethodInfo { class_name: "STM32_UART", name: "platformRead", arg_list: Some(ArgList { py_arg_list: "id:int,length:int", list: {"id": PyArg { py_type: PyType { type_name: "int" }, name: "id" }, "length": PyArg { py_type: PyType { type_name: "int" }, name: "length" }} }), return_type: Some(PyType { type_name: "str" }) }, "platformWrite": MethodInfo { class_name: "STM32_UART", name: "platformWrite", arg_list: Some(ArgList { py_arg_list: "id:int,data:str", list: {"data": PyArg { py_type: PyType { type_name: "str" }, name: "data" }, "id": PyArg { py_type: PyType { type_name: "int" }, name: "id" }} }), return_type: None }}, object_list: {}, import_list: {}, script_list: Script { content: "" } }}, class_now_name: Some("PikaMain") } \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/pikaScript.c b/bsp/stm32g030c8/pikascript/pikascript-api/pikaScript.c deleted file mode 100644 index 99dd3abb9..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/pikaScript.c +++ /dev/null @@ -1,34 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#include "PikaMain.h" -#include -#include - -PikaObj * pikaScriptInit(){ - PikaObj * pikaMain = newRootObj("pikaMain", New_PikaMain); - obj_run(pikaMain, "time = STM32.Time()"); - obj_run(pikaMain, "uart = STM32.UART()"); - obj_run(pikaMain, "adc = STM32.ADC()"); - obj_run(pikaMain, "pin = STM32.GPIO()"); - obj_run(pikaMain, "pwm = STM32.PWM()"); - obj_run(pikaMain, "uart = STM32.UART()"); - obj_run(pikaMain, "rgb = PikaPiZero.RGB()"); - obj_run(pikaMain, "mem = PikaStdLib.MemChecker()"); - obj_run(pikaMain, "uart.init()"); - obj_run(pikaMain, "uart.setId(1)"); - obj_run(pikaMain, "uart.setBaudRate(115200)"); - obj_run(pikaMain, "uart.enable()"); - obj_run(pikaMain, "rgb.init()"); - obj_run(pikaMain, "rgb.enable()"); - obj_run(pikaMain, "print('hello 2')"); - obj_run(pikaMain, "print('mem used max:')"); - obj_run(pikaMain, "mem.max()"); - obj_run(pikaMain, "while True:"); - obj_run(pikaMain, " time.sleep_ms(10)"); - obj_run(pikaMain, " rgb.flow()"); - obj_run(pikaMain, " print('flowing...')"); - obj_run(pikaMain, ""); - return pikaMain; -} - diff --git a/bsp/stm32g030c8/pikascript/pikascript-api/pikaScript.h b/bsp/stm32g030c8/pikascript/pikascript-api/pikaScript.h deleted file mode 100644 index dfaad5e8c..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-api/pikaScript.h +++ /dev/null @@ -1,13 +0,0 @@ -/* ******************************** */ -/* Warning! Don't modify this file! */ -/* ******************************** */ -#ifndef __pikaScript__H -#define __pikaScript__H -#include -#include -#include "PikaObj.h" -#include "PikaMain.h" - -PikaObj * pikaScriptInit(); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/.gitignore b/bsp/stm32g030c8/pikascript/pikascript-core/.gitignore deleted file mode 100644 index 4022a7e20..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*kite* -*.o diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/BaseObj.c b/bsp/stm32g030c8/pikascript/pikascript-core/BaseObj.c deleted file mode 100644 index 56e8f6936..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/BaseObj.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "BaseObj.h" -#include "PikaObj.h" -#include "TinyObj.h" -#include "dataMemory.h" -#include "dataString.h" -#include "dataStrs.h" - -static void* getClassPtr(PikaObj* classObj, char* classPath) { - char* ptrPath = classPath; - return obj_getPtr(classObj, ptrPath); -} - -int32_t obj_newObjByFun(PikaObj* self, - char* objName, - char* className, - void* newFunPtr) { - /* class means subprocess init */ - Args* buffs = New_strBuff(); - - /* class means subprocess init */ - char* mataObjName = strsAppend(buffs, "[mate]", objName); - obj_setPtr(self, mataObjName, newFunPtr); - /* add void process Ptr, no inited */ - args_setObjectWithClass(self->attributeList, objName, className, NULL); - - args_deinit(buffs); - return 0; -} - -int32_t sysObj_setObjbyClass(PikaObj* self, char* objName, char* classPath) { - /* class means subprocess init */ - Args* buffs = New_strBuff(); - PikaObj* classLoader = obj_getObj(self, "_clsld", 0); - void* newFunPtr = getClassPtr(classLoader, classPath); - - /* class means subprocess init */ - char* mataObjName = strsAppend(buffs, "[mate]", objName); - obj_setPtr(self, mataObjName, newFunPtr); - /* add void process Ptr, no inited */ - args_setObjectWithClass(self->attributeList, objName, classPath, NULL); - - args_deinit(buffs); - return 0; -} - -static int32_t storeClassInfo(PikaObj* self, - Args* buffs, - char* classPath, - void* classPtr) { - int32_t res = 0; - PikaObj* classHost = obj_getObj(self, classPath, 1); - if (NULL == classHost) { - res = 1; - goto exit; - } - char* className = strsGetLastToken(buffs, classPath, '.'); - char* classStoreName = className; - obj_setPtr(classHost, classStoreName, classPtr); - res = 0; - goto exit; -exit: - return res; -} - -int32_t obj_import(PikaObj* self, char* className, NewFun classPtr) { - PikaObj* classLoader = obj_getObj(self, "_clsld", 0); - Args* buffs = New_args(NULL); - int32_t res = storeClassInfo(classLoader, buffs, className, classPtr); - args_deinit(buffs); - return res; -} - -int32_t obj_newObj(PikaObj* self, char* objPath, char* classPath) { - PikaObj* classLoader = obj_getObj(self, "_clsld", 0); - Args* buffs = New_args(NULL); - int res = 0; - void* NewObjPtr = getClassPtr(classLoader, classPath); - if (NULL == NewObjPtr) { - res = 1; - goto exit; - } - PikaObj* objHost = obj_getObj(self, objPath, 1); - if (NULL == objHost) { - res = 2; - goto exit; - } - char* objName = strsGetLastToken(buffs, objPath, '.'); - obj_newObjByFun(objHost, objName, classPath, NewObjPtr); - res = 0; - goto exit; - -exit: - args_deinit(buffs); - return res; -} - -static void print(PikaObj* self, Args* args) { - obj_setErrorCode(self, 0); - char* res = args_print(args, "val"); - if (NULL == res) { - obj_setSysOut(self, "[error] print: can not print val"); - obj_setErrorCode(self, 1); - return; - } - /* not empty */ - obj_setSysOut(self, res); -} - -static void set(PikaObj* self, Args* args) { - obj_setErrorCode(self, 0); - char* argPath = method_getStr(args, "argPath"); - if (obj_isArgExist(self, argPath)) { - /* update arg */ - char* valStr = args_print(args, "val"); - int32_t res = obj_set(self, argPath, valStr); - if (1 == res) { - obj_setSysOut(self, "[error] set: arg no found."); - obj_setErrorCode(self, 1); - return; - } - if (2 == res) { - obj_setSysOut(self, "[error] set: type not match."); - obj_setErrorCode(self, 1); - return; - } - if (3 == res) { - obj_setSysOut(self, "[error] set: object not found."); - obj_setErrorCode(self, 1); - return; - } - return; - } - /* new arg */ - Arg* val = args_getArg(args, "val"); - Arg* newArg = arg_copy(val); - char* argName = strsGetLastToken(args, argPath, '.'); - newArg = arg_setName(newArg, argName); - int32_t res = obj_setArg(self, argPath, newArg); - if (res == 1) { - obj_setSysOut(self, "[error] set: object not found."); - obj_setErrorCode(self, 1); - } - arg_deinit(newArg); - newArg = NULL; - return; -} - -PikaObj* New_BaseObj(Args* args) { - PikaObj* self = New_TinyObj(args); - obj_setObjWithoutClass(self, "_clsld", New_TinyObj); - obj_getObj(self, "_clsld", 0); - class_defineMethod(self, "print(val:any)", print); - class_defineMethod(self, "set(argPath:str, val:any)", set); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/BaseObj.h b/bsp/stm32g030c8/pikascript/pikascript-core/BaseObj.h deleted file mode 100644 index ae5a5717e..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/BaseObj.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef _PikaObj_baseObj__H -#define _PikaObj_baseObj__H -#include "PikaObj.h" -#include "TinyObj.h" -#include "dataMemory.h" - -PikaObj* New_BaseObj(Args* args); -int32_t obj_newObj(PikaObj* self, char* objPath, char* classPath); -int32_t obj_import(PikaObj* self, char* className, NewFun classPtr); -int32_t obj_newObjByFun(PikaObj* self, - char* objName, - char* className, - void* newFunPtr); -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/PikaBlock.c b/bsp/stm32g030c8/pikascript/pikascript-core/PikaBlock.c deleted file mode 100644 index a3ee65171..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/PikaBlock.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "PikaBlock.h" -#include -#include "PikaObj.h" -#include "TinyObj.h" -#include "dataArgs.h" -#include "dataMemory.h" -#include "dataString.h" -#include "dataStrs.h" - -void block_deinit(PikaObj* self) { - obj_deinit(self); -} - -PikaObj* block_init(Args* args) { - PikaObj* self = New_TinyObj(args); - obj_setStr(self, "mode", ""); - obj_setStr(self, "assert", ""); - obj_setStr(self, "body", ""); - obj_setInt(self, "lineSize", 0); - obj_setStr(self, "lineNow", ""); - return self; -} - -char* block_getBody(PikaObj* self) { - return obj_getStr(self, "body"); -} - -void block_setBody(PikaObj* self, char* body) { - obj_setStr(self, "body", body); -} - -uint8_t block_checkAssert(PikaObj* self) { - Args* buffs = New_strBuff(); - PikaObj* host = obj_getContext(self); - char* assert = block_getAssert(self); - obj_run(host, strsFormat(buffs, 32, "_res = %s", assert)); - int res = obj_getInt(host, "_res"); - obj_removeArg(host, "_res"); - args_deinit(buffs); - return res; -} - -uint16_t block_getLineSize(PikaObj* self) { - return obj_getInt(self, "lineSize"); -} - -void block_setAssert(PikaObj* self, char* assert) { - obj_setStr(self, "assert", assert); -} - -char* block_getAssert(PikaObj* self) { - return obj_getStr(self, "assert"); -} - -void block_setMode(PikaObj* self, char* mode) { - obj_setStr(self, "mode", mode); -} - -char* block_getMode(PikaObj* self) { - return obj_getStr(self, "mode"); -} - -void block_pushLine(PikaObj* self, char* line) { - Args* buffs = New_strBuff(); - char* body = obj_getStr(self, "body"); - body = strsAppend(buffs, body, line); - body = strsAppend(buffs, body, "\n"); - obj_setStr(self, "body", body); - obj_setInt(self, "lineSize", obj_getInt(self, "lineSize") + 1); - args_deinit(buffs); -} - -char* block_popLine(PikaObj* self) { - Args* buffs = New_strBuff(); - char* body = obj_getStr(self, "body"); - char* line = strsPopToken(buffs, body, '\n'); - - obj_setStr(self, "body", body); - obj_setStr(self, "lineNow", line); - obj_setInt(self, "lineSize", obj_getInt(self, "lineSize") - 1); - args_deinit(buffs); - return obj_getStr(self, "lineNow"); -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/PikaBlock.h b/bsp/stm32g030c8/pikascript/pikascript-core/PikaBlock.h deleted file mode 100644 index 283b9637f..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/PikaBlock.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef _pikaBlock__H -#define _pikaBlock__H -#include "PikaObj.h" - -void block_deinit(PikaObj* self); -PikaObj* block_init(Args* args); -char* block_popLine(PikaObj* self); -void block_pushLine(PikaObj* self, char* line); -char* block_getBody(PikaObj* self); -char* block_getAssert(PikaObj* self); -void block_setAssert(PikaObj* self, char* assert); -uint8_t block_checkAssert(PikaObj* self); -uint16_t block_getLineSize(PikaObj* self); -void block_setMode(PikaObj* self, char* mode); -char* block_getMode(PikaObj* self); -void block_setBody(PikaObj* self, char* body); -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/PikaIf.c b/bsp/stm32g030c8/pikascript/pikascript-core/PikaIf.c deleted file mode 100644 index 81e2885f8..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/PikaIf.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "PikaIf.h" -#include -#include "PikaBlock.h" -#include "TinyObj.h" -#include "dataStrs.h" - -void if_setAssert(PikaObj* self, char* line) { - Args* buffs = New_strBuff(); - char* assert = strsRemovePrefix(buffs, line, "if "); - assert = strsGetFirstToken(buffs, assert, ':'); - block_setAssert(self, assert); - block_setMode(self, "if"); - args_deinit(buffs); -} - -void if_pushLine(PikaObj* self, char* line) { - Args* buffs = New_strBuff(); - char* bodyLine = strsRemovePrefix(buffs, line, " "); - block_pushLine(self, bodyLine); - goto exit; -exit: - args_deinit(buffs); - return; -} - -void if_run(PikaObj* self) { - if (block_checkAssert(self)) { - PikaObj* host = obj_getContext(self); - while (0 != block_getLineSize(self)) { - char* line = block_popLine(self); - obj_run(host, line); - } - } -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/PikaIf.h b/bsp/stm32g030c8/pikascript/pikascript-core/PikaIf.h deleted file mode 100644 index d11dcdce0..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/PikaIf.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef _pikaIf__H -#define _pikaIf__H -#include "PikaObj.h" - -void if_pushLine(PikaObj* self, char* line); -void if_setAssert(PikaObj* self, char* line); -void if_run(PikaObj* self); -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/PikaInvoke.c b/bsp/stm32g030c8/pikascript/pikascript-core/PikaInvoke.c deleted file mode 100644 index 8492a59f4..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/PikaInvoke.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include -#include "PikaObj.h" -#include "dataArgs.h" -#include "dataMemory.h" -#include "dataString.h" -#include "dataStrs.h" - -static int32_t loadArgByType(PikaObj* self, - char* definedName, - char* definedType, - char* sourceArgPath, - Args* args) { - if (strEqu(definedType, "any")) { - if (0 == obj_getAnyArg(self, definedName, sourceArgPath, args)) { - return 0; - } - /* solve arg faild */ - return 3; - } - if (strEqu(definedType, "str")) { - /* solve the string type */ - char* directStr = strsGetDirectStr(args, sourceArgPath); - if (NULL != directStr) { - /* direct value */ - args_setStr(args, definedName, directStr); - /* ok */ - return 0; - } - /* reference value */ - char* refStr = obj_getStr(self, sourceArgPath); - if (NULL == refStr) { - /* faild */ - return 1; - } - args_setStr(args, definedName, refStr); - /* succeed */ - return 0; - } - if (strEqu(definedType, "int")) { - /* solve the int32_t type */ - args_setInt(args, definedName, 0); - if ((sourceArgPath[0] >= '0') && (sourceArgPath[0] <= '9')) { - /* direct value */ - args_set(args, definedName, sourceArgPath); - /* succeed */ - return 0; - } - /* reference value */ - if (!obj_isArgExist(self, sourceArgPath)) { - /* can not get reference */ - return 3; - } - int32_t referenceVal = obj_getInt(self, sourceArgPath); - args_setInt(args, definedName, referenceVal); - /* succeed */ - return 0; - } - if (strEqu(definedType, "float")) { - /* solve the float type */ - args_setFloat(args, definedName, 0); - if ((sourceArgPath[0] >= '0') && (sourceArgPath[0] <= '9')) { - /* direct value */ - args_set(args, definedName, sourceArgPath); - /* succeed */ - return 0; - } - /* reference value */ - if (!obj_isArgExist(self, sourceArgPath)) { - /* can not get reference */ - return 3; - } - float referenceVal = obj_getFloat(self, sourceArgPath); - args_setFloat(args, definedName, referenceVal); - /* succeed */ - return 0; - } - if (strEqu(definedType, "pointer")) { - /* only support reference value */ - if (!obj_isArgExist(self, sourceArgPath)) { - /* can not get reference */ - return 3; - } - void* ptr = obj_getPtr(self, sourceArgPath); - args_setPtr(args, definedName, ptr); - return 0; - } - /* type match faild */ - return 2; -} - -char* getTypeVal(Args* buffs, char* typeToken) { - if (!strIsContain(typeToken, ':')) { - return strsCopy(buffs, ""); - } - return strsGetLastToken(buffs, typeToken, ':'); -} - -static Args* getArgsByNameMatch(PikaObj* self, char* typeList, char* argList) { - Args* buffs = New_strBuff(); - char* typeListBuff = strsCopy(buffs, typeList); - Args* args = New_args(NULL); - while (1) { - char* typeToken = strsPopToken(buffs, typeListBuff, ','); - /* poped all type from typeList */ - if (0 == typeToken[0]) { - break; - } - - char* typeName = strsGetFirstToken(buffs, typeToken, ':'); - char* typeVal = getTypeVal(buffs, typeToken); - - char* argListBuff = strsCopy(buffs, argList); - while (1) { - char* argToken = strsPopToken(buffs, argListBuff, ','); - char* argName = strsGetFirstToken(buffs, argToken, '='); - char* argVal = strsGetLastToken(buffs, argToken, '='); - - if (0 == argToken[0]) { - /* arg poped finised */ - break; - } - - if (!strEqu(typeName, argName)) { - /* name not match */ - continue; - } - - if (0 != loadArgByType(self, typeName, typeVal, argVal, args)) { - args_deinit(args); - args_deinit(buffs); - return NULL; - } - } - } - args_deinit(buffs); - return args; -} - -static Args* getArgsBySort(PikaObj* self, char* typeList, char* argList) { - Args* buffs = New_strBuff(); - char* typeListBuff = strsCopy(buffs, typeList); - char* argListBuff = strsCopy(buffs, argList); - Args* args = New_args(NULL); - while (1) { - char* typeToken = strsPopToken(buffs, typeListBuff, ','); - char* argToken = strsPopToken(buffs, argListBuff, ','); - if ((0 == argToken[0]) || (0 == typeToken[0])) { - /* arg or type poped finised */ - break; - } - - char* typeName = strsGetFirstToken(buffs, typeToken, ':'); - char* typeVal = getTypeVal(buffs, typeToken); - char* argPath = argToken; - - if (0 != loadArgByType(self, typeName, typeVal, argPath, args)) { - args_deinit(args); - args_deinit(buffs); - return NULL; - } - } - args_deinit(buffs); - return args; -} - -static Args* getArgsBySentence(PikaObj* self, char* typeList, char* argList) { - if (strIsContain(argList, '=')) { - return getArgsByNameMatch(self, typeList, argList); - } - return getArgsBySort(self, typeList, argList); -} - -static char* getMethodDeclearation(PikaObj* obj, char* methodName) { - Args* buffs = New_strBuff(); - char* methodDeclearationPath = strsAppend(buffs, "[md]", methodName); - char* res = obj_getStr(obj, methodDeclearationPath); - args_deinit(buffs); - return res; -} - -static void* getMethodPtr(PikaObj* methodHost, char* methodName) { - Args* buffs = New_strBuff(); - char* methodPtrPath = strsAppend(buffs, "[mp]", methodName); - void* res = obj_getPtr(methodHost, methodPtrPath); - args_deinit(buffs); - return res; -} - -Args* obj_invoke(PikaObj* self, char* cmd) { - /* the Args returned need to be deinit */ - Args* res = New_args(NULL); - args_setErrorCode(res, 0); - Args* buffs = New_strBuff(); - char* methodToken = strsGetFirstToken(buffs, cmd, '('); - char* methodPath = methodToken; - Args* args = NULL; - - PikaObj* methodHostObj = obj_getObj(self, methodPath, 1); - PikaObj* methodHostClass = NULL; - if (NULL == methodHostObj) { - /* error, not found object */ - args_setErrorCode(res, 1); - args_setSysOut(res, "[error] runner: object no found."); - goto exit; - } - char* methodName = strsGetLastToken(buffs, methodPath, '.'); - - void* classPtr = obj_getPtr(methodHostObj, "_clsptr"); - char* methodHostClassName = - strsAppend(buffs, "classObj-", obj_getName(methodHostObj)); - methodHostClass = - obj_getClassObjByNewFun(methodHostObj, methodHostClassName, classPtr); - /* get method Ptr */ - void (*methodPtr)(PikaObj * self, Args * args) = - getMethodPtr(methodHostClass, methodName); - char* methodDecInClass = getMethodDeclearation(methodHostClass, methodName); - /* assert method*/ - if ((NULL == methodDecInClass) || (NULL == methodPtr)) { - /* error, method no found */ - args_setErrorCode(res, 2); - args_setSysOut(res, "[error] runner: method no found."); - goto exit; - } - char* methodDec = strsCopy(buffs, methodDecInClass); - /* free method host class to save memory */ - obj_deinit(methodHostClass); - methodHostClass = NULL; - - /* get type list */ - char* typeList = strsCut(buffs, methodDec, '(', ')'); - if (typeList == NULL) { - /* typeList no found */ - args_setErrorCode(res, 3); - args_setSysOut(res, "[error] runner: type list no found."); - goto exit; - } - - /* get arg list */ - char* argList = strsCut(buffs, cmd, '(', ')'); - { - if (argList == NULL) { - /* argL List no found */ - args_setErrorCode(res, 4); - args_setSysOut(res, "[error] runner: arg list no found."); - goto exit; - } - } - - /* get return type */ - char* returnType = strsGetLastToken(buffs, methodDec, ')'); - - /* get args */ - args = getArgsBySentence(self, typeList, argList); - if (NULL == args) { - /* get args faild */ - args_setErrorCode(res, 5); - args_setSysOut(res, "[error] runner: solve arg faild."); - goto exit; - } - obj_setErrorCode(methodHostObj, 0); - obj_setSysOut(methodHostObj, ""); - /* run method */ - methodPtr(methodHostObj, args); - - /* transfer return type */ - args_setStr(res, "returnType", returnType); - /* transfer return */ - args_copyArgByName(args, "return", res); - /* transfer sysOut */ - char* sysOut = obj_getSysOut(methodHostObj); - if (NULL != sysOut) { - args_setSysOut(res, sysOut); - } - /* transfer errCode */ - if (0 != obj_getErrorCode(methodHostObj)) { - /* method error */ - args_setErrorCode(res, 6); - } - goto exit; -exit: - if (NULL != buffs) { - args_deinit(buffs); - } - if (NULL != methodHostClass) { - obj_deinit(methodHostClass); - } - if (NULL != args) { - args_deinit(args); - } - return res; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/PikaInvoke.h b/bsp/stm32g030c8/pikascript/pikascript-core/PikaInvoke.h deleted file mode 100644 index f5400b416..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/PikaInvoke.h +++ /dev/null @@ -1,9 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef _invoke__H -#define _invoke__H -Args* obj_invoke(PikaObj* self, char* cmd); -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/PikaObj.c b/bsp/stm32g030c8/pikascript/pikascript-core/PikaObj.c deleted file mode 100644 index 68abf4c5b..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/PikaObj.c +++ /dev/null @@ -1,783 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "PikaObj.h" -#include -#include "BaseObj.h" -#include "PikaBlock.h" -#include "PikaIf.h" -#include "PikaInvoke.h" -#include "PikaWhile.h" -#include "dataArgs.h" -#include "dataMemory.h" -#include "dataString.h" -#include "dataStrs.h" - -PikaObj* obj_getContext(PikaObj* self) { - return obj_getPtr(self, "_ctx"); -} - -void* getNewObjFunByClass(PikaObj* obj, char* classPath) { - PikaObj* classLoader = args_getPtr(obj->attributeList, "_clsld"); - if (NULL == classLoader) { - return NULL; - } - void* (*newObjFun)(Args * initArgs) = - args_getPtr(classLoader->attributeList, classPath); - return newObjFun; -} - -int32_t deinitEachSubObj(Arg* argEach, Args* handleArgs) { - if (NULL != handleArgs) { - /* error: tOhis handle not need handle args */ - return 1; - } - char* type = arg_getType(argEach); - if (strIsStartWith(type, "_class")) { - PikaObj* subObj = arg_getPtr(argEach); - if (NULL != subObj) { - obj_deinit(subObj); - } - } - return 0; -} - -void deinitAllSubObj(PikaObj* self) { - Args* args = self->attributeList; - args_foreach(args, deinitEachSubObj, NULL); -} - -int32_t obj_deinit(PikaObj* self) { - deinitAllSubObj(self); - args_deinit(self->attributeList); - // DynMemPut(self->mem); - pikaFree(self, sizeof(PikaObj)); - self = NULL; - return 0; -} - -int32_t obj_enable(PikaObj* self) { - obj_setInt(self, "isEnable", 1); - return 0; -} - -int32_t obj_disable(PikaObj* self) { - obj_setInt(self, "isEnable", 0); - return 0; -} - -int32_t obj_setInt(PikaObj* self, char* argPath, int64_t val) { - PikaObj* obj = obj_getObj(self, argPath, 1); - if (NULL == obj) { - /* [error] object no found */ - return 1; - } - Args* buffs = New_strBuff(); - char* name = strsGetLastToken(buffs, argPath, '.'); - args_setInt(obj->attributeList, name, val); - args_deinit(buffs); - return 0; -} - -int32_t obj_setPtr(PikaObj* self, char* argPath, void* pointer) { - PikaObj* obj = obj_getObj(self, argPath, 1); - if (NULL == obj) { - return 1; - } - Args* buffs = New_strBuff(); - char* name = strsGetLastToken(buffs, argPath, '.'); - args_setPtr(obj->attributeList, name, pointer); - args_deinit(buffs); - return 0; -} - -int32_t obj_setFloat(PikaObj* self, char* argPath, float value) { - PikaObj* obj = obj_getObj(self, argPath, 1); - if (NULL == obj) { - return 1; - } - Args* buffs = New_strBuff(); - char* name = strsGetLastToken(buffs, argPath, '.'); - args_setFloat(obj->attributeList, name, value); - args_deinit(buffs); - return 0; -} - -int32_t obj_setStr(PikaObj* self, char* argPath, char* str) { - PikaObj* obj = obj_getObj(self, argPath, 1); - if (NULL == obj) { - return 1; - } - Args* buffs = New_strBuff(); - char* name = strsGetLastToken(buffs, argPath, '.'); - args_setStr(obj->attributeList, name, str); - args_deinit(buffs); - return 0; -} - -int64_t obj_getInt(PikaObj* self, char* argPath) { - PikaObj* obj = obj_getObj(self, argPath, 1); - if (NULL == obj) { - return -999999999; - } - Args* buffs = New_strBuff(); - char* argName = strsGetLastToken(buffs, argPath, '.'); - int res = args_getInt(obj->attributeList, argName); - args_deinit(buffs); - return res; -} - -Arg* obj_getArg(PikaObj* self, char* argPath) { - PikaObj* obj = obj_getObj(self, argPath, 1); - if (NULL == obj) { - return NULL; - } - Args* buffs = New_strBuff(); - char* argName = strsGetLastToken(buffs, argPath, '.'); - Arg* res = args_getArg(obj->attributeList, argName); - args_deinit(buffs); - return res; -} - -int32_t obj_setArg(PikaObj* self, char* argPath, Arg* arg) { - /* setArg would copy arg */ - PikaObj* obj = obj_getObj(self, argPath, 1); - if (NULL == obj) { - /* object no found */ - return 1; - } - args_copyArg(obj->attributeList, arg); - return 0; -} - -void* obj_getPtr(PikaObj* self, char* argPath) { - PikaObj* obj = obj_getObj(self, argPath, 1); - if (NULL == obj) { - return NULL; - } - Args* buffs = New_strBuff(); - char* argName = strsGetLastToken(buffs, argPath, '.'); - void* res = args_getPtr(obj->attributeList, argName); - args_deinit(buffs); - return res; -} - -float obj_getFloat(PikaObj* self, char* argPath) { - PikaObj* obj = obj_getObj(self, argPath, 1); - if (NULL == obj) { - return -999.999; - } - Args* buffs = New_strBuff(); - char* argName = strsGetLastToken(buffs, argPath, '.'); - float res = args_getFloat(obj->attributeList, argName); - args_deinit(buffs); - return res; -} - -char* obj_getStr(PikaObj* self, char* argPath) { - PikaObj* obj = obj_getObj(self, argPath, 1); - if (NULL == obj) { - return NULL; - } - Args* buffs = New_strBuff(); - char* argName = strsGetLastToken(buffs, argPath, '.'); - char* res = args_getStr(obj->attributeList, argName); - args_deinit(buffs); - return res; -} - -int32_t obj_load(PikaObj* self, Args* args, char* name) { - args_copyArgByName(args, name, self->attributeList); - return 0; -} - -int32_t obj_setObjWithoutClass(PikaObj* self, char* objName, void* newFun) { - /* class means subprocess init */ - Args* buffs = New_strBuff(); - char* mataObjName = strsAppend(buffs, "[mate]", objName); - obj_setPtr(self, mataObjName, newFun); - /* add void object Ptr, no inited */ - args_setObjectWithClass(self->attributeList, objName, "none", NULL); - args_deinit(buffs); - return 0; -} - -int32_t obj_addOther(PikaObj* self, char* subObjectName, void* new_ObjectFun) { - Args* initArgs = New_args(NULL); - args_setPtr(initArgs, "_ctx", self); - void* (*new_Object)(Args * initArgs) = (void* (*)(Args*))new_ObjectFun; - void* subObject = new_Object(initArgs); - obj_setPtr(self, subObjectName, subObject); - args_deinit(initArgs); - return 0; -} - -int32_t obj_freeObj(PikaObj* self, char* objPath) { - PikaObj* obj = obj_getPtr(self, objPath); - obj_deinit(obj); - return 0; -} - -int32_t obj_bind(PikaObj* self, char* type, char* name, void* pointer) { - args_bind(self->attributeList, type, name, pointer); - return 0; -} - -char* obj_print(PikaObj* self, char* name) { - if (NULL == self) { - return NULL; - } - return args_print(self->attributeList, name); -} - -int32_t obj_bindInt(PikaObj* self, char* name, int32_t* valPtr) { - args_bindInt(self->attributeList, name, valPtr); - return 0; -} - -int32_t obj_bindFloat(PikaObj* self, char* name, float* valPtr) { - args_bindFloat(self->attributeList, name, valPtr); - return 0; -} - -int32_t obj_bindString(PikaObj* self, char* name, char** valPtr) { - args_bindStr(self->attributeList, name, valPtr); - return 0; -} - -int32_t obj_set(PikaObj* self, char* argPath, char* valStr) { - PikaObj* obj = obj_getObj(self, argPath, 1); - if (NULL == obj) { - /* cant get object */ - return 3; - } - Args* buffs = New_strBuff(); - char* argName = strsGetLastToken(buffs, argPath, '.'); - int32_t res = args_set(obj->attributeList, argName, valStr); - args_deinit(buffs); - if (res == 1) { - /* do not get arg */ - return 1; - } - if (res == 2) { - /* type not match */ - return 2; - } - /* succeed */ - return 0; -} - -PikaObj* obj_getClassObjByNewFun(PikaObj* context, - char* name, - NewFun newClassFun) { - Args* initArgs = New_args(NULL); - args_setPtr(initArgs, "_ctx", context); - args_setStr(initArgs, "_n", name); - PikaObj* thisClass = newClassFun(initArgs); - obj_setPtr(thisClass, "_clsptr", newClassFun); - args_deinit(initArgs); - return thisClass; -} - -char* obj_getClassPath(PikaObj* objHost, Args* buffs, char* objName) { - Arg* objArg = obj_getArg(objHost, objName); - char* objType = arg_getType(objArg); - char* classPath = strsRemovePrefix(buffs, objType, "_class-"); - return classPath; -} - -void* getNewClassObjFunByName(PikaObj* obj, char* name) { - Args* buffs = New_strBuff(); - char* classPath = strsAppend(buffs, "[mate]", name); - /* init the subprocess */ - void* (*newClassObjFun)(Args * initArgs) = - args_getPtr(obj->attributeList, classPath); - args_deinit(buffs); - return newClassObjFun; -} - -int32_t removeEachMethodInfo(Arg* argNow, Args* argList) { - if (strIsStartWith(arg_getName(argNow), "[md]")) { - args_removeArg(argList, arg_getName(argNow)); - return 0; - } - if (strIsStartWith(arg_getName(argNow), "[mp]")) { - args_removeArg(argList, arg_getName(argNow)); - return 0; - } - return 0; -} - -PikaObj* removeMethodInfo(PikaObj* thisClass) { - args_foreach(thisClass->attributeList, removeEachMethodInfo, - thisClass->attributeList); - return thisClass; -} - -static void removeClassLoader(PikaObj* obj) { - PikaObj* classLoader = args_getPtr(obj->attributeList, "_clsld"); - if (NULL != classLoader) { - obj_deinit(classLoader); - args_removeArg(obj->attributeList, "_clsld"); - } -} - -PikaObj* newRootObj(char* name, NewFun newObjFun) { - PikaObj* thisClass = obj_getClassObjByNewFun(NULL, name, newObjFun); - PikaObj* newObj = removeMethodInfo(thisClass); - return newObj; -} - -PikaObj* initObj(PikaObj* obj, char* name) { - PikaObj* res = NULL; - NewFun newObjFun = getNewClassObjFunByName(obj, name); - Args* buffs = New_args(NULL); - if (NULL == newObjFun) { - /* no such object */ - res = NULL; - goto exit; - } - PikaObj* thisClass = obj_getClassObjByNewFun(obj, name, newObjFun); - PikaObj* newObj = removeMethodInfo(thisClass); - /* delete [mate] */ - obj_removeArg(obj, strsAppend(buffs, "[mate]", name)); - /* delete "_clsld" object */ - removeClassLoader(newObj); - - char* type = args_getType(obj->attributeList, name); - args_setPtrWithType(obj->attributeList, name, type, newObj); - res = obj_getPtr(obj, name); - goto exit; -exit: - args_deinit(buffs); - return res; -} - -PikaObj* obj_getObjDirect(PikaObj* self, char* name) { - if (NULL == self) { - return NULL; - } - - /* check subprocess */ - if (NULL == args_getPtr(self->attributeList, name)) { - /* no inited subprocess, check subprocess init fun*/ - return initObj(self, name); - } - - /* finded subscribe, check type*/ - char* type = args_getType(self->attributeList, name); - if (!strIsStartWith(type, "_class")) { - /* type error, could not found subprocess */ - return NULL; - } - return obj_getPtr(self, name); -} - -PikaObj* obj_getObj(PikaObj* self, char* objPath, int32_t keepDeepth) { - Args* buffs = New_strBuff(); - char* objPathBuff = strsCopy(buffs, objPath); - int32_t tokenNum = strGetTokenNum(objPath, '.'); - PikaObj* obj = self; - for (int32_t i = 0; i < tokenNum - keepDeepth; i++) { - char* token = strsPopToken(buffs, objPathBuff, '.'); - obj = obj_getObjDirect(obj, token); - if (obj == NULL) { - goto exit; - } - } - goto exit; -exit: - args_deinit(buffs); - return obj; -} - -char* obj_getName(PikaObj* self) { - return obj_getStr(self, "_n"); -} - -void loadMethodInfo(PikaObj* methodHost, - char* methodName, - char* methodDeclearation, - void* methodPtr) { - Args* buffs = New_strBuff(); - char* methodPtrPath = strsAppend(buffs, "[mp]", methodName); - char* methodDeclearationPath = strsAppend(buffs, "[md]", methodName); - obj_setPtr(methodHost, methodPtrPath, methodPtr); - obj_setStr(methodHost, methodDeclearationPath, methodDeclearation); - args_deinit(buffs); -} - -int32_t class_defineMethod(PikaObj* self, - char* declearation, - void (*methodPtr)(PikaObj* self, Args* args)) { - int32_t size = strGetSize(declearation); - int32_t res = 0; - Args* buffs = New_strBuff(); - char* cleanDeclearation = - strDeleteChar(args_getBuff(buffs, size), declearation, ' '); - char* methodPath = - strGetFirstToken(args_getBuff(buffs, size), cleanDeclearation, '('); - - PikaObj* methodHost = obj_getObj(self, methodPath, 1); - if (NULL == methodHost) { - /* no found method object */ - res = 1; - goto exit; - } - char* methodName = strsGetLastToken(buffs, methodPath, '.'); - - loadMethodInfo(methodHost, methodName, cleanDeclearation, methodPtr); - res = 0; - goto exit; -exit: - args_deinit(buffs); - return res; -} - -static void transferReturnVal(PikaObj* self, - char* returnType, - char* returnName, - Args* args) { - if (strEqu("->int", returnType)) { - int returnVal = args_getInt(args, "return"); - obj_setInt(self, returnName, returnVal); - return; - } - if (strEqu("->float", returnType)) { - float returnVal = args_getFloat(args, "return"); - obj_setFloat(self, returnName, returnVal); - return; - } - if (strEqu("->str", returnType)) { - char* returnVal = args_getStr(args, "return"); - obj_setStr(self, returnName, returnVal); - return; - } -} - -char* getRightCmd(Args* buffs, char* cmd) { - char* right = NULL; - char* cmdBuff = strsCopy(buffs, cmd); - if (strIsContain(cmd, '(')) { - cmdBuff = strsGetFirstToken(buffs, cmdBuff, '('); - } - if (strIsContain(cmdBuff, '=')) { - cmdBuff = strsCopy(buffs, cmd); - strsPopToken(buffs, cmdBuff, '='); - right = cmdBuff; - } else { - right = cmd; - } - return right; -} - -uint8_t obj_getAnyArg(PikaObj* self, - char* targetArgName, - char* sourceArgPath, - Args* targetArgs) { - if (0 == args_setLiteral(targetArgs, targetArgName, sourceArgPath)) { - return 0; - } - if (0 == obj_getRefArg(self, targetArgName, sourceArgPath, targetArgs)) { - return 0; - } - /* solve arg faild */ - return 3; -} - -uint8_t obj_getRefArg(PikaObj* self, - char* targetArgName, - char* sourceArgPath, - Args* targetArgs) { - /* get reference arg */ - Arg* arg = obj_getArg(self, sourceArgPath); - if (arg == NULL) { - /* can not get arg */ - return 3; - } - Arg* argCopied = arg_copy(arg); - argCopied = arg_setName(argCopied, targetArgName); - args_setArg(targetArgs, argCopied); - return 0; -} - -Args* getRightRes(PikaObj* self, char* cmd) { - Args* buffs = New_strBuff(); - Args* res = NULL; - if (strIsContain(cmd, '(') && strIsContain(cmd, ')')) { - res = obj_invoke(self, cmd); - goto exit; - } - res = New_args(NULL); - args_setSysOut(res, ""); - char* value = cmd; - int err = obj_getAnyArg(self, "return", value, res); - if (err != 0) { - args_setSysOut(res, "[error] get value faild."); - args_setErrorCode(res, 1); - goto exit; - } - char* returnType = args_getType(res, "return"); - returnType = strsAppend(buffs, "->", returnType); - args_setStr(res, "returnType", returnType); - goto exit; - -exit: - args_deinit(buffs); - return res; -} - -Args* obj_runScript(PikaObj* self, char* cmd) { - Args* buffs = New_strBuff(); - Args* res = NULL; - cmd = strsGetCleanCmd(buffs, cmd); - - /* get right cmd */ - char* right = getRightCmd(buffs, cmd); - - /* get res from right cmd */ - res = getRightRes(self, right); - if (NULL != res) { - if (0 != args_getErrorCode(res)) { - goto exit; - } - } - /* check res */ - if (NULL == res) { - res = New_args(NULL); - args_setErrorCode(res, 1); - args_setSysOut(res, "[error] solve script format faild!"); - goto exit; - } - - /* transfer return */ - if (strIsContain(cmd, '=')) { - char* returnName = strsGetFirstToken(buffs, cmd, '='); - returnName = strsDeleteChar(buffs, returnName, ' '); - char* returnType = args_getStr(res, "returnType"); - transferReturnVal(self, returnType, returnName, res); - } - -exit: - args_deinit(buffs); - return res; -} - -Args* obj_runDirect(PikaObj* self, char* cmd) { - Args* buffs = New_strBuff(); - Args* res = NULL; - cmd = strsDeleteChar(buffs, cmd, '\n'); - /* in block */ - if (NULL != obj_getArg(self, "_isInBlock")) { - PikaObj* block = obj_getObj(self, "_block", 0); - if (strIsStartWith(cmd, " ")) { - if (strEqu(block_getMode(block), "if")) { - if_pushLine(block, cmd); - goto exit; - } - if (strEqu(block_getMode(block), "while")) { - while_pushLine(block, cmd); - goto exit; - } - goto exit; - } - /* the block is end */ - else { - obj_removeArg(self, "_isInBlock"); - if (strEqu(block_getMode(block), "if")) { - if_run(block); - } - if (strEqu(block_getMode(block), "while")) { - while_run(block); - } - obj_removeArg(self, "_block"); - /* not finished */ - } - } - - /* if block */ - if (strIsStartWith(cmd, "if ")) { - obj_setInt(self, "_isInBlock", 1); - obj_setObjWithoutClass(self, "_block", block_init); - PikaObj* block = obj_getObj(self, "_block", 0); - if_setAssert(block, cmd); - /* this line processed ok */ - goto exit; - } - - /* while block */ - if (strIsStartWith(cmd, "while ")) { - obj_setInt(self, "_isInBlock", 1); - obj_setObjWithoutClass(self, "_block", block_init); - PikaObj* block = obj_getObj(self, "_block", 0); - while_setAssert(block, cmd); - /* this line processed ok */ - goto exit; - } - /* check class */ - if (strIsContain(cmd, '(') && strIsContain(cmd, ')') && - strIsContain(cmd, '=')) { - /* check class */ - char* classCmd = strsGetCleanCmd(buffs, cmd); - char* newObj = strsGetFirstToken(buffs, classCmd, '='); - char* classPath = strsGetLastToken(buffs, classCmd, '='); - classPath = strsGetFirstToken(buffs, classPath, '('); - /* replace . with _ */ - for (int i = 0; i < strGetSize(classPath); i++) { - if ('.' == classPath[i]) { - classPath[i] = '_'; - } - } - if (0 == obj_newObj(self, newObj, classPath)) { - goto exit; - } - } - - /* run script */ - if (strIsContain(cmd, '(') && strIsContain(cmd, ')')) { - res = obj_runScript(self, cmd); - goto exit; - } - - /* run script */ - if (strIsContain(cmd, '=')) { - res = obj_runScript(self, cmd); - goto exit; - } - -exit: - /* check res */ - if (NULL == res) { - res = New_args(NULL); - args_setErrorCode(res, 0); - args_setSysOut(res, ""); - goto exit; - } - args_deinit(buffs); - return res; -} - -int32_t obj_removeArg(PikaObj* self, char* argPath) { - PikaObj* objHost = obj_getObj(self, argPath, 1); - PikaObj* obj = obj_getObj(self, argPath, 0); - Args* buffs = New_strBuff(); - if (NULL != obj) { - obj_deinit(obj); - } - int32_t err = 0; - if (NULL == objHost) { - /* [error] object no found */ - err = 1; - goto exit; - } - char* argName = strsGetLastToken(buffs, argPath, '.'); - int32_t res = args_removeArg(objHost->attributeList, argName); - if (1 == res) { - /*[error] not found arg*/ - err = 2; - goto exit; - } - goto exit; -exit: - args_deinit(buffs); - return err; -} - -int32_t obj_isArgExist(PikaObj* self, char* argPath) { - PikaObj* obj = obj_getObj(self, argPath, 1); - Args* buffs = New_strBuff(); - int32_t res = 0; - if (NULL == obj) { - /* [error] object no found */ - res = 1; - goto exit; - } - char* argName = strsGetLastToken(buffs, argPath, '.'); - Arg* arg = args_getArg(obj->attributeList, argName); - if (NULL == arg) { - /* no found arg */ - res = 0; - goto exit; - } - /* found arg */ - res = 1; - goto exit; - -exit: - args_deinit(buffs); - return res; -} - -void obj_runNoRes(PikaObj* slef, char* cmd) { - /* unsafe, nothing would happend when error occord */ - args_deinit(obj_runDirect(slef, cmd)); -} - -void obj_run(PikaObj* self, char* cmd) { - /* safe, stop when error occord and error info would be print32_t */ - Args* res = obj_runDirect(self, cmd); - char* sysOut = args_getSysOut(res); - uint8_t errcode = args_getErrorCode(res); - obj_setSysOut(self, sysOut); - obj_setErrorCode(self, errcode); - if (!strEqu("", sysOut)) { - __platformPrintf("%s\r\n", sysOut); - } - if (0 != errcode) { - __platformPrintf("[info] input commond: %s\r\n", cmd); - while (1) - ; - } - if (NULL != res) { - args_deinit(res); - } -} - -void obj_setErrorCode(PikaObj* self, int32_t errCode) { - obj_setInt(self, "__errCode", errCode); -} - -int32_t obj_getErrorCode(PikaObj* self) { - if (!obj_isArgExist(self, "__errCode")) { - return 0; - } - return obj_getInt(self, "__errCode"); -} - -void args_setErrorCode(Args* args, int32_t errCode) { - args_setInt(args, "__errCode", errCode); -} - -int32_t args_getErrorCode(Args* args) { - if (!args_isArgExist(args, "__errCode")) { - return 0; - } - return args_getInt(args, "__errCode"); -} - -void obj_setSysOut(PikaObj* self, char* str) { - obj_setStr(self, "__sysOut", str); -} - -char* obj_getSysOut(PikaObj* self) { - return obj_getStr(self, "__sysOut"); -} - -char* args_getSysOut(Args* args) { - return args_getStr(args, "__sysOut"); -} - -void args_setSysOut(Args* args, char* str) { - args_setStr(args, "__sysOut", str); -} - -void obj_sysPrintf(PikaObj* self, char* fmt, ...) { - va_list args; - va_start(args, fmt); - char sysOut[128] = {0}; - vsprintf(sysOut, fmt, args); - obj_setSysOut(self, sysOut); - va_end(args); -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/PikaObj.h b/bsp/stm32g030c8/pikascript/pikascript-core/PikaObj.h deleted file mode 100644 index dd3c60154..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/PikaObj.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef _Process__H -#define _Process__H -#include "dataArgs.h" -#include "dataLink.h" -#include "dataMemory.h" -#include "method.h" -typedef struct PikaObj_t PikaObj; -typedef PikaObj* (*NewFun)(Args* args); -typedef PikaObj* (*InitFun)(PikaObj* self, Args* args); - -struct PikaObj_t { - /* list */ - Args* attributeList; -}; - -/* operation */ -int32_t obj_deinit(PikaObj* self); -int32_t obj_init(PikaObj* self, Args* args); -int32_t obj_update(PikaObj* self); -int32_t obj_enable(PikaObj* self); -int32_t obj_disable(PikaObj* self); - -// arg type operations -int32_t obj_setInt(PikaObj* self, char* argPath, int64_t val); -int32_t obj_setPtr(PikaObj* self, char* argPath, void* pointer); -int32_t obj_setFloat(PikaObj* self, char* argPath, float value); -int32_t obj_setStr(PikaObj* self, char* argPath, char* str); -int32_t obj_setArg(PikaObj* self, char* argPath, Arg* arg); - -void* obj_getPtr(PikaObj* self, char* argPath); -float obj_getFloat(PikaObj* self, char* argPath); -char* obj_getStr(PikaObj* self, char* argPath); -int64_t obj_getInt(PikaObj* self, char* argPath); -Arg* obj_getArg(PikaObj* self, char* argPath); - -char* obj_getName(PikaObj* self); - -// arg general operations -int32_t obj_bind(PikaObj* self, char* type, char* name, void* pointer); -int32_t obj_set(PikaObj* self, char* name, char* valStr); - -int32_t obj_bindInt(PikaObj* self, char* name, int32_t* valPtr); -int32_t obj_bindFloat(PikaObj* self, char* name, float* valPtr); -int32_t obj_bindString(PikaObj* self, char* name, char** valPtr); - -char* obj_print(PikaObj* self, char* name); - -// args operations -int32_t obj_load(PikaObj* self, Args* args, char* name); - -// subObject -int32_t obj_addOther(PikaObj* self, char* subObjectName, void* new_projcetFun); -int32_t obj_setObjWithoutClass(PikaObj* self, - char* subObjectName, - void* new_projcetFun); -PikaObj* obj_getObjDirect(PikaObj* self, char* name); -PikaObj* obj_getObj(PikaObj* self, char* processPathectory, int32_t deepth); - -// subProcess -int32_t obj_freeObj(PikaObj* self, char* subObjectName); - -/* method */ -int32_t class_defineMethod(PikaObj* self, - char* declearation, - void (*methodPtr)(PikaObj* self, Args* args)); - -void obj_runNoRes(PikaObj* slef, char* cmd); -void obj_run(PikaObj* self, char* cmd); -Args* obj_runDirect(PikaObj* self, char* cmd); -int32_t obj_removeArg(PikaObj* self, char* argPath); -int32_t obj_isArgExist(PikaObj* self, char* argPath); -PikaObj* obj_getClassObjByNewFun(PikaObj* self, char* name, NewFun newClassFun); -PikaObj* newRootObj(char* name, NewFun newObjFun); - -void obj_setErrorCode(PikaObj* self, int32_t errCode); -int32_t obj_getErrorCode(PikaObj* self); -void obj_setSysOut(PikaObj* self, char* str); -char* args_getSysOut(Args* args); -void args_setErrorCode(Args* args, int32_t errCode); -int32_t args_getErrorCode(Args* args); -void args_setSysOut(Args* args, char* str); -char* obj_getSysOut(PikaObj* self); -void obj_sysPrintf(PikaObj* self, char* fmt, ...); -PikaObj* obj_getContext(PikaObj* self); -uint8_t obj_getRefArg(PikaObj* self, - char* targetArgName, - char* sourceArgPath, - Args* targetArgs); -uint8_t obj_getAnyArg(PikaObj* self, - char* targetArgName, - char* sourceArgPath, - Args* targetArgs); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/PikaObj.py b/bsp/stm32g030c8/pikascript/pikascript-core/PikaObj.py deleted file mode 100644 index ab97533ba..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/PikaObj.py +++ /dev/null @@ -1,14 +0,0 @@ -class TinyObj: - pass - - -class BaseObj(TinyObj): - pass - - -def print(val: any): - pass - - -def set(argPath: str, val: any): - pass diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/PikaWhile.c b/bsp/stm32g030c8/pikascript/pikascript-core/PikaWhile.c deleted file mode 100644 index de5054629..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/PikaWhile.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include -#include "PikaBlock.h" -#include "PikaObj.h" -#include "dataArgs.h" -#include "dataMemory.h" -#include "dataString.h" -#include "dataStrs.h" - -void while_setAssert(PikaObj* self, char* line) { - Args* buffs = New_strBuff(); - char* assert = strsRemovePrefix(buffs, line, "while "); - assert = strsGetFirstToken(buffs, assert, ':'); - block_setAssert(self, assert); - block_setMode(self, "while"); - args_deinit(buffs); -} - -void while_pushLine(PikaObj* self, char* line) { - Args* buffs = New_strBuff(); - char* bodyLine = strsRemovePrefix(buffs, line, " "); - block_pushLine(self, bodyLine); - goto exit; -exit: - args_deinit(buffs); - return; -} - -void while_run(PikaObj* self) { - Args* buffs = New_strBuff(); - char* body = strsCopy(buffs, block_getBody(self)); - uint16_t lineSize = block_getLineSize(self); - while (block_checkAssert(self)) { - PikaObj* host = obj_getContext(self); - for (int i = 0; i < lineSize; i++) { - char* line = block_popLine(self); - obj_run(host, line); - } - block_setBody(self, body); - } -exit: - args_deinit(buffs); -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/PikaWhile.h b/bsp/stm32g030c8/pikascript/pikascript-core/PikaWhile.h deleted file mode 100644 index 0c9c75e36..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/PikaWhile.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef _pikaWhile__H -#define _pikaWhile__H -#include "PikaObj.h" - -void while_setAssert(PikaObj* self, char* line); -void while_pushLine(PikaObj* self, char* line); -void while_run(PikaObj* self); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/README.md b/bsp/stm32g030c8/pikascript/pikascript-core/README.md deleted file mode 100644 index ea47272db..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/README.md +++ /dev/null @@ -1 +0,0 @@ -# PikaScript 运行时内核 diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/TinyObj.c b/bsp/stm32g030c8/pikascript/pikascript-core/TinyObj.c deleted file mode 100644 index fdd824a1d..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/TinyObj.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "PikaObj.h" - -void _UpdateHandle(PikaObj* self) { - // override the handle function here -} - -void _beforDinit(PikaObj* self) { - /* override in user code */ -} - -PikaObj* New_TinyObj(Args* args) { - PikaObj* self = pikaMalloc(sizeof(PikaObj)); - - /* List */ - self->attributeList = New_args(NULL); - - /* attribute */ - obj_setPtr(self, "_ctx", self); - obj_setStr(self, "_n", "root"); - - /* load */ - if (NULL != args) { - obj_load(self, args, "_n"); - obj_load(self, args, "_ctx"); - } - - /* hard attribute */ - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/TinyObj.h b/bsp/stm32g030c8/pikascript/pikascript-core/TinyObj.h deleted file mode 100644 index 2e5049f57..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/TinyObj.h +++ /dev/null @@ -1,10 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef __TYNYOBJ__H -#define __TYNYOBJ__H -#include "PikaObj.h" -PikaObj* New_TinyObj(Args* args); -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataArg.c b/bsp/stm32g030c8/pikascript/pikascript-core/dataArg.c deleted file mode 100644 index 353a2a179..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataArg.c +++ /dev/null @@ -1,327 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "dataArg.h" - -#include - -#include "dataArgs.h" -#include "dataMemory.h" -#include "dataString.h" -#include "stdlib.h" - -void arg_deinit(Arg* self) { - arg_freeContent(self); -} - -uint16_t arg_getTotleSize(Arg* self) { - return content_totleSize(self); -} - -uint16_t content_sizeOffset(uint8_t* self) { - const uint8_t nextLength = sizeof(uint8_t*); - return nextLength; -} - -uint16_t content_getSize(uint8_t* self) { - uint16_t size = 0; - // add 0x30 to avoid 0 - size += self[content_sizeOffset(self) + 1]; - size = (size << 8); - size += self[content_sizeOffset(self)]; - return size; -} - -void content_setNext(uint8_t* self, uint8_t* next) { - uint8_t* nextDir = self + content_nextOffset(self); - uint64_t pointerTemp = (uint64_t)next; - for (uint32_t i = 0; i < sizeof(uint8_t*); i++) { - // aboid \0 - nextDir[i] = pointerTemp; - pointerTemp = pointerTemp >> 8; - } -} - -uint8_t* content_init(char* name, - char* type, - uint8_t* content, - uint16_t size, - uint8_t* next) { - const uint8_t nextLength = sizeof(uint8_t*); - const uint8_t sizeLength = 2; - uint16_t nameSize = strGetSize(name); - uint16_t typeSize = strGetSize(type); - uint8_t* self = (uint8_t*)pikaMalloc(nextLength + sizeLength + nameSize + - 1 + size + typeSize + 1); - - uint8_t* nextDir = self; - uint8_t* sizeDir = nextDir + nextLength; - uint8_t* nameDir = sizeDir + sizeLength; - uint8_t* contentDir = nameDir + nameSize + 1; - uint8_t* typeDir = contentDir + size; - - memcpy(nameDir, name, nameSize + 1); - memcpy(typeDir, type, typeSize + 1); - sizeDir[0] = size; - sizeDir[1] = size >> 8; - if (NULL != content) { - memcpy(contentDir, content, size); - } else { - memset(contentDir, 0, size); - } - - uint64_t pointerTemp = (uint64_t)next; - for (uint32_t i = 0; i < sizeof(uint8_t*); i++) { - // aboid \0 - nextDir[i] = pointerTemp; - pointerTemp = pointerTemp >> 8; - } - - return self; -} - -uint16_t content_totleSize(uint8_t* self) { - char* name = content_getName(self); - char* type = content_getType(self); - const uint8_t sizeLenth = 2; - const uint8_t nextLength = sizeof(uint8_t*); - uint16_t size = content_getSize(self); - return size + strGetSize(name) + 1 + strGetSize(type) + 1 + sizeLenth + - nextLength; -} - -void arg_freeContent(Arg* self) { - if (NULL != self) { - content_deinit(self); - } -} - -uint8_t content_nameOffset(uint8_t* self) { - const uint8_t nextLength = sizeof(uint8_t*); - const uint8_t sizeLength = 2; - return nextLength + sizeLength; -} - -char* content_getName(uint8_t* self) { - return (char*)self + content_nameOffset(self); -} - -uint8_t* content_deinit(uint8_t* self) { - uint16_t totleSize = content_totleSize(self); - pikaFree(self, totleSize); - return 0; -} - -uint8_t* content_setContent(uint8_t* self, uint8_t* content, uint16_t size) { - if (NULL == self) { - return content_init("", "", content, size, NULL); - } - char* name = content_getName(self); - char* type = content_getType(self); - uint8_t* next = content_getNext(self); - uint8_t* newContent = content_init(name, type, content, size, next); - content_deinit(self); - return newContent; -} - -uint8_t* content_setName(uint8_t* self, char* name) { - if (NULL == self) { - return content_init(name, "", NULL, 0, NULL); - } - char* type = content_getType(self); - uint8_t* content = content_getContent(self); - uint16_t size = content_getSize(self); - uint8_t* next = content_getNext(self); - uint8_t* newContent = content_init(name, type, content, size, next); - content_deinit(self); - return newContent; -} - -uint8_t* content_setType(uint8_t* self, char* type) { - if (NULL == self) { - return content_init("", type, NULL, 0, NULL); - } - char* name = content_getName(self); - uint8_t* content = content_getContent(self); - uint16_t size = content_getSize(self); - uint8_t* next = content_getNext(self); - uint8_t* newContent = content_init(name, type, content, size, next); - content_deinit(self); - return newContent; -} - -Arg* arg_newContent(Arg* self, uint32_t size) { - uint8_t* newContent = content_init("", "", NULL, size, NULL); - arg_freeContent(self); - return newContent; -} - -Arg* arg_setContent(Arg* self, uint8_t* content, uint32_t size) { - return content_setContent(self, content, size); -} - -Arg* arg_setName(Arg* self, char* name) { - return content_setName(self, name); -} - -Arg* arg_setType(Arg* self, char* type) { - return content_setType(self, type); -} - -char* content_getType(uint8_t* self) { - return (char*)self + content_typeOffset(self); -} - -uint16_t content_contentOffset(uint8_t* self) { - const uint8_t nextLength = sizeof(uint8_t*); - const uint8_t sizeLength = 2; - char* name = content_getName(self); - return nextLength + sizeLength + strGetSize(name) + 1; -} - -uint16_t content_nextOffset(uint8_t* self) { - return 0; -} - -uint8_t* content_getNext(uint8_t* self) { - uint8_t* nextDir = self + content_nextOffset(self); - uint8_t* next = NULL; - uint64_t pointerTemp = 0; - - for (int32_t i = sizeof(uint8_t*); i > -1; i--) { - // avoid \0 - uint8_t val = nextDir[i]; - pointerTemp = (pointerTemp << 8); - pointerTemp += val; - } - next = (uint8_t*)pointerTemp; - return next; -} - -uint8_t* content_getContent(uint8_t* self) { - return self + content_contentOffset(self); -} - -uint8_t* arg_getContent(Arg* self) { - return content_getContent(self); -} - -Arg* arg_setInt(Arg* self, char* name, int64_t val) { - int64_t int64Temp = val; - uint8_t contentBuff[8]; - for (uint32_t i = 0; i < 4; i++) { - // add 0x30 to void \0 - contentBuff[i] = int64Temp; - int64Temp = int64Temp >> 8; - } - return content_init(name, "int", contentBuff, 4, NULL); -} - -Arg* arg_setFloat(Arg* self, char* name, float val) { - uint8_t contentBuff[4]; - uint8_t* valPtr = (uint8_t*)&val; - for (uint32_t i = 0; i < 4; i++) { - // add 0x30 to void \0 - contentBuff[i] = valPtr[i]; - } - return content_init(name, "float", contentBuff, 4, NULL); -} - -float arg_getFloat(Arg* self) { - if (NULL == arg_getContent(self)) { - return -999.999; - } - - float valOut = 0; - uint8_t* valOutPtr = (uint8_t*)(&valOut); - uint8_t* valPtr = arg_getContent(self); - for (uint32_t i = 0; i < 4; i++) { - valOutPtr[i] = valPtr[i]; - } - return valOut; -} - -Arg* arg_setPtr(Arg* self, char* name, char* type, void* pointer) { - uint64_t pointerTemp = (uint64_t)pointer; - uint8_t contentBuff[8]; - for (uint32_t i = 0; i < sizeof(uint8_t*); i++) { - // aboid \0 - contentBuff[i] = pointerTemp; - pointerTemp = pointerTemp >> 8; - } - return content_init(name, type, contentBuff, sizeof(uint8_t*), NULL); -} - -Arg* arg_setStr(Arg* self, char* name, char* string) { - return content_init(name, "str", (uint8_t*)string, strGetSize(string) + 1, - NULL); -} - -int64_t arg_getInt(Arg* self) { - if (NULL == arg_getContent(self)) { - return -999999; - } - int64_t int64Temp = 0; - for (int32_t i = 3; i > -1; i--) { - // add 0x30 to avoid 0 - int64Temp = (int64Temp << 8); - int64Temp += arg_getContent(self)[i]; - } - return int64Temp; -} - -void* arg_getPtr(Arg* self) { - void* pointer = NULL; - uint64_t pointerTemp = 0; - if (NULL == arg_getContent(self)) { - return NULL; - } - uint8_t* content = arg_getContent(self); - for (int32_t i = sizeof(uint8_t*) - 1; i > -1; i--) { - // avoid \0 - uint8_t val = content[i]; - pointerTemp = (pointerTemp << 8); - pointerTemp += val; - } - pointer = (void*)pointerTemp; - return pointer; -} -char* arg_getStr(Arg* self) { - return (char*)arg_getContent(self); -} - -uint16_t content_typeOffset(uint8_t* self) { - const uint8_t nextLength = sizeof(uint8_t*); - const uint8_t sizeLength = 2; - uint16_t size = content_getSize(self); - char* name = content_getName(self); - uint16_t nameSize = strGetSize(name); - return nextLength + sizeLength + nameSize + 1 + size; -} - -char* arg_getName(Arg* self) { - return content_getName(self); -} - -char* arg_getType(Arg* self) { - return content_getType(self); -} - -uint16_t arg_getContentSize(Arg* self) { - return content_getSize(self); -} - -Arg* New_arg(void* voidPointer) { - return NULL; -} - -Arg* arg_copy(Arg* argToBeCopy) { - Arg* argCopied = New_arg(NULL); - argCopied = arg_setContent(argCopied, arg_getContent(argToBeCopy), - arg_getContentSize(argToBeCopy)); - argCopied = arg_setName(argCopied, arg_getName(argToBeCopy)); - argCopied = arg_setType(argCopied, arg_getType(argToBeCopy)); - return argCopied; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataArg.h b/bsp/stm32g030c8/pikascript/pikascript-core/dataArg.h deleted file mode 100644 index abc8cae6d..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataArg.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef _arg__H -#define _arg__H -#include "dataMemory.h" - -typedef uint8_t Arg; - -uint16_t content_typeOffset(uint8_t* content); -uint16_t content_contentOffset(uint8_t* content); -uint16_t content_sizeOffset(uint8_t* self); -uint16_t content_contentOffset(uint8_t* self); -uint16_t content_nextOffset(uint8_t* self); -uint8_t content_nameOffset(uint8_t* self); - -char* content_getName(uint8_t* content); -char* content_getType(uint8_t* content); -uint8_t* content_getNext(uint8_t* self); -uint16_t content_getSize(uint8_t* self); -uint8_t* content_getContent(uint8_t* content); - -uint16_t content_totleSize(uint8_t* self); - -uint8_t* content_init(char* name, - char* type, - uint8_t* content, - uint16_t size, - uint8_t* next); -uint8_t* content_deinit(uint8_t* self); -uint8_t* content_setName(uint8_t* self, char* name); -uint8_t* content_setType(uint8_t* self, char* type); -uint8_t* content_setContent(uint8_t* self, uint8_t* content, uint16_t size); -void content_setNext(uint8_t* self, uint8_t* next); - -uint16_t arg_getTotleSize(Arg* self); -void arg_freeContent(Arg* self); - -Arg* arg_setName(Arg* self, char* name); -Arg* arg_setContent(Arg* self, uint8_t* content, uint32_t size); -Arg* arg_newContent(Arg* self, uint32_t size); -Arg* arg_setType(Arg* self, char* type); -char* arg_getName(Arg* self); -char* arg_getType(Arg* self); -uint8_t* arg_getContent(Arg* self); -uint16_t arg_getContentSize(Arg* self); - -Arg* arg_setInt(Arg* self, char* name, int64_t val); -Arg* arg_setFloat(Arg* self, char* name, float val); -Arg* arg_setPtr(Arg* self, char* name, char* type, void* pointer); -Arg* arg_setStr(Arg* self, char* name, char* string); - -int64_t arg_getInt(Arg* self); -float arg_getFloat(Arg* self); -void* arg_getPtr(Arg* self); -char* arg_getStr(Arg* self); -Arg* arg_copy(Arg* argToBeCopy); - -Arg* arg_init(Arg* self, void* voidPointer); -void arg_deinit(Arg* self); - -Arg* New_arg(void* voidPointer); -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataArgs.c b/bsp/stm32g030c8/pikascript/pikascript-core/dataArgs.c deleted file mode 100644 index d380f4156..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataArgs.c +++ /dev/null @@ -1,502 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "dataArgs.h" -#include -#include -#include -#include -#include "dataLink.h" -#include "dataMemory.h" -#include "dataString.h" -#include "dataStrs.h" - -void args_deinit(Args* self) { - link_deinit(self); -} - -int32_t args_setFloat(Args* self, char* name, float argFloat) { - Arg* argNew = New_arg(NULL); - argNew = arg_setFloat(argNew, name, argFloat); - args_setArg(self, argNew); - return 0; -} - -void* args_getPtr(Args* self, char* name) { - void* pointer = NULL; - Arg* arg = args_getArg(self, name); - if (NULL == arg) { - return NULL; - } - - pointer = arg_getPtr(arg); - return pointer; -} - -int32_t args_setPtr(Args* self, char* name, void* argPointer) { - int32_t errCode = 0; - Arg* argNew = New_arg(NULL); - argNew = arg_setPtr(argNew, name, "pointer", argPointer); - args_setArg(self, argNew); - return errCode; -} - -int32_t args_setStr(Args* self, char* name, char* strIn) { - int32_t errCode = 0; - Arg* argNew = New_arg(NULL); - argNew = arg_setStr(argNew, name, strIn); - args_setArg(self, argNew); - return errCode; -} - -void setArgDirect(Args* self, Arg* arg) { - link_addNode(self, arg); -} - -char* args_getBuff(Args* self, int32_t size) { - Arg* argNew = New_arg(NULL); - argNew = arg_newContent(argNew, size + 1); - setArgDirect(self, argNew); - return (char*)arg_getContent(argNew); -} - -char* args_getStr(Args* self, char* name) { - if (NULL == self) { - return NULL; - } - Arg* arg = args_getArg(self, name); - if (NULL == arg) { - return NULL; - } - if (NULL == arg_getContent(arg)) { - return NULL; - } - return (char*)arg_getContent(arg); -} - -int32_t args_setInt(Args* self, char* name, int64_t int64In) { - Arg* argNew = New_arg(NULL); - argNew = arg_setInt(argNew, name, int64In); - args_setArg(self, argNew); - return 0; -} - -int64_t args_getInt(Args* self, char* name) { - Arg* arg = args_getArg(self, name); - if (NULL == arg) { - return -999999999; - } - return arg_getInt(arg); -} - -int32_t args_getSize(Args* self) { - return link_getSize(self); -} - -char* args_getType(Args* self, char* name) { - Arg* arg = NULL; - arg = args_getArg(self, name); - if (NULL == arg) { - return NULL; - } - return arg_getType(arg); -} - -float args_getFloat(Args* self, char* name) { - Arg* arg = args_getArg(self, name); - if (NULL == arg) { - return -999999999.0; - } - return arg_getFloat(arg); -} - -int32_t args_copyArg(Args* self, Arg* argToBeCopy) { - if (NULL == argToBeCopy) { - return 1; - } - Arg* argCopied = arg_copy(argToBeCopy); - args_setArg(self, argCopied); - - return 0; -} - -int32_t args_copyArgByName(Args* self, char* name, Args* directArgs) { - Arg* argToBeCopy = args_getArg(self, name); - args_copyArg(directArgs, argToBeCopy); - return 0; -} - -int32_t args_isArgExist(Args* self, char* name) { - if (NULL == name) { - return 0; - } - if (NULL != args_getArg(self, name)) { - return 1; - } - return 0; -} - -int32_t updateArg(Args* self, Arg* argNew) { - LinkNode* nodeToUpdate = NULL; - LinkNode* nodeNow = self->firstNode; - LinkNode* priorNode = NULL; - char* name = arg_getName(argNew); - while (1) { - if (strEqu(content_getName(nodeNow), name)) { - nodeToUpdate = nodeNow; - break; - } - if (content_getNext(nodeNow) == NULL) { - // error, node no found - goto exit; - } - priorNode = nodeNow; - nodeNow = content_getNext(nodeNow); - } - - nodeToUpdate = arg_setContent(nodeToUpdate, arg_getContent(argNew), - arg_getContentSize(argNew)); - - // update privior link, because arg_getContent would free origin pointer - if (NULL == priorNode) { - self->firstNode = nodeToUpdate; - goto exit; - } - - content_setNext(priorNode, nodeToUpdate); - goto exit; -exit: - arg_deinit(argNew); - return 0; -} - -int32_t args_setArg(Args* self, Arg* arg) { - char* name = arg_getName(arg); - if (!args_isArgExist(self, name)) { - setArgDirect(self, arg); - return 0; - } - updateArg(self, arg); - return 0; -} - -LinkNode* args_getNode(Args* self, char* name) { - LinkNode* nodeNow = self->firstNode; - if (NULL == nodeNow) { - return NULL; - } - while (1) { - Arg* arg = nodeNow; - char* thisName = arg_getName(arg); - if (strEqu(name, thisName)) { - return nodeNow; - } - if (NULL == content_getNext(nodeNow)) { - return NULL; - } - nodeNow = content_getNext(nodeNow); - } -} - -Arg* args_getArg(Args* self, char* name) { - LinkNode* node = args_getNode(self, name); - if (NULL == node) { - return NULL; - } - return node; -} - -void args_bind(Args* self, char* type, char* name, void* pointer) { - Args* buffs = New_strBuff(); - char* typeWithBind = strsAppend(buffs, "_bind-", type); - Arg* argNew = New_arg(NULL); - argNew = arg_setPtr(argNew, name, typeWithBind, pointer); - args_setArg(self, argNew); - args_deinit(buffs); - return; -} - -void args_bindInt(Args* self, char* name, int32_t* intPtr) { - args_bind(self, "int", name, intPtr); -} - -void args_bindFloat(Args* self, char* name, float* floatPtr) { - args_bind(self, "float", name, floatPtr); -} - -void args_bindStr(Args* self, char* name, char** stringPtr) { - args_bind(self, "str", name, stringPtr); -} - -char* getPrintSring(Args* self, char* name, char* valString) { - Args* buffs = New_strBuff(); - char* printName = strsFormat(buffs, 128, "[printBuff]%s", name); - char* printString = strsCopy(buffs, valString); - args_setStr(self, printName, printString); - char* res = args_getStr(self, printName); - args_deinit(buffs); - return res; -} - -char* getPrintStringFromInt(Args* self, char* name, int32_t val) { - Args* buffs = New_strBuff(); - char* res = NULL; - char* valString = strsFormat(buffs, 32, "%d", val); - res = getPrintSring(self, name, valString); - args_deinit(buffs); - return res; -} - -char* getPrintStringFromFloat(Args* self, char* name, float val) { - Args* buffs = New_strBuff(); - char* res = NULL; - char* valString = strsFormat(buffs, 32, "%f", val); - res = getPrintSring(self, name, valString); - args_deinit(buffs); - return res; -} - -char* getPrintStringFromPtr(Args* self, char* name, void* val) { - Args* buffs = New_strBuff(); - char* res = NULL; - uint64_t intVal = (uint64_t)val; - char* valString = strsFormat(buffs, 32, "0x%llx", intVal); - res = getPrintSring(self, name, valString); - args_deinit(buffs); - return res; -} - -char* args_print(Args* self, char* name) { - char* res = NULL; - char* type = args_getType(self, name); - Args* buffs = New_strBuff(); - if (NULL == type) { - /* can not get arg */ - res = NULL; - goto exit; - } - - if (strEqu(type, "int")) { - int32_t val = args_getInt(self, name); - res = getPrintStringFromInt(self, name, val); - goto exit; - } - - if (strEqu(type, "float")) { - float val = args_getFloat(self, name); - res = getPrintStringFromFloat(self, name, val); - goto exit; - } - - if (strEqu(type, "str")) { - res = args_getStr(self, name); - goto exit; - } - - if (strEqu(type, "pointer")) { - void* val = args_getPtr(self, name); - res = getPrintStringFromPtr(self, name, val); - goto exit; - } - - char* bindTypePrefix = strsCopy(self, "_bind-"); - if (strIsStartWith(type, bindTypePrefix)) { - char* typeWithoutBind = strsRemovePrefix(buffs, type, bindTypePrefix); - if (strEqu(typeWithoutBind, "int")) { - int32_t* valPtr = args_getPtr(self, name); - int32_t val = *valPtr; - res = getPrintStringFromInt(self, name, val); - goto exit; - } - if (strEqu(typeWithoutBind, "float")) { - float* valPtr = args_getPtr(self, name); - float val = *valPtr; - res = getPrintStringFromFloat(self, name, val); - goto exit; - } - if (strEqu(typeWithoutBind, "str")) { - // the value of &string is equal to string it self - char* string = args_getPtr(self, name); - res = string; - goto exit; - } - } - /* can not match type */ - res = NULL; - goto exit; - -exit: - args_deinit(buffs); - return res; -} - -uint8_t args_setLiteral(Args* self, char* targetArgName, char* literal) { - Args* buffs = New_strBuff(); - literal = strsGetCleanCmd(buffs, literal); - uint8_t err = 0; - char* directStr = strsGetDirectStr(self, literal); - /* get direct Str ok */ - if (NULL != directStr) { - /* direct string value */ - args_setStr(self, targetArgName, directStr); - /* ok */ - err = 0; - goto exit; - } - /* match bool */ - if (strEqu(literal, "True")) { - args_setInt(self, targetArgName, 1); - err = 0; - goto exit; - } - if (strEqu(literal, "False")) { - args_setInt(self, targetArgName, 0); - err = 0; - goto exit; - } - /* match num */ - if ((literal[0] >= '0') && (literal[0] <= '9')) { - /* match float num */ - if (strIsContain(literal, '.')) { - args_setFloat(self, targetArgName, 0); - args_set(self, targetArgName, literal); - /* succeed */ - err = 0; - goto exit; - } - /* match int num */ - args_setInt(self, targetArgName, 0); - args_set(self, targetArgName, literal); - /* succeed */ - err = 0; - goto exit; - } - err = 1; - goto exit; -exit: - args_deinit(buffs); - return err; -} - -int32_t args_set(Args* self, char* name, char* valStr) { - char* type = args_getType(self, name); - Args* buffs = New_strBuff(); - int32_t err = 0; - - if (NULL == type) { - /* do not get arg */ - err = 1; - goto exit; - } - - if (strEqu("int", type)) { - int32_t val = atoi(valStr); - args_setInt(self, name, val); - // operation succeed - err = 0; - goto exit; - } - if (strEqu("float", type)) { - float val = atof(valStr); - args_setFloat(self, name, val); - // operation succeed - err = 0; - goto exit; - } - if (strEqu("str", type)) { - args_setStr(self, name, valStr); - // operation succeed - err = 0; - goto exit; - } - - char* bindTypePrefix = strsCopy(self, "_bind-"); - if (strIsStartWith(type, bindTypePrefix)) { - char* typeWithoutBind = strsRemovePrefix(buffs, type, bindTypePrefix); - if (strEqu(typeWithoutBind, "int")) { - int32_t* valPtr = args_getPtr(self, name); - int32_t val = atoi(valStr); - *valPtr = val; - // operation succeed - err = 0; - goto exit; - } - if (strEqu(typeWithoutBind, "float")) { - float* valPtr = args_getPtr(self, name); - float val = atof(valStr); - *valPtr = val; - // operation succeed - err = 0; - goto exit; - } - if (strEqu(typeWithoutBind, "str")) { - char* stringBinded = args_getPtr(self, name); - /* size add 1 to copy the '\0' */ - memcpy(stringBinded, valStr, strGetSize(valStr) + 1); - // operation succeed - err = 0; - goto exit; - } - } - /* type not match */ - err = 2; - goto exit; -exit: - args_deinit(buffs); - return err; -} - -int32_t args_setPtrWithType(Args* self, char* name, char* type, void* objPtr) { - Arg* argNew = New_arg(NULL); - argNew = arg_setPtr(argNew, name, type, objPtr); - args_setArg(self, argNew); - return 0; -} - -int32_t args_setObjectWithClass(Args* self, - char* objName, - char* className, - void* objPtr) { - Args* buffs = New_strBuff(); - char* typeWithClass = strsAppend(buffs, "_class-", className); - args_setPtrWithType(self, objName, typeWithClass, objPtr); - args_deinit(buffs); - return 0; -} - -int32_t args_foreach(Args* self, - int32_t (*eachHandle)(Arg* argEach, Args* handleArgs), - Args* handleArgs) { - LinkNode* nodeNow = self->firstNode; - while (1) { - Arg* argNow = nodeNow; - if (NULL == argNow) { - continue; - } - LinkNode* nextNode = content_getNext(nodeNow); - eachHandle(argNow, handleArgs); - - if (NULL == nextNode) { - break; - } - nodeNow = nextNode; - } - return 0; -} - -int32_t args_removeArg(Args* self, char* name) { - Arg* argNow = args_getArg(self, name); - if (NULL == argNow) { - /* can not found arg */ - return 1; - } - link_removeNode(self, argNow); - return 0; -} - -Args* New_args(Args* args) { - Args* self = New_link(NULL); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataArgs.h b/bsp/stm32g030c8/pikascript/pikascript-core/dataArgs.h deleted file mode 100644 index 9ebf8bb0f..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataArgs.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef _dataArgs__H -#define _dataArgs__H -#include "dataArg.h" -#include "dataLink.h" -#include "dataMemory.h" -#include "dataString.h" - -typedef Link Args; - -/* operation */ -void args_deinit(Args* self); -void args_init(Args* self, Args* args); -int32_t args_getSize(Args* self); -LinkNode* args_getNode(Args* self, char* name); - -Arg* args_getArgByIndex(Args* self, int32_t index); -Arg* args_getArg(Args* self, char* name); -int32_t args_removeArg(Args* self, char* name); - -int32_t args_setArg(Args* self, Arg* arg); - -int32_t args_copyArgByName(Args* self, char* name, Args* directList); -int32_t args_copyArg(Args* self, Arg* argToBeCopy); - -char* args_getType(Args* self, char* name); -int32_t args_isArgExist(Args* self, char* name); - -int32_t args_setStr(Args* self, char* name, char* strIn); -int32_t args_setStrWithDefaultName(Args* self, char* strIn); -char* args_getStr(Args* self, char* name); - -int32_t args_setFloatWithDefaultName(Args* self, float argFloat); -int32_t args_setFloat(Args* self, char* name, float argFloat); -float args_getFloat(Args* self, char* name); - -int32_t args_setPtr(Args* self, char* name, void* argPointer); -void* args_getPtr(Args* self, char* name); - -int32_t args_setInt(Args* self, char* name, int64_t int64In); -int64_t args_getInt(Args* self, char* name); - -void args_bindInt(Args* self, char* name, int32_t* intPtr); -void args_bindFloat(Args* self, char* name, float* floatPtr); -void args_bindStr(Args* self, char* name, char** stringPtr); -/* arg general opeartion */ -void args_bind(Args* self, char* type, char* name, void* pointer); -char* args_print(Args* self, char* name); - -int32_t args_set(Args* self, char* name, char* valueStr); -int32_t args_setObjectWithClass(Args* self, - char* objectName, - char* className, - void* objectPtr); -int32_t args_setPtrWithType(Args* self, - char* objName, - char* type, - void* objPtr); -int32_t args_foreach(Args* self, - int32_t (*eachHandle)(Arg* argEach, Args* handleArgs), - Args* handleArgs); - -char* args_getBuff(Args* self, int32_t size); -uint8_t args_setLiteral(Args* self, char* targetArgName, char* literal); - -Args* New_args(Args* args); -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataLink.c b/bsp/stm32g030c8/pikascript/pikascript-core/dataLink.c deleted file mode 100644 index 1cd2cb048..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataLink.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "dataLink.h" -#include "dataArg.h" -#include "dataLinkNode.h" -#include "dataMemory.h" - -void link_deinit(Link* self) { - LinkNode* nowNode = self->firstNode; - while (NULL != nowNode) { - LinkNode* nodeNext = content_getNext(nowNode); - linkNode_deinit(nowNode); - nowNode = nodeNext; - } - // DynMemPut(self->mem); - pikaFree(self, sizeof(Link)); - self = NULL; -} - -void link_addNode(Link* self, void* content) { - // old first node become new second node - LinkNode* secondNode = self->firstNode; - - self->firstNode = content; - // change the first node to new node - content_setNext(content, secondNode); -} - -void link_removeNode(Link* self, void* content) { - LinkNode* nodeToDelete = NULL; - LinkNode* nodeNow = self->firstNode; - LinkNode* priorNode = NULL; - while (1) { - if (nodeNow == content) { - nodeToDelete = nodeNow; - break; - } - if (nodeNow == NULL) { - // error, node no found - goto exit; - } - priorNode = nodeNow; - nodeNow = content_getNext(nodeNow); - } - - LinkNode* nextNode = content_getNext(nodeToDelete); - if (nodeToDelete == self->firstNode) { - self->firstNode = content_getNext(nodeToDelete); - } - - if (NULL == priorNode) { - self->firstNode = nextNode; - goto exit; - } - - content_setNext(priorNode, nextNode); - goto exit; - -// deinit the node -exit: - linkNode_deinit(nodeToDelete); - return; -} - -int32_t link_getSize(Link* self) { - LinkNode* NowNode; - int32_t size = 0; - NowNode = self->firstNode; - while (NULL != NowNode) { - size++; - NowNode = content_getNext(NowNode); - } - return size; -} - -void link_init(Link* self, void* args) { - self->firstNode = NULL; -} - -Link* New_link(void* args) { - Link* self = pikaMalloc(sizeof(Link)); - link_init(self, args); - return self; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataLink.h b/bsp/stm32g030c8/pikascript/pikascript-core/dataLink.h deleted file mode 100644 index c685bb908..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataLink.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef _link2__H -#define _link2__H -#include "dataLinkNode.h" -#include "dataMemory.h" - -typedef struct Class_link Link; -struct Class_link { - LinkNode* firstNode; -}; - -void link_deinit(Link* self); -void link_init(Link* self, void* args); -void link_addNode(Link* self, void* content); -void link_removeNode(Link* self, void* content); -LinkNode* link_getNode(Link* self, int64_t id); -int32_t link_getSize(Link* self); - -Link* New_link(void* args); -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataLinkNode.c b/bsp/stm32g030c8/pikascript/pikascript-core/dataLinkNode.c deleted file mode 100644 index 771534921..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataLinkNode.c +++ /dev/null @@ -1,20 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "dataLinkNode.h" -#include "dataArg.h" -#include "dataMemory.h" - -void linkNode_deinit(LinkNode* self) { - arg_deinit(self); -} - -void linkNode_init(LinkNode* self, void* args) { - /* attribute */ -} - -LinkNode* New_linkNode(void* args) { - return NULL; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataLinkNode.h b/bsp/stm32g030c8/pikascript/pikascript-core/dataLinkNode.h deleted file mode 100644 index 7fe0cb475..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataLinkNode.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef _linkNode__H -#define _linkNode__H -#include "dataMemory.h" -typedef uint8_t LinkNode; - -void linkNode_deinit(LinkNode* self); -void linkNode_init(LinkNode* self, void* args); - -LinkNode* New_linkNode(void* args); -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataMemory.c b/bsp/stm32g030c8/pikascript/pikascript-core/dataMemory.c deleted file mode 100644 index 343c8dac6..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataMemory.c +++ /dev/null @@ -1,44 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "dataMemory.h" -#include -#include - -PikaMemInfo pikaMemInfo = {0}; -void* pikaMalloc(uint32_t size) { - pikaMemInfo.heapUsed += size; - if (pikaMemInfo.heapUsedMax < pikaMemInfo.heapUsed) { - pikaMemInfo.heapUsedMax = pikaMemInfo.heapUsed; - } - __platformDisableIrqHandle(); - void* mem = __platformMalloc(size); - __platformEnableIrqHandle(); - if (NULL == mem) { - __platformPrintf("[error]: No heap space! Please reset the device.\r\n"); - while (1) { - } - } - return mem; -} - -void pikaFree(void* mem, uint32_t size) { - __platformDisableIrqHandle(); - __platformFree(mem); - __platformEnableIrqHandle(); - pikaMemInfo.heapUsed -= size; -} - -uint16_t pikaMemNow(void) { - return pikaMemInfo.heapUsed; -} - -uint16_t pikaMemMax(void) { - return pikaMemInfo.heapUsedMax; -} - -void pikaMemMaxReset(void) { - pikaMemInfo.heapUsedMax = 0; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataMemory.h b/bsp/stm32g030c8/pikascript/pikascript-core/dataMemory.h deleted file mode 100644 index cf1b34f54..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataMemory.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef __MEMORY_H__ -#define __MEMORY_H__ - -#include -#include -#include -#include "pikaPlatform.h" - -typedef struct { - uint32_t heapUsed; - uint32_t heapUsedMax; -} PikaMemInfo; - -void pikaFree(void* mem, uint32_t size); -void* pikaMalloc(uint32_t size); -uint16_t pikaMemNow(void); -uint16_t pikaMemMax(void); -void pikaMemMaxReset(void); -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataString.c b/bsp/stm32g030c8/pikascript/pikascript-core/dataString.c deleted file mode 100644 index 3c1453feb..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataString.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "dataString.h" -#include -#include -#include -#include - -char* strAppendWithSize_unlimited(char* strOut, char* pData, int32_t Size) { - int32_t strOut_i = strGetSize(strOut); - for (int32_t i = 0; i < Size; i++) { - strOut[strOut_i + i] = pData[i]; - } - strOut_i += Size; - // add \0 to the end of strOut - strOut[strOut_i] = 0; - - return strOut; -} - -char* strCut(char* strOut, char* strIn, char startSign, char endSign) { - int32_t Size = strGetSize(strIn); - int32_t isStart = 0; - int32_t isEnd = 0; - int32_t iOut = 0; - for (int32_t i = 0; i < Size; i++) { - if (!isStart && (strIn[i] == startSign)) { - isStart = 1; - continue; - } - if (isStart && (strIn[i] == endSign)) { - isEnd = 1; - break; - } - if (isStart) { - strOut[iOut] = strIn[i]; - iOut++; - } - } - /* add \0 */ - strOut[iOut] = 0; - if (isStart && isEnd) { - /* succeed */ - return strOut; - } - /* faild */ - return NULL; -} - -char* strDeleteChar(char* strOut, char* strIn, char ch) { - int32_t iOut = 0; - for (int32_t i = 0; i < strGetSize(strIn); i++) { - if (ch == strIn[i]) { - continue; - } - strOut[iOut] = strIn[i]; - iOut++; - } - /* add \0 */ - strOut[iOut] = 0; - return strOut; -} - -char* strDeleteEnter(char* str) { - return strDeleteChar(str, str, '\n'); -} - -char* strAppendWithSize(char* strOut, char* pData, int32_t Size) { - int32_t strOut_i = strGetSize(strOut); - for (int32_t i = 0; i < Size; i++) { - strOut[strOut_i + i] = pData[i]; - } - strOut_i += Size; - // add \0 to the end of strOut - strOut[strOut_i] = 0; - - return strOut; -} - -int32_t strCountSign(char* strIn, char sign) { - int32_t count = 0; - for (int32_t i = 0; i < strGetSize(strIn); i++) { - if (sign == strIn[i]) { - count++; - } - } - return count; -} - -int32_t strGetTokenNum(char* strIn, char sign) { - return strCountSign(strIn, sign) + 1; -} - -uint32_t strGetSize(char* pData) { - return strlen(pData); -} - -char* strAppend_unlimited(char* strOut, char* pData) { - uint32_t Size = 0; - Size = strGetSize(pData); - return strAppendWithSize_unlimited(strOut, pData, Size); -} - -char* strGetLastLine(char *strOut, char *strIn){ - int32_t size = strGetSize(strIn); - char sign = '\n'; - uint32_t beginIndex = 0; - - /* skip the latest '\n' */ - for (int32_t i = size - 2; i > -1; i--) { - if (strIn[i] == sign) { - beginIndex = i + 1; - break; - } - } - - memcpy(strOut, strIn + beginIndex, size - beginIndex); - strOut[size - beginIndex + 1] = 0; - return strOut; -} - -char* strGetLastToken(char* strOut, char* strIn, char sign) { - int32_t size = strGetSize(strIn); - int32_t isGetSign = 0; - int32_t buffSize = 0; - for (int32_t i = size - 1; i > -1; i--) { - if (strIn[i] != sign) { - strOut[size - i - 1] = strIn[i]; - buffSize++; - } - if (strIn[i] == sign) { - isGetSign = 1; - break; - } - } - int32_t i = 0; - for (i = 0; i < buffSize / 2; i++) { - char buff = strOut[i]; - strOut[i] = strOut[buffSize - i - 1]; - strOut[buffSize - i - 1] = buff; - } - strOut[buffSize] = 0; - return strOut; -} - -char* strPopToken(char* strOut, char* strIn, char sign) { - int32_t getSign = 0; - int32_t iPoped = 0; - int32_t iOut = 0; - int32_t size = strGetSize(strIn); - int32_t i = 0; - for (i = 0; i < size; i++) { - if (getSign) { - strIn[iPoped++] = strIn[i]; - continue; - } - if (strIn[i] != sign) { - strOut[iOut++] = strIn[i]; - continue; - } - if (strIn[i] == sign) { - getSign = 1; - continue; - } - } - strOut[iOut] = 0; - strIn[iPoped] = 0; - return strOut; -} - -char* strGetFirstToken(char* strOut, char* strIn, char sign) { - int32_t size = strGetSize(strIn); - for (int32_t i = 0; i < size; i++) { - if (strIn[i] != sign) { - strOut[i] = strIn[i]; - } - if (strIn[i] == sign) { - break; - } - } - return strOut; -} - -int32_t strGetToken(char* string, char** argv, char sign) { - int32_t argc = 0; - int32_t i = 0; - // arg_i point32_t to the arg operated now - int32_t arg_i = 0; - // if not found ' ', then put chars from CMD to argv_tem - int32_t char_i = 0; - for (i = 0; (i < strGetSize(string)); i++) { - if (string[i] != sign) { - argv[arg_i][char_i] = string[i]; - char_i++; - } - if (string[i] == sign) { - // write '\0' to the end of argv - argv[arg_i][char_i] = 0; - arg_i++; - char_i = 0; - } - // write '\0' to the end of last argv - argv[arg_i][char_i] = 0; - } - argc = arg_i + 1; - return argc; -} - -char* strAppend(char* strOut, char* pData) { - uint32_t Size = 0; - Size = strGetSize(pData); - return strAppendWithSize(strOut, pData, Size); -} - -int32_t strIsStartWith(char* str, char* strStart) { - if (NULL == str || NULL == strStart) { - /* input is null */ - return 0; - } - uint32_t size = strGetSize(strStart); - uint32_t CMDName_get = 1; - for (int32_t i = 0; i < size; i++) { - if (str[i] != strStart[i]) { - CMDName_get = 0; - } - } - return CMDName_get; -} - -int32_t strEqu(char* str1, char* str2) { - return !strcmp(str1, str2); -} - -char* strRemovePrefix(char* inputStr, char* prefix, char* outputStr) { - if (!strIsStartWith(inputStr, prefix)) { - return NULL; - } - - for (int32_t i = strGetSize(prefix); i < strGetSize(inputStr); i++) { - outputStr[i - strGetSize(prefix)] = inputStr[i]; - } - return outputStr; -} - -char* strClear(char* str) { - for (int32_t i = 0; i < sizeof(str); i++) { - str[i] = 0; - } - return str; -} - -int32_t strIsContain(char* str, char ch) { - for (int32_t i = 0; i < strGetSize(str); i++) { - if (str[i] == ch) { - return 1; - } - } - return 0; -} - -char* strCopy(char* strBuff, char* strIn) { - memcpy(strBuff, strIn, strGetSize(strIn)); - return strBuff; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataString.h b/bsp/stm32g030c8/pikascript/pikascript-core/dataString.h deleted file mode 100644 index 8785a96d2..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataString.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef __MY_TEST_TOOLS_H -#define __MY_TEST_TOOLS_H -#include - -/* size */ -uint32_t strGetSize(char* pData); -/* append */ -char* strAppend(char* strOut, char* pData); -char* strAppend_unlimited(char* strOut, char* pData); -char* strAppendWithSize(char* strOut, char* pData, int32_t Size); -/* cut */ -char* strCut(char* strOut, char* strIn, char startSign, char endSign); -/* assert */ -int32_t strIsStartWith(char* str, char* strStart); -int32_t strEqu(char* str1, char* str2); -/* delete */ -char* strDeleteEnter(char* str); -char* strDeleteChar(char* strOut, char* strIn, char ch); -/* prefix */ -char* strRemovePrefix(char* inputStr, char* prefix, char* outputStr); -/* token */ -int32_t strGetToken(char* string, char** argv, char sign); -char* strPopToken(char* strOut, char* strIn, char sign); -int32_t strCountSign(char* strIn, char sign); -int32_t strGetTokenNum(char* strIn, char sign); -char* strGetFirstToken(char* strOut, char* strIn, char sign); -char* strGetLastToken(char* strOut, char* strIn, char sign); -char* strClear(char* str); -int32_t strIsContain(char* str, char ch); -char* strCopy(char* strBuff, char* strIn); -char* strGetLastLine(char *strOut, char *strIn); - -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataStrs.c b/bsp/stm32g030c8/pikascript/pikascript-core/dataStrs.c deleted file mode 100644 index 98c240d6f..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataStrs.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "dataStrs.h" -#include -#include -#include "dataString.h" - -Args* New_strBuff(void) { - return New_args(NULL); -} - -char* strsRemovePrefix(Args* buffs, char* inputStr, char* prefix) { - int32_t size = strGetSize(inputStr); - char* buff = args_getBuff(buffs, size); - return strRemovePrefix(inputStr, prefix, buff); -} - -char* strsGetDirectStr(Args* buffs, char* argPath) { - char* directStr = NULL; - directStr = strsCut(buffs, argPath, '"', '"'); - if (NULL != directStr) { - return directStr; - } - directStr = strsCut(buffs, argPath, '\'', '\''); - if (NULL != directStr) { - return directStr; - } - return NULL; -} - -char* strsAppend(Args* buffs, char* strOrigin, char* strToAppend) { - int32_t size = strGetSize(strOrigin) + strGetSize(strToAppend); - char* buff = args_getBuff(buffs, size); - char* strOut = strCopy(buff, strOrigin); - strAppend(strOut, strToAppend); - return strOut; -} - -char* strsGetLastToken(Args* buffs, char* argPath, char sign) { - int32_t size = strGetSize(argPath); - char* buff = args_getBuff(buffs, size); - return strGetLastToken(buff, argPath, sign); -} - -char* strsCut(Args* buffs, char* strIn, char startSign, char endSign) { - int32_t size = strGetSize(strIn); - char* buff = args_getBuff(buffs, size); - return strCut(buff, strIn, startSign, endSign); -} - -char* strsDeleteChar(Args* buffs, char* strIn, char ch) { - int32_t size = strGetSize(strIn); - return strDeleteChar(args_getBuff(buffs, size), strIn, ch); -} - -char* strsGetFirstToken(Args* buffs, char* strIn, char sign) { - int32_t size = strGetSize(strIn); - return strGetFirstToken(args_getBuff(buffs, size), strIn, sign); -} - -char* strsPopToken(Args* buffs, char* tokens, char sign) { - int32_t size = strGetSize(tokens); - char* buff = args_getBuff(buffs, size); - return strPopToken(buff, tokens, sign); -} - -char* strsCopy(Args* buffs, char* source) { - int32_t size = strGetSize(source); - char* buff = args_getBuff(buffs, size); - return strCopy(buff, source); -} - -char* strsFormat(Args* buffs, uint16_t buffSize, const char* fmt, ...) { - va_list args; - va_start(args, fmt); - char* res = args_getBuff(buffs, buffSize); - vsnprintf(res, buffSize, fmt, args); - va_end(args); - return res; -} - -char* strsGetCleanCmd(Args* buffs, char* cmd) { - int32_t size = strGetSize(cmd); - char* strOut = args_getBuff(buffs, size); - int32_t iOut = 0; - char delChar = ' '; - int32_t isInStr = 0; - for (int32_t i = 0; i < strGetSize(cmd); i++) { - if ('\'' == cmd[i] || '\"' == cmd[i]) { - isInStr = !isInStr; - } - if ((delChar == cmd[i]) && (!isInStr)) { - /* do not load char */ - continue; - } - strOut[iOut] = cmd[i]; - iOut++; - } - /* add \0 */ - strOut[iOut] = 0; - return strOut; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/dataStrs.h b/bsp/stm32g030c8/pikascript/pikascript-core/dataStrs.h deleted file mode 100644 index 64da50727..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/dataStrs.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef __STR_ARGS__H -#define __STR_ARGS__H -#include "dataArgs.h" -Args* New_strBuff(void); -char* strsGetFirstToken(Args* buffs, char* strIn, char sign); -char* strsGetLastToken(Args* buffs, char* arg_Path, char sign); -char* strsPopToken(Args* buffs, char* tokens, char sign); -char* strsCopy(Args* buffs, char* source); -char* strsDeleteChar(Args* buff, char* strIn, char ch); -char* strsCut(Args* buffs, char* strIn, char startSign, char endSign); -char* strsRemovePrefix(Args* buffs, char* inputStr, char* prefix); -char* strsAppend(Args* buffs, char* strOrigin, char* strAppend); -char* strsFormat(Args* buffs, uint16_t buffSize, const char* fmt, ...); -char* strsGetDirectStr(Args* buffs, char* argPath); -char* strsGetCleanCmd(Args* buffs, char* cmd); -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/method.c b/bsp/stm32g030c8/pikascript/pikascript-core/method.c deleted file mode 100644 index 6cfa6f9f7..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/method.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#include "PikaObj.h" -#include "dataArgs.h" - -void method_returnStr(Args* args, char* val) { - args_setStr(args, "return", val); -} -void method_returnInt(Args* args, int32_t val) { - args_setInt(args, "return", val); -} -void method_returnFloat(Args* args, float val) { - args_setFloat(args, "return", val); -} -void method_returnPtr(Args* args, void* val) { - args_setPtr(args, "return", val); -} - -int32_t method_getInt(Args* args, char* argName) { - return args_getInt(args, argName); -} -float method_getFloat(Args* args, char* argName) { - return args_getFloat(args, argName); -} -char* method_getStr(Args* args, char* argName) { - return args_getStr(args, argName); -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/method.h b/bsp/stm32g030c8/pikascript/pikascript-core/method.h deleted file mode 100644 index 1de6c5e46..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/method.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - Author: lyon - Tencent QQ: 645275593 -*/ - -#ifndef METHOD__H -#define METHOD__H -#include "dataArgs.h" -void method_returnStr(Args* args, char* val); -void method_returnInt(Args* args, int32_t val); -void method_returnFloat(Args* args, float val); -void method_returnPtr(Args* args, void* val); -int32_t method_getInt(Args* args, char* argName); -float method_getFloat(Args* args, char* argName); -char* method_getStr(Args* args, char* argName); -#endif diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/pikaPlatform.c b/bsp/stm32g030c8/pikascript/pikascript-core/pikaPlatform.c deleted file mode 100644 index d700851a8..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/pikaPlatform.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "pikaPlatform.h" -#include -#include -#include -#include - -PIKA_WEAK void __platformDisableIrqHandle() { - /* disable irq to support thread */ -} - -PIKA_WEAK void __platformEnableIrqHandle() { - /* disable irq to support thread */ -} - -PIKA_WEAK void* __platformMalloc(size_t size) { - return malloc(size); -} - -PIKA_WEAK void __platformFree(void* ptr) { - return free(ptr); -} - -PIKA_WEAK void __platformPrintf(char* fmt, ...) { - va_list args; - va_start(args, fmt); - char sysOut[128] = {0}; - vprintf(fmt, args); - va_end(args); -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-core/pikaPlatform.h b/bsp/stm32g030c8/pikascript/pikascript-core/pikaPlatform.h deleted file mode 100644 index 02517b9b8..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-core/pikaPlatform.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef __PIKA_PALTFORM__H -#define __PIKA_PALTFORM__H -#include - -#if defined(__CC_ARM) || defined(__CLANG_ARM) /* ARM Compiler */ -#define PIKA_WEAK __attribute__((weak)) -#elif defined(__IAR_SYSTEMS_ICC__) /* for IAR Compiler */ -#define PIKA_WEAK __weak -#elif defined(__GNUC__) /* GNU GCC Compiler */ -#define PIKA_WEAK __attribute__((weak)) -#endif - -void __platformPrintf(char* fmt, ...); -void* __platformMalloc(size_t size); -void __platformFree(void* ptr); -void __platformEnableIrqHandle(); -void __platformDisableIrqHandle(); - -#endif \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/PikaPiZero.py b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/PikaPiZero.py deleted file mode 100644 index 64e6c69fb..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/PikaPiZero.py +++ /dev/null @@ -1,21 +0,0 @@ -from PikaObj import * -import PikaStdLib -import STM32 - -class RGB(PikaStdLib.SysObj): - pin = STM32.GPIO() - def init(): - pass - def enable(): - pass - def red(): - pass - def green(): - pass - def blue(): - pass - def white(): - pass - def flow(): - pass - diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/PikaPiZero_RGB.c b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/PikaPiZero_RGB.c deleted file mode 100644 index f2bcf8c98..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/PikaPiZero_RGB.c +++ /dev/null @@ -1,95 +0,0 @@ -#include "PikaPiZero_RGB.h" -#include -#include "BaseObj.h" -#include "RGB_ASM.h" -#include "STM32_common.h" -#include "dataStrs.h" - -void RGB_reset() { - GPIOB->BRR = GPIO_PIN_12; // reset - delay_us(50); -} - -#define RED 0x000800 -#define GREEN 0x080000 -#define BLUE 0x000008 -#define WHITE 0x080808 -#define CUTDOWN 0x000000 - -void RGB_setVoid() { - __asm("nop"); -} - -void PikaPiZero_RGB_enable(PikaObj* self) { - obj_run(self, "pin.init()"); - obj_run(self, "pin.setPin('PB12')"); - obj_run(self, "pin.setMode('out')"); - obj_run(self, "pin.enable()"); -} -void PikaPiZero_RGB_init(PikaObj* self) {} - -void PikaPiZero_RGB_red(PikaObj* self) { - RGB_set(RED); - RGB_set(RED); - RGB_set(RED); - RGB_set(RED); -} - -void PikaPiZero_RGB_blue(PikaObj* self) { - RGB_set(BLUE); - RGB_set(BLUE); - RGB_set(BLUE); - RGB_set(BLUE); -} - -void PikaPiZero_RGB_green(PikaObj* self) { - RGB_set(GREEN); - RGB_set(GREEN); - RGB_set(GREEN); - RGB_set(GREEN); -} - -void PikaPiZero_RGB_white(PikaObj* self) { - RGB_set(WHITE); - RGB_set(WHITE); - RGB_set(WHITE); - RGB_set(WHITE); -} - -void PikaPiZero_RGB_flow(PikaObj* self) { - if (!obj_isArgExist(self, "flowState")) { - obj_setInt(self, "flowState", 0); - } - int flowState = obj_getInt(self, "flowState"); - if (0 == flowState) { - RGB_set(RED); - RGB_set(BLUE); - RGB_set(GREEN); - RGB_set(WHITE); - goto exit; - } - if (1 == flowState) { - RGB_set(BLUE); - RGB_set(GREEN); - RGB_set(WHITE); - RGB_set(RED); - goto exit; - } - if (2 == flowState) { - RGB_set(GREEN); - RGB_set(WHITE); - RGB_set(RED); - RGB_set(BLUE); - goto exit; - } - if (3 == flowState) { - RGB_set(WHITE); - RGB_set(RED); - RGB_set(BLUE); - RGB_set(GREEN); - goto exit; - } - -exit: - obj_setInt(self, "flowState", (flowState + 1) % 4); -} \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/RGB_ASM.c b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/RGB_ASM.c deleted file mode 100644 index 774cb37d5..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/RGB_ASM.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "RGB_ASM.h" -#include "STM32_common.h" - -static void RGB_setUp() { - GPIOB->BSRR = GPIO_PIN_12; // set - int i; - i++; - i++; - i++; - i++; - i++; - i++; - i++; - i++; - GPIOB->BRR = GPIO_PIN_12; // reset -} - -static void RGB_setDown() { - GPIOB->BSRR = GPIO_PIN_12; // set - int i; - i++; - i++; - i++; - GPIOB->BRR = GPIO_PIN_12; -} - -void RGB_set(uint32_t G8R8B8) { - int i; - uint8_t byte = 0; - for (i = 23; i >= 0; i--) { - byte = ((G8R8B8 >> i) & 0x01); - if (byte) { - RGB_setUp(); - } else { - RGB_setDown(); - } - } -} \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/RGB_ASM.h b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/RGB_ASM.h deleted file mode 100644 index 7f8309777..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/RGB_ASM.h +++ /dev/null @@ -1,3 +0,0 @@ -#include - -void RGB_set(uint32_t G8R8B8); \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/RGB_ASM.lib b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaPiZero/RGB_ASM.lib deleted file mode 100644 index fa5b0e35e4752cdb6a11c2f456d6d24daa168456..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4380 zcmbVQYiJ}{6+XABtGko#^dy-_GLMbD!{~-_rqbzTl1yB)NvAWhC&?ys64+gP==7tK zl+!P|E7=}cb=Fz%0m{rTXOV>!{ITi}10sSC9K|2{%M}J$P;eEN_(xO?r$gT6d-#vBf+*8$g^66Z?uszi|6g^5YMQzFIH5wfrlK~r@L?kfQ(({RI!*Zy; zmCxoHWwYvm4v&q*hp&&v$FE1DD#~yyHZ}&F(fEjmw$b_7xy2hoFkFiS4Z7e`_k~@_ z7uPl75g1ZqTc#3-sWFUwMw$tIa>U(eI;` zK@3LyUzl>%@j0SLd^mE_&?DV_=OaC0y^lycL#dN`WHR)z5Rra~^vF~w1krZ_b|Rzg zHi-NuMJR+wh=DFdrcSalf#~2hH@ZUzp49myv~ie2j28+`K@6K%yw^Y7-&*Ubv(KC* z>M}_43_LF~dPF^ObPDeK%eZkLZvgq+hZ?4FS0l1L&P*G|<+~W-8T}hz0nPVuFe8P_ zdCb#J2>%sL7l9wa@M{ds5EOVzDt_S${9Y;n5e)20B`CsyKTD-UbO+v*N~bs#_?uKh zqCfBtsf5LazyXv$VQ5_<8t6j??xGPfNWtH*`471K3PVimKLZQ+Iyj*7uefLw(lH?z za4YpD2i+QkK|kN6JqX`$CB}$o4}wdqJ@F#0(0r?`4SWVyI)On+3~?*QRv-N2M*BIs z<-g?mC)wZI_MdY7`ZBDBPx~U+CWe^Op92eGfH)~8UVw>#B+XXKwQ9wxIFr$t^iq^n zyJXd)V2;T?OdZ!w`-0fUM<=Ap%r*m z>=&$hHN!n(W_8Id(ClPpyo3tfaL`ve|ij zy(TTm>WdYcpGZ$6CQ##?L;j9q9cES7&eh$tCXf~VpW8jdk1l8B@-~S{h_i7scAbm@ zw!>;(Eyrr5od)^Cfu$gIhzQ{vYp1l+)F=AIS#eGb_%G5&1Q!`^rwBmk7Ss)P0P^9) zikBkcF6jLjlDKRVk>FRv=e0xx4vv?!2q6*i9kE^UY#XRLAN>FtI{QB(UCg);F+_4Q zvtZe!?C!M;QsFVXIP>g$CSg}HrkSxTh0;#Z;_^z??Ol}1(CpG`YIP`S?b-!vXmt&L zOC$05ShG2lIt)InqW@ltL=C5i=VNYjChaU`Y@ zEf^hs)95h`!!&yRTgC-wXHDZnH;u?mBkUi7+68mRg3%Q-jBTS|Zz9&eX$ZgGVQSc7 z(FQ$j^mN`c{IRVT8Qu2`G33{4n_5r}(|bfaP{wTCbYnO*l`irId*q{c54i8hp*e&6G-dHh=*|Gvk6?(yGx{Er^zS0m&7i#gvX zHiLDv36~Fe{EEjXnB%?^p1$aDe(oCXJMZZwk2gJj&*NY6IF@tQUouCWn?L+>ye{ly7OniwRyLQ<*R5SL z(MBCI3)ONNuR=2GR>?$fGOeavY`RWUz5rYwhaXxvGUqsTJHO*tjn?cId>yYkwzRZ{ zQ-42byi?u-E^RFUyRun*KLqz(^d5|swNiB~bN<=&s|_btxUD8xvMcDge9Ns>HtV^v zrSwA+c{{m0nTQ5tib3ec}TlTd0}w?C_y73}p!==> z=ep%H47}Rsz?tr1uwCXX*ByXO#d`xm9LIS0aCdto>tDlA^ZNpHu4_pW@2fDVczc*E z^W)aVag6tA3^l*Uo?UiViFXHf74H!y^L);a?Glea!PWeJ2mK0$B#FnpM#cMuk{@?+ ziT4x8YJU9n%InH*FY$hO4DT%^KOFTo9_PkG68Ex4QURB~?p7}s99$If3uL7Cpu#f3w;8i3DbQXD> z_PC7u3lieKC`rcgZz5$nJ;g<*ko0k_VX2yQaon0zz-8QN2vTPEONe_;iIdN*2SMun z#+3WzzApFAIEMEactvFaDe_09ipT$%U>x2*ey>WrQN+o!3^Prj;5T4n9NsgI>&EyG DD0@J# diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDeivce_GPIO.c b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDeivce_GPIO.c deleted file mode 100644 index 46847842c..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDeivce_GPIO.c +++ /dev/null @@ -1,80 +0,0 @@ -#include "BaseObj.h" -#include "PikaStdDevice_GPIO.h" - -void PikaStdDevice_GPIO_init(PikaObj* self) { - obj_setInt(self, "isEnable", 0); - obj_setStr(self, "pin", "PA0"); - obj_setStr(self, "mode", "out"); - obj_setInt(self, "isOn", 0); -} - -void PikaStdDevice_GPIO_disable(PikaObj* self) { - obj_setInt(self, "isEnable", 0); - obj_run(self, "platformDisable()"); -} - -void PikaStdDevice_GPIO_enable(PikaObj* self) { - obj_setInt(self, "isEnable", 1); - obj_run(self, "platformEnable()"); -} - -char* PikaStdDevice_GPIO_getMode(PikaObj* self) { - return obj_getStr(self, "mode"); -} - -char* PikaStdDevice_GPIO_getPin(PikaObj* self) { - return obj_getStr(self, "pin"); -} - -void PikaStdDevice_GPIO_low(PikaObj* self) { - obj_setInt(self, "isOn", 0); - obj_run(self, "platformLow()"); -} - -void PikaStdDevice_GPIO_high(PikaObj* self) { - obj_setInt(self, "isOn", 1); - obj_run(self, "platformHigh()"); -} - -void PikaStdDevice_GPIO_setMode(PikaObj* self, char* mode) { - obj_setStr(self, "mode", mode); - obj_run(self, "platformSetMode(mode)"); -} - -void PikaStdDevice_GPIO_setPin(PikaObj* self, char* pinName) { - obj_setStr(self, "pin", pinName); -} - -void PikaStdDevice_GPIO_platformDisable(PikaObj* self) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} - -void PikaStdDevice_GPIO_platformEnable(PikaObj* self) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} -void PikaStdDevice_GPIO_platformLow(PikaObj* self) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} - -void PikaStdDevice_GPIO_platformHigh(PikaObj* self) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} - -void PikaStdDevice_GPIO_platformSetMode(PikaObj* self, char* mode) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} - -void PikaStdDevice_GPIO_platformOff(PikaObj* self) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} - -void PikaStdDevice_GPIO_platformOn(PikaObj* self) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice.py b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice.py deleted file mode 100644 index 3d39ed4c6..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice.py +++ /dev/null @@ -1,149 +0,0 @@ -from PikaObj import * - - -class GPIO(TinyObj): - def init(): - pass - - def setPin(pinName: str): - pass - - def getPin() -> str: - pass - - def setMode(mode: str): - pass - - def getMode() -> str: - pass - - def enable(): - pass - - def disable(): - pass - - def high(): - pass - - def low(): - pass - - # need be overrid - def platformHigh(): - pass - - # need override - def platformLow(): - pass - - # need override - def platformEnable(): - pass - - # need override - def platformDisable(): - pass - - # need override - def platformSetMode(mode: str): - pass - - -class Time(TinyObj): - # need override - def sleep_s(s: int): - pass - - # need override - def sleep_ms(ms: int): - pass - - -class ADC(TinyObj): - def init(): - pass - - def setPin(pin: str): - pass - - def enable(): - pass - - def read() -> float: - pass - - # need override - def platformEnable(pin: str): - pass - - # need override - def platformRead(pin: str) -> float: - pass - - -class UART(TinyObj): - def init(): - pass - - def setBaudRate(baudRate: int): - pass - - def setId(id: int): - pass - - def enable(): - pass - - def write(data: str): - pass - - def read(length: int) -> str: - pass - - # need override - def platformEnable(id: int, baudRate: int): - pass - - # need override - def platformWrite(id: int, data: str): - pass - - # need override - def platformRead(id: int, length: int) -> str: - pass - - -class PWM(TinyObj): - def init(): - pass - - def setPin(pin: str): - pass - - def setFrequency(freq: int): - pass - - def setDuty(duty: float): - pass - - def enable(): - pass - - def getFrequency() -> int: - pass - - def getDuty() -> float: - pass - - # need override - def platformEnable(pin: str, freq: int, duty: float): - pass - - # need override - def platformSetFrequency(pin: str, freq: int): - pass - - # need override - def platformSetDuty(pin: str, duty: float): - pass diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_ADC.c b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_ADC.c deleted file mode 100644 index 5b6a80d61..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_ADC.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "PikaStdDevice_ADC.h" -#include "BaseObj.h" - -void PikaStdDevice_ADC_enable(PikaObj* self) { - obj_run(self, "platformEnable(pin)"); -} - -void PikaStdDevice_ADC_init(PikaObj* self) { - obj_setStr(self, "pin", "PA0"); -} - -float PikaStdDevice_ADC_read(PikaObj* self) { - obj_run(self, "val = platformRead(pin)"); - return obj_getFloat(self, "val"); -} - -void PikaStdDevice_ADC_setPin(PikaObj* self, char* pin) { - obj_setStr(self, "pin", pin); -} - -void PikaStdDevice_ADC_platformEnable(PikaObj* self, char* pin) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} - -float PikaStdDevice_ADC_platformRead(PikaObj* self, char* pin) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); - return -1; -} \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_PWM.c b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_PWM.c deleted file mode 100644 index deb50da70..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_PWM.c +++ /dev/null @@ -1,52 +0,0 @@ -#include "PikaStdDevice_PWM.h" -#include "BaseObj.h" - -void PikaStdDevice_PWM_init(PikaObj* self) { - obj_setStr(self, "pin", "PA8"); - obj_setInt(self, "freq", 1000); - obj_setFloat(self, "duty", 0.5f); -} - -void PikaStdDevice_PWM_setPin(PikaObj* self, char* pin) { - obj_setStr(self, "pin", pin); -} - -void PikaStdDevice_PWM_setFrequency(PikaObj* self, int freq) { - obj_setInt(self, "freq", freq); - obj_run(self, "platformSetFrequency(pin, freq)"); -} - -void PikaStdDevice_PWM_setDuty(PikaObj* self, float duty) { - obj_setFloat(self, "duty", duty); - obj_run(self, "platformSetDuty(pin, duty)"); -} - -void PikaStdDevice_PWM_enable(PikaObj* self) { - obj_run(self, "platformEnable(pin, freq, duty)"); -} - -float PikaStdDevice_PWM_getDuty(PikaObj* self) { - return obj_getFloat(self, "duty"); -} - -int PikaStdDevice_PWM_getFrequency(PikaObj* self) { - return obj_getInt(self, "freq"); -} - -void PikaStdDevice_PWM_platformEnable(PikaObj* self, - float dute, - int freq, - char* pin) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} -void PikaStdDevice_PWM_platformSetDuty(PikaObj* self, float duty, char* pin) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} -void PikaStdDevice_PWM_platformSetFrequency(PikaObj* self, - int freq, - char* pin) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_Time.c b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_Time.c deleted file mode 100644 index aa1492be7..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_Time.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "PikaStdDevice_Time.h" -#include "BaseObj.h" - -void PikaStdDevice_Time_sleep_ms(PikaObj* self, int ms) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} -void PikaStdDevice_Time_sleep_s(PikaObj* self, int s) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_UART.c b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_UART.c deleted file mode 100644 index 60b51c0a9..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdDevice/PikaStdDevice_UART.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "PikaStdDevice_UART.h" -#include "BaseObj.h" - -void PikaStdDevice_UART_enable(PikaObj* self) { - obj_run(self, "platformEnable(id, baudRate)"); -} -void PikaStdDevice_UART_init(PikaObj* self) { - obj_setInt(self, "baudRate", 115200); - obj_setInt(self, "id", 1); - obj_setStr(self, "readBuff", ""); -} -char* PikaStdDevice_UART_read(PikaObj* self, int length) { - obj_setInt(self, "length", length); - obj_run(self, "readData = platformRead(id, length)"); - return obj_getStr(self, "readData"); -} -void PikaStdDevice_UART_setBaudRate(PikaObj* self, int baudRate) { - obj_setInt(self, "baudRate", baudRate); -} -void PikaStdDevice_UART_setId(PikaObj* self, int id) { - obj_setInt(self, "id", id); -} -void PikaStdDevice_UART_write(PikaObj* self, char* data) { - obj_setStr(self, "writeData", data); - obj_run(self, "platformWrite(id, writeData)"); -} - -void PikaStdDevice_UART_platformEnable(PikaObj* self, int baudRate, int id) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} -char* PikaStdDevice_UART_platformRead(PikaObj* self, int id, int length) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); - return NULL; -} -void PikaStdDevice_UART_platformWrite(PikaObj* self, char* data, int id) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] platform method need to be override."); -} \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdLib/PikaStdLib.py b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdLib/PikaStdLib.py deleted file mode 100644 index 801b6d9e7..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdLib/PikaStdLib.py +++ /dev/null @@ -1,27 +0,0 @@ -from PikaObj import * - - -class MemChecker(BaseObj): - def max(): - pass - - def now(): - pass - - def resetMax(): - pass - - -class SysObj(BaseObj): - - def type(argPath: str): - pass - - def ls(objPath: str): - pass - - def remove(argPath: str): - pass - - def new(objPath: str, classPath: str): - pass diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_MemChecker.c b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_MemChecker.c deleted file mode 100644 index b9f17f036..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_MemChecker.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "BaseObj.h" -#include "dataStrs.h" - -void PikaStdLib_MemChecker_max(PikaObj* self) { - obj_sysPrintf(self, "%0.2f kB", pikaMemMax() / 1024.0); -} - -void PikaStdLib_MemChecker_now(PikaObj* self) { - obj_sysPrintf(self, "%0.2f kB", pikaMemNow() / 1024.0); -} - -void PikaStdLib_MemChecker_resetMax(PikaObj* self) { - pikaMemMaxReset(); -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c b/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c deleted file mode 100644 index 6a61965da..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/PikaStdLib/PikaStdLib_SysObj.c +++ /dev/null @@ -1,98 +0,0 @@ -#include "BaseObj.h" -#include "dataStrs.h" - -static int32_t __foreach_listEachArg(Arg* argEach, Args* handleArgs) { - Args* buffs = handleArgs; - if (NULL == handleArgs) { - /* error: not handleArgs input */ - return 1; - } - - char* argName = strsCopy(buffs, arg_getName(argEach)); - if (strIsStartWith(argName, "[")) { - /* skip */ - return 0; - } - - char* stringOut = args_getStr(handleArgs, "stringOut"); - if (NULL == stringOut) { - // stringOut no found - return 1; - } - - stringOut = strsAppend(buffs, stringOut, argName); - stringOut = strsAppend(buffs, stringOut, " "); - args_setStr(handleArgs, "stringOut", stringOut); - return 0; -} - -void PikaStdLib_SysObj_ls(PikaObj* self, char* objPath) { - obj_setErrorCode(self, 0); - Args* args = New_args(NULL); - args_setStr(args, "stringOut", ""); - obj_setSysOut(self, ""); - if (NULL == objPath) { - /* no input obj path, use current obj */ - args_foreach(self->attributeList, __foreach_listEachArg, args); - obj_setSysOut(self, args_getStr(args, "stringOut")); - goto exit; - } - PikaObj* obj = obj_getObj(self, objPath, 0); - if (NULL == obj) { - /* do not find obj */ - obj_setSysOut(self, "[error] list: object no found."); - obj_setErrorCode(self, 1); - goto exit; - } - /* list args */ - args_foreach(obj->attributeList, __foreach_listEachArg, args); - obj_setSysOut(self, args_getStr(args, "stringOut")); -exit: - args_deinit(args); -} - -void PikaStdLib_SysObj_new(PikaObj* self, char* classPath, char* objPath) { - int32_t res = obj_newObj(self, objPath, classPath); - if (1 == res) { - obj_setSysOut(self, "[error] new: class not found ."); - obj_setErrorCode(self, 1); - return; - } -} - -void PikaStdLib_SysObj_remove(PikaObj* self, char* argPath) { - obj_setErrorCode(self, 0); - int32_t res = obj_removeArg(self, argPath); - if (1 == res) { - obj_setSysOut(self, "[error] del: object no found."); - obj_setErrorCode(self, 1); - return; - } - if (2 == res) { - obj_setSysOut(self, "[error] del: arg not match."); - obj_setErrorCode(self, 2); - return; - } -} - -void PikaStdLib_SysObj_type(PikaObj* self, char* argPath) { - if (NULL == argPath) { - /* no input obj path, use current obj */ - PikaObj* objHost = obj_getContext(self); - Arg* objArg = obj_getArg(objHost, obj_getStr(self, "_n")); - if (NULL == objArg) { - obj_setSysOut(self, "[error] type: arg no found."); - obj_setErrorCode(self, 1); - return; - } - obj_setSysOut(self, arg_getType(objArg)); - return; - } - Arg* arg = obj_getArg(self, argPath); - if (NULL == arg) { - obj_setSysOut(self, "[error] type: arg no found."); - obj_setErrorCode(self, 1); - return; - } - obj_setSysOut(self, arg_getType(arg)); -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32.py b/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32.py deleted file mode 100644 index 3c1c4295c..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32.py +++ /dev/null @@ -1,71 +0,0 @@ -from typing import overload -import PikaStdDevice - - -class GPIO(PikaStdDevice.GPIO): - # override - def platformHigh(): - pass - - # override - def platformLow(): - pass - - # override - def platformEnable(): - pass - - # override - def platformDisable(): - pass - - # override - def platformSetMode(mode: str): - pass - - -class Time(PikaStdDevice.Time): - # override - def sleep_s(s: int): - pass - - # override - def sleep_ms(ms: int): - pass - - -class ADC(PikaStdDevice.ADC): - # override - def platformEnable(pin: str): - pass - - # override - def platformRead(pin: str) -> float: - pass - - -class UART(PikaStdDevice.UART): - # override - def platformEnable(id: int, baudRate: int): - pass - - # override - def platformWrite(id: int, data: str): - pass - - # override - def platformRead(id: int, length: int) -> str: - pass - -class PWM(PikaStdDevice.PWM): - # override - def platformEnable(pin: str, freq: int, duty: float): - pass - - # override - def platformSetFrequency(pin: str, freq: int): - pass - - # override - def platformSetDuty(pin: str, duty: float): - pass \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_ADC.c b/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_ADC.c deleted file mode 100644 index 2abebb324..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_ADC.c +++ /dev/null @@ -1,167 +0,0 @@ -#include "STM32_ADC.h" -#include -#include "BaseObj.h" -#include "STM32_common.h" -#include "dataStrs.h" - -ADC_HandleTypeDef pika_hadc1 = {0}; - -uint16_t Get_Adc(ADC_HandleTypeDef* hadc, uint32_t ch) { - ADC_ChannelConfTypeDef ADC_ChanConf; - ADC_ChanConf.Channel = ch; - ADC_ChanConf.Rank = ADC_REGULAR_RANK_1; -#if (defined STM32G070xx) || (defined STM32G030xx) - ADC_ChanConf.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; -#endif -#ifdef STM32F103xB - ADC_ChanConf.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; -#endif - HAL_ADC_ConfigChannel(hadc, &ADC_ChanConf); - HAL_ADC_Start(hadc); - HAL_ADC_PollForConversion(hadc, 10); - return (uint16_t)HAL_ADC_GetValue(hadc); -} - -void STM32_ADC_platformEnable(PikaObj* self, char* pin) { - if (!strIsStartWith(pin, "PA")) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match adc pin."); - return; - } - -/* MSP Init */ -#if (defined STM32G070xx) || (defined STM32G030xx) - __HAL_RCC_ADC_CLK_ENABLE(); -#endif -#ifdef STM32F103xB - __HAL_RCC_ADC1_CLK_ENABLE(); -#endif - if (0 != enableClk(pin)) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio port."); - return; - } - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - GPIO_InitStruct.Pin = getGpioPin(pin); - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(getGpioPort(pin), &GPIO_InitStruct); - - /* init ADC */ - pika_hadc1.Instance = ADC1; -#if (defined STM32G070xx) || (defined STM32G030xx) - pika_hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; - pika_hadc1.Init.Resolution = ADC_RESOLUTION_12B; - pika_hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; - pika_hadc1.Init.LowPowerAutoWait = DISABLE; - pika_hadc1.Init.LowPowerAutoPowerOff = DISABLE; -#endif - pika_hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; - pika_hadc1.Init.ContinuousConvMode = DISABLE; - pika_hadc1.Init.DiscontinuousConvMode = DISABLE; - pika_hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; - pika_hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; - pika_hadc1.Init.NbrOfConversion = 1; -#if (defined STM32G070xx) || (defined STM32G030xx) - pika_hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - pika_hadc1.Init.DMAContinuousRequests = DISABLE; - pika_hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; - pika_hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5; - pika_hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5; - pika_hadc1.Init.OversamplingMode = DISABLE; - pika_hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH; -#endif - - HAL_StatusTypeDef state = HAL_ADC_Init(&pika_hadc1); - if (state != HAL_OK) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] adc init faild."); - return; - } - - /* Run the ADC calibration */ - if (HAL_ADCEx_Calibration_Start(&pika_hadc1) != HAL_OK) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] adc calibratie faild."); - return; - } -} - -uint32_t getChannel(char* pin) { - Args* buffs = New_strBuff(); - uint32_t channel = 0; - - pin = strsCopy(buffs, pin + 2); - if (strEqu(pin, "0")) { - channel = ADC_CHANNEL_0; - goto exit; - } - if (strEqu(pin, "1")) { - channel = ADC_CHANNEL_1; - goto exit; - } - if (strEqu(pin, "2")) { - channel = ADC_CHANNEL_2; - goto exit; - } - if (strEqu(pin, "3")) { - channel = ADC_CHANNEL_3; - goto exit; - } - if (strEqu(pin, "4")) { - channel = ADC_CHANNEL_4; - goto exit; - } - if (strEqu(pin, "5")) { - channel = ADC_CHANNEL_5; - goto exit; - } - if (strEqu(pin, "6")) { - channel = ADC_CHANNEL_6; - goto exit; - } - if (strEqu(pin, "7")) { - channel = ADC_CHANNEL_7; - goto exit; - } - if (strEqu(pin, "8")) { - channel = ADC_CHANNEL_8; - goto exit; - } - if (strEqu(pin, "9")) { - channel = ADC_CHANNEL_9; - goto exit; - } - if (strEqu(pin, "10")) { - channel = ADC_CHANNEL_10; - goto exit; - } - if (strEqu(pin, "11")) { - channel = ADC_CHANNEL_11; - goto exit; - } - if (strEqu(pin, "12")) { - channel = ADC_CHANNEL_12; - goto exit; - } - if (strEqu(pin, "13")) { - channel = ADC_CHANNEL_13; - goto exit; - } - if (strEqu(pin, "14")) { - channel = ADC_CHANNEL_14; - goto exit; - } - if (strEqu(pin, "15")) { - channel = ADC_CHANNEL_15; - goto exit; - } -exit: - args_deinit(buffs); - return channel; -} - -float STM32_ADC_platformRead(PikaObj* self, char* pin) { - return 3.3f * Get_Adc(&pika_hadc1, getChannel(pin)) / 4096.0f; -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_Code.c b/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_Code.c deleted file mode 100644 index 36155a785..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_Code.c +++ /dev/null @@ -1,137 +0,0 @@ -#include -#include "BaseObj.h" -#include "STM32_common.h" -#include "dataStrs.h" -#include -CodeHeap codeHeap; - -void STM32_Code_Init() { - codeHeap.size = 0; - codeHeap.content = pikaMalloc(codeHeap.size + 1); - codeHeap.ena = 0; -} - -uint8_t STM32_Code_reciveHandler(char* data, uint32_t rxSize) { - char buff[RX_BUFF_LENGTH] = {0}; - if (0 == codeHeap.ena) { - char* strLine = strGetLastLine(buff, data); - if (strIsStartWith(strLine, "import ")) { - codeHeap.reciveTime = uwTick; - codeHeap.ena = 1; - data = strLine; - rxSize = strGetSize(strLine); - } - } - if (1 == codeHeap.ena) { - codeHeap.reciveTime = uwTick; - codeHeap.oldSize = codeHeap.size; - codeHeap.size += rxSize; - codeHeap.content = realloc(codeHeap.content , codeHeap.size + 1); - memcpy(codeHeap.content + codeHeap.oldSize, data, rxSize); - codeHeap.content[codeHeap.size] = 0; - /* reciving code */ - return 1; - } - /* not work */ - return 0; -} - -uint32_t GetPage(uint32_t Addr) { - return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE; -} - -void STM32_Code_flashHandler() { - if (!codeHeap.ena){ - /* recive not activate */ - return; - } - if ( uwTick - codeHeap.reciveTime < 200 ){ - /* still reciving */ - return; - } - - /* transmite is finished */ - uint32_t FirstPage = 0, NbOfPages = 0; - uint32_t PageError = 0; - __IO uint32_t data32 = 0, MemoryProgramStatus = 0; - static FLASH_EraseInitTypeDef EraseInitStruct = {0}; - - printf("==============[Programer]==============\r\n"); - printf("[info]: Recived byte: %d\r\n", codeHeap.size); - printf("[info]: Programing... \r\n"); - HAL_FLASH_Unlock(); - /* Get the 1st page to erase */ - FirstPage = GetPage(FLASH_CODE_START_ADDR); - - /* Get the number of pages to erase from 1st page */ - NbOfPages = GetPage(FLASH_USER_END_ADDR) - FirstPage + 1; - - /* Fill EraseInit structure*/ - EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; - EraseInitStruct.Page = FirstPage; - EraseInitStruct.NbPages = NbOfPages; - printf("[info]: Erasing flash... \r\n"); - - if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) { - printf("[error]: Erase faild! \r\n"); - while (1) { - } - } - printf("[ OK ]: Erase flash ok! \r\n"); - - printf("[info]: Writing flash... \r\n"); - uint32_t baseAddress = FLASH_CODE_START_ADDR; - uint32_t writeAddress = 0; - uint64_t writeData64 = 0; - while (writeAddress < codeHeap.size + 1) { - writeData64 = 0; - for (int i = 7; i >= 0; i--) { - char ch = codeHeap.content[writeAddress + i]; - writeData64 = writeData64 << 8; - writeData64 += ch; - } - if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, - baseAddress + writeAddress, - writeData64) == HAL_OK) { - writeAddress = writeAddress + 8; - } else { - printf("[error]: Write flash faild. \r\n"); - while (1) { - } - } - } - HAL_FLASH_Lock(); - printf("[ OK ]: Write flash ok! \r\n"); - - baseAddress = FLASH_CODE_START_ADDR; - MemoryProgramStatus = 0x0; - - printf("[info]: Checking flash... \r\n"); - char* codeInFlash = (char*)baseAddress; - printf("\r\n"); - printf("----[code in flash]-----\r\n"); - printf("%s", codeInFlash); - printf("----[code in flash]-----\r\n"); - printf("\r\n"); - - if (!strEqu(codeInFlash, codeHeap.content)) { - printf("[error]: Check flash faild.\r\n"); - printf("\r\n"); - - printf("\r\n\r\n"); - printf("---------[code in heap]----------\r\n"); - printf("\r\n"); - printf("%s", codeHeap.content); - printf("\r\n\r\n"); - printf("---------[code in heap]----------\r\n"); - while (1) { - } - } - printf("[ OK ]: Checking flash ok! \r\n"); - printf("[ OK ]: Programing ok! \r\n"); - printf("[info]: Restarting... \r\n"); - printf("==============[Programer]==============\r\n"); - - printf("\r\n"); - HAL_NVIC_SystemReset(); -} \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_GPIO.c b/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_GPIO.c deleted file mode 100644 index 5eb7a0c5c..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_GPIO.c +++ /dev/null @@ -1,142 +0,0 @@ -#include "STM32_GPIO.h" -#include -#include "BaseObj.h" -#include "STM32_common.h" -#include "dataStrs.h" - -void STM32_GPIO_platformDisable(PikaObj* self) { - char* pin = obj_getStr(self, "pin"); - char* mode = obj_getStr(self, "mode"); - - GPIO_TypeDef* gpioPort = getGpioPort(pin); - - if (NULL == gpioPort) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio port."); - } - - uint16_t gpioPin = getGpioPin(pin); - - if (0 == gpioPin) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio pin."); - } - - HAL_GPIO_DeInit(gpioPort, gpioPin); -} - -void STM32_GPIO_platformEnable(PikaObj* self) { - char* pin = obj_getStr(self, "pin"); - char* mode = obj_getStr(self, "mode"); - - if (0 != enableClk(pin)) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio port."); - return; - } - - GPIO_TypeDef* gpioPort = getGpioPort(pin); - - if (NULL == gpioPort) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio port."); - } - - uint16_t gpioPin = getGpioPin(pin); - - if (0 == gpioPin) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio pin."); - } - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(gpioPort, gpioPin, GPIO_PIN_RESET); - - uint32_t pinMode = getPinMode(mode); - if (NULL == pinMode) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio mode."); - } - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - /*Configure GPIO*/ - GPIO_InitStruct.Pin = gpioPin; - GPIO_InitStruct.Mode = pinMode; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(gpioPort, &GPIO_InitStruct); -} -void STM32_GPIO_platformLow(PikaObj* self) { - char* pin = obj_getStr(self, "pin"); - GPIO_TypeDef* gpioPort = getGpioPort(pin); - - if (NULL == gpioPort) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio port."); - } - - uint16_t gpioPin = getGpioPin(pin); - - if (0 == gpioPin) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio pin."); - } - HAL_GPIO_WritePin(gpioPort, gpioPin, GPIO_PIN_RESET); -} -void STM32_GPIO_platformHigh(PikaObj* self) { - char* pin = obj_getStr(self, "pin"); - GPIO_TypeDef* gpioPort = getGpioPort(pin); - - if (NULL == gpioPort) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio port."); - } - - uint16_t gpioPin = getGpioPin(pin); - - if (0 == gpioPin) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio pin."); - } - HAL_GPIO_WritePin(gpioPort, gpioPin, GPIO_PIN_SET); -} -void STM32_GPIO_platformSetMode(PikaObj* self, char* mode) { - char* pin = obj_getStr(self, "pin"); - - if (0 != enableClk(pin)) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio port."); - return; - } - - GPIO_TypeDef* gpioPort = getGpioPort(pin); - - if (NULL == gpioPort) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio port."); - } - - uint16_t gpioPin = getGpioPin(pin); - - if (0 == gpioPin) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio pin."); - } - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(gpioPort, gpioPin, GPIO_PIN_RESET); - - uint32_t pinMode = getPinMode(mode); - if (NULL == pinMode) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] not match gpio mode."); - } - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - /*Configure GPIO*/ - GPIO_InitStruct.Pin = gpioPin; - GPIO_InitStruct.Mode = pinMode; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(gpioPort, &GPIO_InitStruct); -} \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_PWM.c b/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_PWM.c deleted file mode 100644 index 62532ac14..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_PWM.c +++ /dev/null @@ -1,366 +0,0 @@ -#include "STM32_PWM.h" -#include -#include "BaseObj.h" -#include "STM32_common.h" -#include "dataStrs.h" - -#ifdef TIM1_EXIST -TIM_HandleTypeDef pika_tim1; -#endif -#ifdef TIM2_EXIST -TIM_HandleTypeDef pika_tim2; -#endif -#ifdef TIM3_EXIST -TIM_HandleTypeDef pika_tim3; -#endif -#ifdef TIM4_EXIST -TIM_HandleTypeDef pika_tim4; -#endif -#ifdef TIM14_EXIST -TIM_HandleTypeDef pika_tim14; -#endif -#ifdef TIM16_EXIST -TIM_HandleTypeDef pika_tim16; -#endif -#ifdef TIM17_EXIST -TIM_HandleTypeDef pika_tim17; -#endif - -static TIM_HandleTypeDef* getTimHandle(char* pin) { -#ifdef TIM1_EXIST - if (strEqu("PA8", pin) || strEqu("PA9", pin) || strEqu("PA10", pin) || - strEqu("PA11", pin)) { - return &pika_tim1; - } -#endif -#ifdef TIM2_EXIST - if (strEqu("PA0", pin) || strEqu("PA1", pin) || strEqu("PA2", pin) || - strEqu("PA3", pin)) { - return &pika_tim2; - } -#endif -#ifdef TIM3_EXIST - if (strEqu("PA6", pin) || strEqu("PA7", pin) || strEqu("PB0", pin) || - strEqu("PB1", pin)) { - return &pika_tim3; - } -#endif -#ifdef TIM4_EXIST - if (strEqu("PB6", pin) || strEqu("PB7", pin) || strEqu("PB8", pin) || - strEqu("PB9", pin)) { - return &pika_tim3; - } -#endif -#ifdef TIM14_EXIST - if (strEqu("PA4", pin)) { - return &pika_tim14; - } -#endif -#ifdef TIM16_EXIST - if (strEqu("PD0", pin)) { - return &pika_tim16; - } -#endif -#ifdef TIM17_EXIST - if (strEqu("PD1", pin)) { - return &pika_tim17; - } -#endif - return NULL; -} - -static TIM_TypeDef* getTimInstance(char* pin) { -#ifdef TIM1_EXIST - if (strEqu("PA8", pin) || strEqu("PA9", pin) || strEqu("PA10", pin) || - strEqu("PA11", pin)) { - return TIM1; - } -#endif -#ifdef TIM2_EXIST - if (strEqu("PA0", pin) || strEqu("PA1", pin) || strEqu("PA2", pin) || - strEqu("PA3", pin)) { - return TIM2; - } -#endif -#ifdef TIM3_EXIST - if (strEqu("PA6", pin) || strEqu("PA7", pin) || strEqu("PB0", pin) || - strEqu("PB1", pin)) { - return TIM3; - } -#endif -#ifdef TIM4_EXIST - if (strEqu("PB6", pin) || strEqu("PB7", pin) || strEqu("PB8", pin) || - strEqu("PB9", pin)) { - return TIM4; - } -#endif -#ifdef TIM14_EXIST - if (strEqu("PA4", pin)) { - return TIM14; - } -#endif -#ifdef TIM16_EXIST - if (strEqu("PD0", pin)) { - return TIM16; - } -#endif -#ifdef TIM17_EXIST_EXIST - if (strEqu("PD1", pin)) { - return TIM17; - } -#endif - return NULL; -} - -#if (defined STM32G030xx) || (defined STM32G070xx) -static uint32_t getGPIO_AlternateForTim(TIM_TypeDef* timInstance) { -#ifdef TIM1_EXIST - if (TIM1 == timInstance) { - return GPIO_AF2_TIM1; - } -#endif -#ifdef TIM3_EXIST - if (TIM3 == timInstance) { - return GPIO_AF1_TIM3; - } -#endif -#ifdef TIM14_EXIST - if (TIM14 == timInstance) { - return GPIO_AF4_TIM14; - } -#endif -#ifdef TIM16_EXIST - if (TIM16 == timInstance) { - return GPIO_AF2_TIM16; - } -#endif -#ifdef TIM17_EXIST - if (TIM17 == timInstance) { - return GPIO_AF2_TIM17; - } -#endif - return 0; -} -#endif - -static void PWM_TimClockEnable(TIM_TypeDef* timInstance) { -#ifdef TIM1_EXIST - if (TIM1 == timInstance) { - __HAL_RCC_TIM1_CLK_ENABLE(); - return; - } -#endif -#ifdef TIM2_EXIST - if (TIM2 == timInstance) { - __HAL_RCC_TIM2_CLK_ENABLE(); - return; - } -#endif -#ifdef TIM3_EXIST - if (TIM3 == timInstance) { - __HAL_RCC_TIM3_CLK_ENABLE(); - return; - } -#endif -#ifdef TIM4_EXIST - if (TIM4 == timInstance) { - __HAL_RCC_TIM4_CLK_ENABLE(); - return; - } -#endif -#ifdef TIM14_EXIST - if (TIM14 == timInstance) { - __HAL_RCC_TIM14_CLK_ENABLE(); - return; - } -#endif -#ifdef TIM16_EXIST - if (TIM16 == timInstance) { - __HAL_RCC_TIM16_CLK_ENABLE(); - return; - } -#endif -#ifdef TIM17_EXIST - if (TIM17 == timInstance) { - __HAL_RCC_TIM17_CLK_ENABLE(); - return; - } -#endif -} - -uint8_t PWM_MspInit(char* pin) { - TIM_TypeDef* timInstance = getTimInstance(pin); - if (NULL == timInstance) { - /* this Pin do not match any PWM generator */ - return 1; - } - enableClk(pin); - GPIO_InitTypeDef GPIO_InitStruct = {0}; - GPIO_InitStruct.Pin = getGpioPin(pin); - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; -#if (defined STM32G030xx) || (defined STM32G070xx) - GPIO_InitStruct.Alternate = getGPIO_AlternateForTim(timInstance); -#endif - HAL_GPIO_Init(getGpioPort(pin), &GPIO_InitStruct); - PWM_TimClockEnable(timInstance); - return 0; -} - -uint32_t getTimChennel(char* pin) { - if (strEqu("PA8", pin) || strEqu("PA0", pin) || strEqu("PA6", pin) || - strEqu("PB6", pin) || strEqu("PA4", pin) || strEqu("PD0", pin) || - strEqu("PD1", pin)) { - return TIM_CHANNEL_1; - } - if (strEqu("PA9", pin) || strEqu("PA1", pin) || strEqu("PB7", pin) || - strEqu("PA7", pin)) { - return TIM_CHANNEL_2; - } - if (strEqu("PA10", pin) || strEqu("PA2", pin) || strEqu("PB8", pin) || - strEqu("PB0", pin)) { - return TIM_CHANNEL_3; - } - if (strEqu("PA11", pin) || strEqu("PA3", pin) || strEqu("PB9", pin) || - strEqu("PB1", pin)) { - return TIM_CHANNEL_4; - } - /* Chennel not match */ - return 99999; -} - -void STM32_PWM_platformEnable(PikaObj* self, float duty, int freq, char* pin) { - TIM_ClockConfigTypeDef sClockSourceConfig = {0}; - TIM_MasterConfigTypeDef sMasterConfig = {0}; - TIM_OC_InitTypeDef sConfigOC = {0}; - TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; - - if (0 != PWM_MspInit(pin)) { - obj_setSysOut(self, "[error]: init PWM port faild."); - obj_setErrorCode(self, 1); - return; - } - - TIM_HandleTypeDef* pika_tim = getTimHandle(pin); - if (NULL == pika_tim) { - obj_setSysOut(self, "[error]: can not found PWM hardware."); - obj_setErrorCode(self, 1); - return; - } - - pika_tim->Instance = getTimInstance(pin); -#if (defined STM32G030xx) || (defined STM32G070xx) - pika_tim->Init.Prescaler = 64 - 1; -#endif -#if (defined STM32F103xB) - pika_tim->Init.Prescaler = 72 - 1; -#endif - pika_tim->Init.CounterMode = TIM_COUNTERMODE_UP; - /* calculate period */ - pika_tim->Init.Period = (uint32_t)((float)(1000 * 1000) / (float)freq) - 1; - pika_tim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - pika_tim->Init.RepetitionCounter = 0; - pika_tim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; - - if (HAL_TIM_Base_Init(pika_tim) != HAL_OK) { - obj_setSysOut(self, "[error]: init PWM faild."); - obj_setErrorCode(self, 1); - return; - } - sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; - if (HAL_TIM_ConfigClockSource(pika_tim, &sClockSourceConfig) != HAL_OK) { - obj_setSysOut(self, "[error]: init PWM faild."); - obj_setErrorCode(self, 1); - return; - } - if (HAL_TIM_PWM_Init(pika_tim) != HAL_OK) { - obj_setSysOut(self, "[error]: init PWM faild."); - obj_setErrorCode(self, 1); - return; - } - if (HAL_TIM_OC_Init(pika_tim) != HAL_OK) { - obj_setSysOut(self, "[error]: init PWM faild."); - obj_setErrorCode(self, 1); - return; - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; -#if (defined STM32G030xx) || (defined STM32G070xx) - sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET; -#endif - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(pika_tim, &sMasterConfig) != - HAL_OK) { - obj_setSysOut(self, "[error]: init PWM faild."); - obj_setErrorCode(self, 1); - return; - } - sConfigOC.OCMode = TIM_OCMODE_PWM1; - /* calculate pulse by duty and freq */ - sConfigOC.Pulse = (uint32_t)(pika_tim->Init.Period * duty); - sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; - sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; - sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; - sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; - sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; - if (HAL_TIM_PWM_ConfigChannel(pika_tim, &sConfigOC, getTimChennel(pin)) != - HAL_OK) { - obj_setSysOut(self, "[error]: init PWM faild."); - obj_setErrorCode(self, 1); - return; - } - - sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; - sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; - sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; - sBreakDeadTimeConfig.DeadTime = 0; - sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; - sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; -#if (defined STM32G030xx) || (defined STM32G070xx) - sBreakDeadTimeConfig.BreakFilter = 0; - sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT; - sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE; - sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH; - sBreakDeadTimeConfig.Break2Filter = 0; - sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT; - sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; -#endif - if (HAL_TIMEx_ConfigBreakDeadTime(pika_tim, &sBreakDeadTimeConfig) != - HAL_OK) { - obj_setSysOut(self, "[error]: init PWM faild."); - obj_setErrorCode(self, 1); - return; - } - HAL_TIM_PWM_Start(pika_tim, getTimChennel(pin)); -} - -void STM32_PWM_platformSetDuty(PikaObj* self, float duty, char* pin) { - TIM_HandleTypeDef* pika_tim = getTimHandle(pin); - if (NULL == pika_tim) { - obj_setSysOut(self, "[error]: can not found PWM hardware."); - obj_setErrorCode(self, 1); - return; - } - /* update duty in run time */ - if (NULL != pika_tim->Instance) { - __HAL_TIM_SET_COMPARE(pika_tim, getTimChennel(pin), - (uint32_t)(pika_tim->Init.Period * duty)); - } -} - -void STM32_PWM_platformSetFrequency(PikaObj* self, int freq, char* pin) { - TIM_HandleTypeDef* pika_tim = getTimHandle(pin); - if (NULL == pika_tim) { - obj_setSysOut(self, "[error]: can not found PWM hardware."); - obj_setErrorCode(self, 1); - return; - } - /* update frequency in run time */ - if (NULL != pika_tim->Instance) { - __HAL_TIM_SET_AUTORELOAD( - pika_tim, (uint32_t)((float)(1000 * 1000) / (float)freq) - 1); - float duty = obj_getFloat(self, "duty"); - __HAL_TIM_SET_COMPARE(pika_tim, getTimChennel(pin), - (uint32_t)(pika_tim->Init.Period * duty)); - } -} diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_Time.c b/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_Time.c deleted file mode 100644 index 477c0252b..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_Time.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "STM32_Time.h" -#include -#include "BaseObj.h" - -#include "STM32_common.h" - -void STM32_Time_sleep_ms(PikaObj* self, int ms) { - HAL_Delay(ms); -} -void STM32_Time_sleep_s(PikaObj* self, int s) { - for (int i = 0; i < s; i++) { - HAL_Delay(1000); - } -} \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_UART.c b/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_UART.c deleted file mode 100644 index 0b0c5f74f..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_UART.c +++ /dev/null @@ -1,438 +0,0 @@ -#include "STM32_UART.h" -#include -#include "BaseObj.h" -#include "STM32_common.h" -#include "dataStrs.h" - -#ifdef UART1_EXIST -pika_uart_t pika_uart1; -#endif -#ifdef UART2_EXIST -pika_uart_t pika_uart2; -#endif -#ifdef UART3_EXIST -pika_uart_t pika_uart3; -#endif -#ifdef UART4_EXIST -pika_uart_t pika_uart4; -#endif - -static pika_uart_t* getPikaUart(uint8_t id) { - if (1 == id) { - return &pika_uart1; - } - if (2 == id) { - return &pika_uart2; - } -#ifdef UART3_EXIST - if (3 == id) { - return &pika_uart3; - } -#endif -#ifdef UART4_EXIST - if (4 == id) { - return &pika_uart4; - } -#endif - return NULL; -} - -static void setUartObj(uint8_t id, PikaObj* obj) { - pika_uart_t* pika_uart = getPikaUart(id); - pika_uart->obj = obj; -} - -static PikaObj* getUartObj(uint8_t id) { - pika_uart_t* pika_uart = getPikaUart(id); - if (NULL == pika_uart) { - return NULL; - } - return pika_uart->obj; -} - -static USART_TypeDef* getUartInstance(uint8_t id) { -#ifdef UART1_EXIST - if (1 == id) { - return USART1; - } -#endif -#ifdef UART2_EXIST - if (2 == id) { - return USART2; - } -#endif -#ifdef UART3_EXIST - if (3 == id) { - return USART3; - } -#endif -#ifdef UART4_EXIST - if (4 == id) { - return USART4; - } -#endif - return NULL; -} - -static uint8_t getUartId(UART_HandleTypeDef* huart) { -#ifdef UART1_EXIST - if (huart == &pika_uart1.huart) { - return 1; - } -#endif -#ifdef UART2_EXIST - if (huart == &pika_uart2.huart) { - return 2; - } -#endif -#ifdef UART3_EXIST - if (huart == &pika_uart3.huart) { - return 3; - } -#endif -#ifdef UART4_EXIST - if (huart == &pika_uart4.huart) { - return 4; - } -#endif - return 0; -} - -static UART_HandleTypeDef* getUartHandle(uint8_t id) { - pika_uart_t* pika_uart = getPikaUart(id); - if (NULL == pika_uart) { - return NULL; - } - return &(pika_uart->huart); -} - -static char* getUartRxBuff(uint8_t id) { - pika_uart_t* pika_uart = getPikaUart(id); - if (NULL == pika_uart) { - return NULL; - } - return pika_uart->rxBuff; -} - -static uint8_t USART_UART_Init(uint32_t baudRate, uint8_t id) { - uint8_t errCode = 0; - UART_HandleTypeDef* huart = getUartHandle(id); - huart->Instance = getUartInstance(id); - if (NULL == huart->Instance) { - errCode = 5; - goto exit; - } - huart->Init.BaudRate = baudRate; - huart->Init.WordLength = UART_WORDLENGTH_8B; - huart->Init.StopBits = UART_STOPBITS_1; - huart->Init.Parity = UART_PARITY_NONE; - huart->Init.Mode = UART_MODE_TX_RX; - huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; - huart->Init.OverSampling = UART_OVERSAMPLING_16; -#if (defined STM32G070xx) || (defined STM32G030xx) - huart->Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; - huart->Init.ClockPrescaler = UART_PRESCALER_DIV1; - huart->AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; -#endif - if (HAL_UART_Init(huart) != HAL_OK) { - errCode = 1; - goto exit; - } -#if (defined STM32G070xx) || (defined STM32G030xx) - if (HAL_UARTEx_SetTxFifoThreshold(huart, UART_TXFIFO_THRESHOLD_1_8) != - HAL_OK) { - errCode = 2; - goto exit; - } - if (HAL_UARTEx_SetRxFifoThreshold(huart, UART_RXFIFO_THRESHOLD_1_8) != - HAL_OK) { - errCode = 3; - goto exit; - } - if (HAL_UARTEx_DisableFifoMode(huart) != HAL_OK) { - errCode = 4; - goto exit; - } -#endif -exit: - return errCode; -} - -static void UART_MspInit(UART_HandleTypeDef* uartHandle) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; -#ifdef UART1_EXIST - if (uartHandle->Instance == USART1) { - /* USART1 clock enable */ - __HAL_RCC_USART1_CLK_ENABLE(); - - __HAL_RCC_GPIOA_CLK_ENABLE(); -/**USART1 GPIO Configuration -PA9 ------> USART1_TX -PA10 ------> USART1_RX -*/ -#if (defined STM32G070xx) || (defined STM32G030xx) - GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF1_USART1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); -#endif -#ifdef STM32F103xB - GPIO_InitStruct.Pin = GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_10; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); -#endif - /* USART1 interrupt Init */ - HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(USART1_IRQn); - } -#endif -#ifdef UART2_EXIST - if (uartHandle->Instance == USART2) { - /* USART2 clock enable */ - __HAL_RCC_USART2_CLK_ENABLE(); - - __HAL_RCC_GPIOA_CLK_ENABLE(); -/**USART2 GPIO Configuration -PA2 ------> USART2_TX -PA3 ------> USART2_RX -*/ -#if (defined STM32G070xx) || (defined STM32G030xx) - GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF1_USART2; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); -#endif -#ifdef STM32F103xB - GPIO_InitStruct.Pin = GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_3; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); -#endif - /* USART2 interrupt Init */ - HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(USART2_IRQn); - } -#endif -#ifdef UART3_EXIST - if (uartHandle->Instance == USART3) { - /* USART3 clock enable */ - __HAL_RCC_USART3_CLK_ENABLE(); - - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); -/**USART3 GPIO Configuration -PA5 ------> USART3_TX -PB0 ------> USART3_RX -*/ -#if (defined STM32G070xx) - GPIO_InitStruct.Pin = GPIO_PIN_5; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF4_USART3; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_0; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF4_USART3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); -#endif - -#ifdef STM32F103xB - /**USART3 GPIO Configuration - PB10 ------> USART3_TX - PB11 ------> USART3_RX - */ - GPIO_InitStruct.Pin = GPIO_PIN_10; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_11; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); -#endif - - /* USART3 interrupt Init */ -#if (defined STM32G070xx) || (defined STM32G030xx) - HAL_NVIC_SetPriority(USART3_4_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(USART3_4_IRQn); -#endif -#ifdef STM32F103xB - HAL_NVIC_SetPriority(USART3_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(USART3_IRQn); -#endif - } -#endif -#ifdef UART4_EXIST -#if (defined STM32G070xx) - if (uartHandle->Instance == USART4) { - /* USART4 clock enable */ - __HAL_RCC_USART4_CLK_ENABLE(); - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**USART4 GPIO Configuration - PA0 ------> USART4_TX - PA1 ------> USART4_RX - */ - GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF4_USART4; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USART4 interrupt Init */ - HAL_NVIC_SetPriority(USART3_4_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(USART3_4_IRQn); - } -#endif -#endif -} - -/* Msp handle interrupt */ -#ifdef UART1_EXIST -void USART1_IRQHandler(void) { - HAL_UART_IRQHandler(&pika_uart1.huart); -} -#endif -#ifdef UART2_EXIST -void USART2_IRQHandler(void) { - HAL_UART_IRQHandler(&pika_uart2.huart); -} -#endif -#ifdef UART3_EXIST -#ifdef STM32F103xB -void USART3_IRQHandler(void) { - HAL_UART_IRQHandler(&pika_uart3.huart); -} -#endif -#endif - -#if (defined UART3_EXIST) && (defined UART4_EXIST) -#if defined STM32G070xx -void USART3_4_IRQHandler(void) { - HAL_UART_IRQHandler(&pika_uart3.huart); - HAL_UART_IRQHandler(&pika_uart4.huart); -} -#endif -#endif - -void STM32_UART_platformEnable(PikaObj* self, int baudRate, int id) { -#ifdef Code_ENABLE - STM32_Code_Init(); -#endif - setUartObj(id, self); - UART_HandleTypeDef* huart = getUartHandle(id); - huart->Instance = getUartInstance(id); - UART_MspInit(huart); - int errCode = USART_UART_Init(baudRate, id); - if (0 != errCode) { - obj_setErrorCode(self, 1); - obj_setSysOut(self, "[error] uart init faild."); - return; - } - HAL_UART_Receive_IT(getUartHandle(id), (uint8_t*)getUartRxBuff(id), 1); -} - -char* STM32_UART_platformRead(PikaObj* self, int id, int length) { - Args* buffs = New_strBuff(); - char* readBuff = NULL; - pika_uart_t* pika_uart = getPikaUart(id); - if (length >= pika_uart->rxBuffOffset) { - /* not enough str */ - length = pika_uart->rxBuffOffset; - } - readBuff = args_getBuff(buffs, length); - memcpy(readBuff, pika_uart->rxBuff, length); - obj_setStr(self, "readBuff", readBuff); - readBuff = obj_getStr(self, "readBuff"); - - /* update rxBuff */ - memcpy(pika_uart->rxBuff, pika_uart->rxBuff + length, - pika_uart->rxBuffOffset - length); - pika_uart->rxBuffOffset -= length; - pika_uart->rxBuff[pika_uart->rxBuffOffset] = 0; - - UART_Start_Receive_IT( - &pika_uart->huart, - (uint8_t*)(pika_uart->rxBuff + pika_uart->rxBuffOffset), 1); -exit: - args_deinit(buffs); - return readBuff; -} - -void STM32_UART_platformWrite(PikaObj* self, char* data, int id) { - HAL_UART_Transmit(getUartHandle(id), (uint8_t*)data, strGetSize(data), 100); -} - -void STM32_UART_clearRxBuff(pika_uart_t* pika_uart) { - pika_uart->rxBuffOffset = 0; - pika_uart->rxBuff[pika_uart->rxBuffOffset] = 0; - UART_Start_Receive_IT( - &pika_uart->huart, - (uint8_t*)(pika_uart->rxBuff + pika_uart->rxBuffOffset), 1); -} - -/* Recive Interrupt Handler */ -void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart) { - uint8_t id = getUartId(huart); - pika_uart_t* pika_uart = getPikaUart(id); - char inputChar = pika_uart->rxBuff[pika_uart->rxBuffOffset]; - - if ((id == 1) && ('\n' == inputChar)) { -#ifdef Code_ENABLE - uint8_t res = STM32_Code_reciveHandler(pika_uart->rxBuff, - pika_uart->rxBuffOffset + 1); - /* handler is working */ - if (0 != res) { - STM32_UART_clearRxBuff(pika_uart); - return; - } -#endif - } - /* avoid recive buff overflow */ - if (pika_uart->rxBuffOffset + 2 > RX_BUFF_LENGTH) { - memmove(pika_uart->rxBuff, pika_uart->rxBuff + 1, RX_BUFF_LENGTH); - UART_Start_Receive_IT( - huart, (uint8_t*)(pika_uart->rxBuff + pika_uart->rxBuffOffset), 1); - return; - } - - /* recive next char */ - pika_uart->rxBuffOffset++; - pika_uart->rxBuff[pika_uart->rxBuffOffset] = 0; - UART_Start_Receive_IT( - huart, (uint8_t*)(pika_uart->rxBuff + pika_uart->rxBuffOffset), 1); -} - -/* support prinf */ -int fputc(int ch, FILE* f) { - HAL_UART_Transmit(&pika_uart1.huart, (uint8_t*)&ch, 1, 0xffff); - return ch; -} - -/* support scanf */ -int fgetc(FILE* f) { - uint8_t ch = 0; - HAL_UART_Receive(&pika_uart1.huart, &ch, 1, 0xffff); - return ch; -} \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_common.c b/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_common.c deleted file mode 100644 index 6bf5cd277..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_common.c +++ /dev/null @@ -1,168 +0,0 @@ -#include "STM32_common.h" -#include "dataStrs.h" - -void __platformDisableIrqHandle(){ - __disable_irq(); -} -void __platformEnableIrqHandle(){ - __enable_irq(); -} - -void delay_unit(uint32_t delays) { - /* one unit is 1/64 us */ - uint32_t startval, tickn, wait; - - startval = SysTick->VAL; - tickn = HAL_GetTick(); - if (delays > startval) { - while (HAL_GetTick() == tickn) { - } - wait = 64000 + startval - delays; - while (wait < SysTick->VAL) { - } - } else { - wait = startval - delays; - while (wait < SysTick->VAL && HAL_GetTick() == tickn) { - } - } -} - -void delay_us(uint32_t udelay) { - uint32_t startval, tickn, delays, wait; - - startval = SysTick->VAL; - tickn = HAL_GetTick(); - delays = udelay * 64; // delay 1us when delays = 64 - if (delays > startval) { - while (HAL_GetTick() == tickn) { - } - wait = 64000 + startval - delays; - while (wait < SysTick->VAL) { - } - } else { - wait = startval - delays; - while (wait < SysTick->VAL && HAL_GetTick() == tickn) { - } - } -} - -GPIO_TypeDef* getGpioPort(char* pin) { - if (strIsStartWith(pin, "PA")) { - return GPIOA; - } - if (strIsStartWith(pin, "PB")) { - return GPIOB; - } - if (strIsStartWith(pin, "PC")) { - return GPIOC; - } - if (strIsStartWith(pin, "PD")) { - return GPIOD; - } - return NULL; -} - -uint16_t getGpioPin(char* pin) { - Args* buffs = New_strBuff(); - uint16_t gpioPin = 0; - - pin = strsCopy(buffs, pin + 2); - if (strEqu(pin, "0")) { - gpioPin = GPIO_PIN_0; - goto exit; - } - if (strEqu(pin, "1")) { - gpioPin = GPIO_PIN_1; - goto exit; - } - if (strEqu(pin, "2")) { - gpioPin = GPIO_PIN_2; - goto exit; - } - if (strEqu(pin, "3")) { - gpioPin = GPIO_PIN_3; - goto exit; - } - if (strEqu(pin, "4")) { - gpioPin = GPIO_PIN_4; - goto exit; - } - if (strEqu(pin, "5")) { - gpioPin = GPIO_PIN_5; - goto exit; - } - if (strEqu(pin, "6")) { - gpioPin = GPIO_PIN_6; - goto exit; - } - if (strEqu(pin, "7")) { - gpioPin = GPIO_PIN_7; - goto exit; - } - if (strEqu(pin, "8")) { - gpioPin = GPIO_PIN_8; - goto exit; - } - if (strEqu(pin, "9")) { - gpioPin = GPIO_PIN_9; - goto exit; - } - if (strEqu(pin, "10")) { - gpioPin = GPIO_PIN_10; - goto exit; - } - if (strEqu(pin, "11")) { - gpioPin = GPIO_PIN_11; - goto exit; - } - if (strEqu(pin, "12")) { - gpioPin = GPIO_PIN_12; - goto exit; - } - if (strEqu(pin, "13")) { - gpioPin = GPIO_PIN_13; - goto exit; - } - if (strEqu(pin, "14")) { - gpioPin = GPIO_PIN_14; - goto exit; - } - if (strEqu(pin, "15")) { - gpioPin = GPIO_PIN_15; - goto exit; - } - -exit: - args_deinit(buffs); - return gpioPin; -} - -uint32_t getPinMode(char* mode) { - if (strEqu(mode, "out")) { - return GPIO_MODE_OUTPUT_PP; - } - if (strEqu(mode, "in")) { - return GPIO_MODE_INPUT; - } - return NULL; -} - -uint8_t enableClk(char* pin) { - if (strIsStartWith(pin, "PA")) { - __HAL_RCC_GPIOA_CLK_ENABLE(); - return 0; - } - if (strIsStartWith(pin, "PB")) { - __HAL_RCC_GPIOB_CLK_ENABLE(); - return 0; - } - if (strIsStartWith(pin, "PC")) { - __HAL_RCC_GPIOC_CLK_ENABLE(); - return 0; - } - if (strIsStartWith(pin, "PD")) { - __HAL_RCC_GPIOD_CLK_ENABLE(); - return 0; - } - return 1; -} \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_common.h b/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_common.h deleted file mode 100644 index 8470cd5d5..000000000 --- a/bsp/stm32g030c8/pikascript/pikascript-lib/STM32/STM32_common.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef __STM32__COMMON__H -#define __STM32__COMMON__H -#include "PikaObj.h" - -#ifdef STM32G070xx -#include "stm32g0xx_hal.h" -#define UART1_EXIST -#define UART2_EXIST -#define UART3_EXIST -#define UART4_EXIST - -#define TIM1_EXIST -#define TIM3_EXIST -#define TIM14_EXIST -#define TIM16_EXIST -#define TIM17_EXIST -#define Code_ENABLE -#endif - -#ifdef STM32F103xB -#include "stm32f1xx_hal.h" -#define UART1_EXIST -#define UART2_EXIST -#define UART3_EXIST - -#define TIM1_EXIST -#define TIM2_EXIST -#define TIM3_EXIST -#define TIM4_EXIST -#endif - -#ifdef STM32G030xx -#include "stm32g0xx_hal.h" -#define UART1_EXIST -#define UART2_EXIST - -#define TIM1_EXIST -#define TIM3_EXIST -#define TIM14_EXIST -#define TIM16_EXIST -#define TIM17_EXIST -#define Code_ENABLE -#endif - -#define RX_BUFF_LENGTH 64 - -#define FLASH_CODE_START_ADDR \ - (FLASH_BASE + \ - ((FLASH_PAGE_NB - 1) * FLASH_PAGE_SIZE)) /* Start @ of user Flash area */ -#define FLASH_USER_END_ADDR \ - (FLASH_BASE + FLASH_SIZE - 1) /* End @ of user Flash area */ -uint32_t GetPage(uint32_t Addr); -#define DATA_64 ((uint64_t)0x1234567812345678) -#define DATA_32 ((uint32_t)0x12345678) - -typedef struct { - UART_HandleTypeDef huart; - uint8_t id; - char rxBuff[RX_BUFF_LENGTH]; - uint16_t rxBuffOffset; - PikaObj* obj; -} pika_uart_t; - -typedef struct _CodeHeap{ - char *content; - uint32_t size; - uint8_t ena; - uint32_t reciveTime; - - uint32_t oldSize; -}CodeHeap; - -GPIO_TypeDef* getGpioPort(char* pin); -uint16_t getGpioPin(char* pin); -uint32_t getPinMode(char* mode); -uint8_t enableClk(char* pin); -void delay_us(uint32_t delay); -void delay_unit(uint32_t delay); -void STM32_UART_clearRxBuff(pika_uart_t* pika_uart); -uint8_t STM32_Code_reciveHandler(char *data, uint32_t rxSize); -void STM32_Code_Init(); -void STM32_Code_flashHandler(); -#endif \ No newline at end of file diff --git a/bsp/stm32g030c8/pikascript/rust-msc-latest-win10.exe b/bsp/stm32g030c8/pikascript/rust-msc-latest-win10.exe deleted file mode 100644 index 9dcd4cf4b629a36a8fb93ea7f0db9435840c8562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622592 zcmeF434EkQng2U;FhPz4WFR0ygHbXo4gpc(diCJ6_PB|LBN7iZh_C?>v%qLPfDALu zrs-)nixVACG%G6c!YGQ7MeRA92?!cNC7wi7s1T4WM~DZ`|NDEY-tIRuVJ5-B-M=6C zFsZJpr=I7jr=EK1sq<}mQ%_=kB9U0YzirzRi9tgBm$JV*|KrHs_wbwcO?++7+m9Hm zXuSQ1Q`^tEFxhdzyZ`lqGv1Xv^NjP)fA>Ynx1W`~VCDJAbIwmLfBh-RcfI=^XD!`l zpJ&tt)Vb4_Tzvb>Ub8g%w|V)GmTn;a$rZ0Y<_8v@c+Af&eAO|VEnI%g_X&S`+N&*o z`^#Rv^c>w28!#iM{6S`|L#h zqD10#^L%nGzpL$MszQN&leLE>mBYlqo?d9A&rh_iiVB6Yp

sagSEN5{aWnDidGx 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 z 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

b*5>%7<3R=_B> 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 KD#`z6|M@=`de+GR