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