summaryrefslogblamecommitdiffstats
path: root/Under-Testing/Box1-Code/GSMClass.py
blob: d89f6526f0223ff93c5eec52cd79eeda52ec4133 (plain) (tree)














































































































































































































































































































                                                                                                                                                                                   
from serial import * #serial port library
import string
import sys 
import signal

class TimeoutException(Exception):
	pass

class serialPort():
	
	def __init__(self, portAddress, baudRate, timeout):
		self.portAddress = portAddress
		self.portExist = 0
		self.ser = 0 
		self.baudRate = baudRate
		self.signalStrength = 0

		self.timer = timeout
		self.timer1 = timeout
		self.start = 0
			
		self.debugMode = 0 
			
	def portInit(self, timeout1):
		portName = self.portAddress[-4:]
		portExist = os.popen('dmesg | grep ' + portName).read()
		self.timer = timeout1
		if portExist == '':
			return 0
		else:
			try:
				self.ser = Serial(
                			port=self.portAddress,
                			baudrate=self.baudRate,
                			bytesize=EIGHTBITS,
                			parity=PARITY_NONE,
                			stopbits=STOPBITS_ONE
            				)
				self.ser.flushOutput() #clean the output buffer from the serial port
				self.ser.flushInput() #clean the input buffer for serial port
				self.ser.write('AT\r')
				
				received = self.__receiveData()
				self.start=1
				if received == 'OK':
					self.portExist = 1
					return 1  #cellphone is OK, receives commands 
				elif received == 'TIMEOUT':
					return 'TIMEOUT'
				else:
					return 2  #cellphone has an error

			except Exception, e:
				import traceback
				if self.debugMode == 1:
					print e
					print traceback.format_exc()

				self.portExist = 3
				return 3

	def callNumber(self,numberToCall):
		if self.portExist == 1:
			try:
				self.ser.flushInput() #clean the input buffer for serial port
				self.ser.write('ATD'+str(numberToCall)+';\r')
				if self.__receiveData() == 'OK':
					return 1
				else:
					return 4

			except Exception, e:
				import traceback
                                if self.debugMode == 1:
                                        print e
                                        print traceback.format_exc()

				return 3
		else:
			return 0	

			
	def hangUp(self):
		if self.portExist == 1:
			try:
				self.ser.flushInput() #clean the input buffer for serial port
				self.ser.write('AT+CHUP\r')
				received = self.__receiveData()
				if received == 'OK':
					return 1
				elif received == 'ERROR':
					return 2 #other side hang up the call
				else:
					return 4
			except Exception, e:
				import traceback
                                if self.debugMode == 1:
                                        print e
                                        print traceback.format_exc()
				return 3
		else:
			return 0

	
	def closePort(self):
		if self.portExist == 1:
			try:
				self.ser.flushInput() #clean the input buffer for serial port
				self.ser.close()
				return 1
			except Exception, e:
				import traceback
				if self.debugMode == 1:
					print e
					print traceback.format_exc()
				return 3
		else:
			return 0
	
	def getSignalQuality(self):
		if self.portExist == 1:
			try:
				self.ser.flushInput() #clean the input buffer for serial port
				self.ser.write('AT+CSQ\r')
				if self.__receiveData() == 'OK':
					if self.__receiveData == 'SIGNAL':
						return 1
					else:
						return 4
				else:
					return 2
			except Exception, e:
				import traceback
				if self.debugMode == 1:
					print e
					print traceback.format_exc()
				return 3

		else:
			return 0

	def receiveCall(self):
		if self.portExist == 1:
			try:
				self.ser.flushInput() #clean the input buffer for serial port
				if self.__receiveData() == 'RING':
					self.ser.write('ATA\r')
					if self.__receiveData()=='OK':
						return 1
					else:
						return 4
				else:
					return 2

			except Exception, e:
				import traceback
				if self.debugMode == 1:
					print e
					print traceback.format_exc()
				return 3
		else:
			return 0

	def currentCall(self):
		if self.portExist == 1:
			try:
				self.ser.flushInput() #clean the input buffer for serial port
				self.ser.write('AT+CLCC\r')
				received = self.__receiveData()
				if received == 'OK':
					return 2 #not yet in a call
				elif received == 'ACTIVE':
					return 1 #in a call
				elif received == 'HELD':
                                        return 5 #held call
                                elif received == 'DIALING':
                                        return 6 #dialing
                                elif received == 'ALERTING':
                                        return 7 #alerting the call
                                elif received == 'INCOMING':
                                        return 8 #incoming call
                                elif received == 'WAITING':
                                        return 9 #waiting for a call

				else:
					return received #in some other state
			except Exception, e:
				import traceback
				if self.debugMode == 1:
					print e
					print traceback.format_exc()
				return 3
		else:
			return 0
	
	def __receiveData(self):
		def timeout_handler(signum, frame):
			raise TimeoutException()
		if self.start == 0:
			self.timer = 5
		else:
			self.timer = self.timer1

		old_handler = signal.signal(signal.SIGALRM, timeout_handler)
		signal.alarm(self.timer)

		bufferData = ''
		lines = ''
		line = ''
	
		try:
			while True:
				bufferData = bufferData + self.ser.read(self.ser.inWaiting()) #read the serial port and add it to the buffer variable
				if '\n' in bufferData: #if a new line character is found in the buffer then the cellphone has sent something
					lines = bufferData.split('\n') #parse the buffer variable with the new line character
					last_received = lines.pop(0) #put into last_received variable the first content from lines (FIFO)

					bufferData = '\n'.join(lines) #add a new line to the buffer variable

					last_received=last_received.split('\n') #parse the last received value with new lines
					line = last_received[0].replace(chr(13), '') #remove \r from the first parsed value in last_received and return me a nicely parsed value :)
					if self.debugMode == 1:
						if len(line) > 0:
							print line

					if line == 'OK':
						signal.signal(signal.SIGALRM, old_handler)
						signal.alarm(0) 
						return 'OK'

					elif line == 'ERROR':
						signal.signal(signal.SIGALRM, old_handler)
						signal.alarm(0)
						return 'ERROR'
					
					elif line[0:11] == '+CME ERROR:':
						if self.debugMode == 1:
							print 'ERROR:', line
						signal.signal(signal.SIGALRM, old_handler)
						signal.alarm(0)
						return 'ERROR'

					elif line == 'RING':
						signal.signal(signal.SIGALRM, old_handler)
						signal.alarm(0)
						return 'RING'

					elif line[0:5] == '+CSQ:':
						space = int(string.find(line,' '))+1  #find the   (space) sign
                      				coma =  int(string.find(line,','))  #find the , (coma) sign
                      				self.signalStrength = (int(line[space:coma])*2)-113
						signal.signal(signal.SIGALRM, old_handler)
						signal.alarm(0)
						return 'SIGNAL'

					elif line == 'NO CARRIER':
						signal.signal(signal.SIGALRM, old_handler)
						signal.alarm(0)
						return 'NO CARRIER'

					elif line == 'BUSY':
						signal.signal(signal.SIGALRM, old_handler)
						signal.alarm(0)
						return 'BUSY'

					elif line[0:6] == '+CLCC:':

						if line[11:12] == '0':
							signal.signal(signal.SIGALRM, old_handler)
							signal.alarm(0)
							return 'ACTIVE'
						elif line[11:12] == '1':
							signal.signal(signal.SIGALRM, old_handler)
							signal.alarm(0)
							return 'HELD'
						elif line[11:12] == '2':
							signal.signal(signal.SIGALRM, old_handler)
							signal.alarm(0)	
							return 'DIALING'
						elif line[11:12] == '3':
							signal.signal(signal.SIGALRM, old_handler)
							signal.alarm(0)
							return 'ALERTING'
						elif line[11:12] == '4':
							signal.signal(signal.SIGALRM, old_handler)
							signal.alarm(0)
							return 'INCOMING'
						elif line[11:12] == '5':
							signal.signal(signal.SIGALRM, old_handler)
							signal.alarm(0)
							return 'WAITING'

		except TimeoutException:
			signal.signal(signal.SIGALRM, old_handler)
			signal.alarm(0)
			return 'TIMEOUT'

		except Exception, e:
			signal.signal(signal.SIGALRM, old_handler)
			signal.alarm(0)
			print 'NO GOOD'
			print e
			return 3