From 01b5f713dab4920b3bc657d8afcb8f5ace329478 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Tue, 16 Apr 2024 15:44:45 +0200 Subject: [PATCH] ucloud: Allow Task to schedule sync or async code. Signed-off-by: iabdalkader --- src/arduino_iot_cloud/__init__.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/arduino_iot_cloud/__init__.py b/src/arduino_iot_cloud/__init__.py index 3555b05..04e09cb 100644 --- a/src/arduino_iot_cloud/__init__.py +++ b/src/arduino_iot_cloud/__init__.py @@ -4,17 +4,12 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. +import asyncio +import binascii from .ucloud import ArduinoCloudClient # noqa from .ucloud import ArduinoCloudObject from .ucloud import timestamp -try: - import asyncio - import binascii -except ImportError: - import uasyncio as asyncio - import ubinascii as binascii - CADATA = binascii.unhexlify( b"308201cf30820174a00302010202141f101deba7e125e727c1a391e3ec0d" @@ -35,6 +30,16 @@ b"8d6444ffe82217304ff2b89aafca8ecf" ) +async def coro(): # noqa + pass + + +def is_async(obj): + if hasattr(asyncio, "iscoroutinefunction"): + return asyncio.iscoroutinefunction(obj) + else: + return isinstance(obj, type(coro)) + class Task(ArduinoCloudObject): def __init__(self, name, **kwargs): @@ -45,9 +50,12 @@ def __init__(self, name, **kwargs): super().__init__(name, **kwargs) async def run(self, aiot): - while True: - self.on_run(aiot) - await asyncio.sleep(self.interval) + if is_async(self.on_run): + await self.on_run(aiot) + else: + while True: + self.on_run(aiot) + await asyncio.sleep(self.interval) class Location(ArduinoCloudObject):