mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
111 lines
3.5 KiB
Python
111 lines
3.5 KiB
Python
# This work is licensed under the MIT license.
|
|
# Copyright (c) 2013-2023 OpenMV LLC. All rights reserved.
|
|
# https://github.com/openmv/openmv/blob/master/LICENSE
|
|
#
|
|
# ble.py - ASM001/ASM002 BLE Driver
|
|
#
|
|
# Note: You should copy this module to your OpenMV Cam's SD card or internal
|
|
# file system.
|
|
#
|
|
# This is a driver for the ASM001/ASM002 BLE modules. It takes care of parsing
|
|
# commands for you. Please see the http://truconnect.ack.me/2.0/general_overview
|
|
# reference guide for how to use the ASM001/ASM002 BLE modules.
|
|
|
|
from time import sleep
|
|
from pyb import Pin, UART
|
|
|
|
|
|
class BLE:
|
|
BLE_NONE = 0
|
|
BLE_SHIELD = 1
|
|
|
|
def command(self, cmd):
|
|
if self.type == self.BLE_SHIELD:
|
|
self.uart.write(cmd)
|
|
self.uart.write("\r\n")
|
|
r = self.uart.read(9)
|
|
if r[0] != 82:
|
|
raise OSError("Response corrupted!")
|
|
if r[1] == 49:
|
|
raise OSError("Command failed!")
|
|
if r[1] == 50:
|
|
raise OSError("Parse error!")
|
|
if r[1] == 51:
|
|
raise OSError("Unknown command!")
|
|
if r[1] == 52:
|
|
raise OSError("Too few args!")
|
|
if r[1] == 53:
|
|
raise OSError("Too many args!")
|
|
if r[1] == 54:
|
|
raise OSError("Unknown variable or option!")
|
|
if r[1] == 55:
|
|
raise OSError("Invalid argument!")
|
|
if r[1] == 56:
|
|
raise OSError("Timeout!")
|
|
if r[1] == 57:
|
|
raise OSError("Security mismatch!")
|
|
if r[1] != 48:
|
|
raise OSError("Response corrupted!")
|
|
for i in range(2, 6):
|
|
if r[i] < 48 or 57 < r[i]:
|
|
raise OSError("Response corrupted!")
|
|
if r[7] != 13 or r[8] != 10:
|
|
raise OSError("Response corrupted!")
|
|
l = (
|
|
((r[2] - 48) * 10000)
|
|
+ ((r[3] - 48) * 1000)
|
|
+ ((r[4] - 48) * 100)
|
|
+ ((r[5] - 48) * 10)
|
|
+ ((r[6] - 48) * 1)
|
|
)
|
|
if not l:
|
|
return None
|
|
if l == 1 or l == 2:
|
|
raise OSError("Response corrupted!")
|
|
response = self.uart.read(l - 2)
|
|
if self.uart.readchar() != 13:
|
|
raise OSError("Response corrupted!")
|
|
if self.uart.readchar() != 10:
|
|
raise OSError("Response corrupted!")
|
|
return response
|
|
|
|
def deinit(self):
|
|
if self.type == self.BLE_SHIELD:
|
|
self.uart.deinit()
|
|
self.rst = None
|
|
self.uart = None
|
|
self.type = self.BLE_NONE
|
|
|
|
def init(self, type=BLE_SHIELD):
|
|
self.deinit()
|
|
if type == self.BLE_SHIELD:
|
|
self.rst = Pin("P7", Pin.OUT_OD, Pin.PULL_NONE)
|
|
self.uart = UART(3, 115200, timeout_char=1000)
|
|
self.type = self.BLE_SHIELD
|
|
self.rst.low()
|
|
sleep(100)
|
|
self.rst.high()
|
|
sleep(100)
|
|
self.uart.write("set sy c m machine\r\nsave\r\nreboot\r\n")
|
|
sleep(1000)
|
|
self.uart.readall() # clear
|
|
|
|
def uart(self):
|
|
if self.type == self.BLE_SHIELD:
|
|
return self.uart
|
|
|
|
def type(self):
|
|
if self.type == self.BLE_SHIELD:
|
|
return self.BLE_SHIELD
|
|
|
|
def __init__(self):
|
|
self.rst = None
|
|
self.uart = None
|
|
self.type = self.BLE_NONE
|
|
|
|
|
|
if __name__ == "__main__":
|
|
ble = BLE()
|
|
ble.init()
|
|
print(ble.command("ver"))
|