Newer
Older
Import / projects / LGN-IP3870 / t / new / bluetoothapp.py
from socket import *
import os
import config
import runtime
import utils
import phonesetting
import sdmmc
import status

class BTApp:
	def __init__(self):
		self.btSock = None
		self.run_recv_thread = None
		self.bt_list = []
		self.dEnd = ''
		self.fEnd = '2'
		self.bt_i = ''
		self.bt_s = -1
		self.bt_c = -1
		self.bt_o = -1
		self.bt_sp = -1
		self.bt_p = -1
		self.bt_flist = []

	def run_btapp(self):
		try:
			ps_value = os.popen('ps')
			ps_str = ps_value.read()
		except:
			ps_str = 'ipc-pxa270-merge.out'

		if ps_str.find('ipc-pxa270-merge.out') != -1:

			self.btSock = socket( AF_UNIX, SOCK_STREAM )
			self.btSock.setblocking( 1 )

			import time, ntptime
			time.sleep(1)

			try:
				self.btSock.connect(config.bt_socket_path)

				import evas
				self.run_recv_thread=runtime.evas.input_add(self.btSock.fileno(), evas.INPUT_READ, self.recv_message)

			except:
				print '###### socket connect error.. in bluetoothapp.py ######'

			return False
		else:
			print 'no bluetooth module!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'

	def send_message(self, msg):
		try:
			for z in range(200 - len(msg)):
				msg += '\0'
			msg = (msg,)
			self.btSock.send(*msg)
		except:
			print 'send message error!!!!!!!!!!!!!!!!!!!!!'

	def set_default(self):
		self.bt_list = []
		self.bt_flist = []
		self.dEnd = ''
		self.fEnd = '2'
		#self.bt_r = -1
		self.bt_i = ''
		self.bt_s = -1
		self.bt_c = -1
		self.bt_o = -1
		self.bt_sp = -1
		self.bt_p = -1

	def recv_message(self,btSock,type):
		recv_msg = ''
		try:
			recv_msg = self.btSock.recv(200)
		except:
			print '<<<< bluetooth socket receive error >>>>'

		if len( recv_msg ) == 0:	# Disconnected from unix socket
			if self.run_recv_thread != None:
				runtime.evas.input_remove(self.run_recv_thread)
				self.run_recv_thread = None
		else:
			self.parseMessage(recv_msg)

		return True

	def parseMessage(self, msg):

		def set_response(data):
			if data == '1':
				return 1
			else:
				return 0

		if msg.find('|') == -1:
			print 'no | msg = ' + msg
		else:
			recvData = msg.split('|')

			if recvData[1] == 'i':
				self.bt_i = 'Inquiry Complete.'

			elif recvData[1] == 'd':  #device
				self.bt_list.append(recvData[2][:recvData[2].index('\n')])

			elif recvData[1] == 'c':
				self.dEnd = recvData[2][:4]

			elif recvData[1] == 'g':
				pass

			elif recvData[1] == 'a':
				stage_name = runtime.manager.stage.get_name()

				if stage_name == 'connected' or stage_name == 'directvideocalling' or stage_name == 'incomingcall' or stage_name == 'directaudiocalling' \
					or stage_name ==  'incomingaudiocall' or stage_name ==  'enblock edit' or stage_name == "VideoCallImpossible"\
					or stage_name == 'calling' or stage_name == 'offhook' or stage_name ==  'AudioCallConnecting' or stage_name == "VideoCallConnecting" \
					or stage_name == 'AudioCallConnected' or stage_name == 'AudioCallTerminated' or stage_name == "VideoCallConnected":
					runtime.btapp.send_message('20|Y|0')

				elif status.phone_status != status.Disconnected \
					or status.videocall_mode == status.VideoCallConnected \
					or (status.video_mode != status.VideoIdle) \
					or (status.first_video_mode != status.VideoIdle and status.second_video_mode != status.VideoIdle) \
 					or (status.video_mode == status.VideoConnected) \
 					or (status.first_video_mode == status.VideoConnected or status.second_video_mode == status.VideoConnected)\
 					or status.update_section:

					runtime.btapp.send_message('20|Y|0')

				elif runtime.browserapp:
					if runtime.browserapp.is_running() == True:
						runtime.btapp.send_message('20|Y|0')

				else:
					if utils.player.amr_record != None or utils.player.videopid_record != None:
						runtime.manager.change_stage(sdmmc.AcceptRequestStage(_('Bluetooth requests.')))
					else:
						runtime.manager.stack_stage(sdmmc.AcceptRequestStage(_('Bluetooth requests.')))

			elif recvData[1] == 'r':
				stage_name = runtime.manager.stage.get_name()

				if stage_name == 'connected' or stage_name == 'directvideocalling' or stage_name == 'incomingcall' or stage_name == 'directaudiocalling' \
					or stage_name ==  'incomingaudiocall' or stage_name ==  'enblock edit' or stage_name == "VideoCallImpossible"\
					or stage_name == 'calling' or stage_name == 'offhook' or stage_name ==  'AudioCallConnecting' or stage_name == "VideoCallConnecting" \
					or stage_name == 'AudioCallConnected' or stage_name == 'AudioCallTerminated' or stage_name == "VideoCallConnected":
					runtime.btapp.send_message('20|Y|0')

				elif status.phone_status != status.Disconnected \
					or status.videocall_mode == status.VideoCallConnected \
					or (status.video_mode != status.VideoIdle) \
					or (status.first_video_mode != status.VideoIdle and status.second_video_mode != status.VideoIdle) \
 					or (status.video_mode == status.VideoConnected) \
 					or (status.first_video_mode == status.VideoConnected or status.second_video_mode == status.VideoConnected)\
 					or status.update_section:

					runtime.btapp.send_message('20|Y|0')

				elif runtime.browserapp:
					if runtime.browserapp.is_running() == True:
						runtime.btapp.send_message('20|Y|0')
				else:
					if utils.player.amr_record != None or utils.player.videopid_record != None:
						runtime.manager.change_stage(phonesetting.BluetoothEnterPassStage('', _('INPUT PINCODE'), _('Input PIN code'), 1))
					else:
						runtime.manager.stack_stage(phonesetting.BluetoothEnterPassStage('', _('INPUT PINCODE'), _('Input PIN code'), 1))

			elif recvData[1] == 's':
				self.bt_s = set_response(recvData[2][0])

			elif recvData[1] == 'C':
				self.bt_c = set_response(recvData[2][0])

			elif recvData[1] == 'O':
				self.bt_o = set_response(recvData[2][0])

			elif recvData[1] == 'P':
				self.bt_p = set_response(recvData[2][0])

			elif recvData[1] == 'p':
				self.bt_sp = set_response(recvData[2][0])

			elif recvData[1] == 'S':
				stage_name = runtime.manager.stage.get_name()

				if stage_name == 'connected' or stage_name == 'directvideocalling' or stage_name == 'incomingcall' or stage_name == 'directaudiocalling' \
					or stage_name ==  'incomingaudiocall' or stage_name ==  'enblock edit' or stage_name == "VideoCallImpossible"\
					or stage_name == 'calling' or stage_name == 'offhook' or stage_name ==  'AudioCallConnecting' or stage_name == "VideoCallConnecting" \
					or stage_name == 'AudioCallConnected' or stage_name == 'AudioCallTerminated' or stage_name == "VideoCallConnected":
					runtime.btapp.send_message('20|Y|0')

				elif status.phone_status != status.Disconnected \
					or status.videocall_mode == status.VideoCallConnected \
					or (status.video_mode != status.VideoIdle) \
					or (status.first_video_mode != status.VideoIdle and status.second_video_mode != status.VideoIdle) \
 					or (status.video_mode == status.VideoConnected) \
 					or (status.first_video_mode == status.VideoConnected or status.second_video_mode == status.VideoConnected)\
 					or status.update_section:

					runtime.btapp.send_message('20|Y|0')

				elif runtime.browserapp:
					if runtime.browserapp.is_running() == True:
						runtime.btapp.send_message('20|Y|0')
				else:
					if utils.player.amr_record != None or utils.player.videopid_record != None:
						runtime.manager.change_stage(sdmmc.AcceptRequestStage(recvData[2][:recvData[2].find('\n')], 1))
					else:
						runtime.manager.stack_stage(sdmmc.AcceptRequestStage(recvData[2][:recvData[2].find('\n')], 1))

			elif recvData[1] == 'F':
				if recvData[2][0] == '0':
					self.fEnd = recvData[2]
				elif recvData[2][0] == '1':
					self.fEnd = recvData[2]
				else:
					self.fEnd = recvData[2][:4]

			elif recvData[1] == 'f':
				self.bt_flist.append(recvData[2][:recvData[2].index('\n')])