1765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang#!/usr/bin/python 2765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# Author: Zion Orent <zorent@ics.com> 3765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# Copyright (c) 2015 Intel Corporation. 4765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# 5765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# Permission is hereby granted, free of charge, to any person obtaining 6765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# a copy of this software and associated documentation files (the 7765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# "Software"), to deal in the Software without restriction, including 8765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# without limitation the rights to use, copy, modify, merge, publish, 9765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# distribute, sublicense, and/or sell copies of the Software, and to 10765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# permit persons to whom the Software is furnished to do so, subject to 11765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# the following conditions: 12765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# 13765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# The above copyright notice and this permission notice shall be 14765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# included in all copies or substantial portions of the Software. 15765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# 16765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 24765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangimport time, sys, signal, atexit 25765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangimport pyupm_hm11 as upmHm11 26765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 27765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# Instantiate a HM11 BLE Module on UART 0 28765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangmy_ble_obj = upmHm11.HM11(0) 29765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 30765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 31765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang## Exit handlers ## 32765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# This stops python from printing a stacktrace when you hit control-C 33765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangdef SIGINTHandler(signum, frame): 34765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang raise SystemExit 35765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 36765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# This function lets you run code on exit, 37765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# including functions from my_ble_obj 38765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangdef exitHandler(): 39765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang print "Exiting" 40765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang sys.exit(0) 41765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 42765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# Register exit handlers 43765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangatexit.register(exitHandler) 44765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangsignal.signal(signal.SIGINT, SIGINTHandler) 45765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 46765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 47765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun ZhangbufferLength = 256 48765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 49765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# make sure port is initialized properly. 9600 baud is the default. 50765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangif (not my_ble_obj.setupTty(upmHm11.cvar.int_B9600)): 51765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang print "Failed to setup tty port parameters" 52765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang sys.exit(0) 53765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 54765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 55765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun ZhangusageStr = ("Usage:\n" 56765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang"Pass a commandline argument (any argument) to this program\n" 57765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang"to query the radio configuration and output it. NOTE: the\n" 58765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang"radio must be in CONFIG mode for this to work.\n\n" 59765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang"Running this program without arguments will simply transmit\n" 60765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang"'Hello World!' every second, and output any data received from\n" 61765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang"another radio.\n\n") 62765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangprint usageStr 63765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 64765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang# simple helper function to send a command and wait for a response 65765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangdef sendCommand(bleObj, cmd): 66765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang bleBuffer = upmHm11.charArray(bufferLength) 67765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang bleObj.writeData(cmd, len(cmd)) 68765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 69765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # wait up to 1 second 70765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (bleObj.dataAvailable(1000)): 71765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang bleObj.readData(bleBuffer, bufferLength) 72765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang bleData = "" 73765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # read only the number of characters 74765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # specified by myGPSSensor.readData 75765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang for x in range(0, bufferLength): 76765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang if (bleBuffer.__getitem__(x) == '\0'): 77765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang break 78765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang else: 79765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang bleData += bleBuffer.__getitem__(x) 80765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang print bleData 81765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang else: 82765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang print "Timed out waiting for response" 83765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 84765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 85765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangif (len(sys.argv) > 1): 86765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang print "Sending command line argument (" + sys.argv[1] + ")..." 87765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang sendCommand(my_ble_obj, sys.argv[1]) 88765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhangelse: 89765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # query the module address 90765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang addr = "AT+ADDR?"; 91765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang print "Querying module address (" + addr + ")..." 92765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 93765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang sendCommand(my_ble_obj, addr) 94765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang time.sleep(1) 95765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # query the module address 96765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang pin = "AT+PASS?"; 97765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang print "Querying module PIN (" + pin + ")..." 98765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang sendCommand(my_ble_obj, pin) 99765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 100765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # Other potentially useful commands are: 101765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # 102765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # AT+VERS? - query module version 103765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # AT+ROLE0 - set as slave 104765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # AT+ROLE1 - set as master 105765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # AT+CLEAR - clear all previous settings 106765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # AT+RESET - restart the device 107765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # 108765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # A comprehensive list is available from the datasheet at: 109765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang # http://www.seeedstudio.com/wiki/images/c/cd/Bluetooth4_en.pdf 110765adb95dc941c32690d6c43bc08b9d07d197fcbJianxun Zhang 111