Package phones ::
Module com_samsungsphn400
|
|
1
2
3
4
5
6
7
8
9
10 """Communicate with a Samsung SPH-N400"""
11
12
13 import sha
14
15
16 import p_brew
17 import p_samsungsphn400
18 import com_brew
19 import com_phone
20 import prototypes
21 import common
22 import commport
23 import helpids
24
27 if str is None:
28 str="N400 Packet Error 0x%02x" % (errnum,)
29 Exception.__init__(self, str)
30 self.errnum=errnum
31
32 numbertypetab=( 'home', 'office', 'cell', 'pager', 'fax', 'none' )
33
34 -class Phone(com_phone.Phone,com_brew.BrewProtocol):
35 "Talk to a Samsung SPH-N400 cell phone"
36
37 desc="SPH-N400"
38 helpid=helpids.ID_PHONE_SAMSUNGOTHERS
39 MODEPHONEBOOK="modephonebook"
40
41 protocolclass=p_samsungsphn400
42 serialsname='sphn400'
43
44 - def __init__(self, logtarget, commport):
48
50 self.log("Retrieving fundamental phone information")
51 self.log("Phone serial number")
52
53 self.setmode(self.MODEPHONEBOOK)
54
55 req=p_brew.ESN_req()
56 res=self.sendpbcommand(req, p_brew.ESN_resp)
57 results['uniqueserial']=sha.new('%8.8X' % res.esn).hexdigest()
58
59 return results
60
96
97 - def sendpbcommand(self, request, responseclass, callsetmode=True, writemode=False, numsendretry=0, returnerror=False):
98 if writemode:
99 numretry=3
100 else:
101 numretry=0
102
103 if callsetmode:
104 self.setmode(self.MODEPHONEBOOK)
105 buffer=prototypes.buffer()
106
107 request.writetobuffer(buffer, logtitle="N400 phonebook request")
108 data=buffer.getvalue()
109 firsttwo=data[:2]
110 data=common.pppescape(data+common.crcs(data))+common.pppterminator
111 isendretry=numsendretry
112 while isendretry>=0:
113 try:
114 rdata=self.comm.writethenreaduntil(data, False, common.pppterminator, logreaduntilsuccess=False, numfailures=numretry)
115 break
116 except com_phone.modeignoreerrortypes:
117 if isendretry>0:
118 self.log("Resending request packet...")
119 time.sleep(0.3)
120 else:
121 self.comm.success=False
122 self.mode=self.MODENONE
123 self.raisecommsdnaexception("manipulating the phonebook")
124 isendretry-=1
125
126 self.comm.success=True
127
128 origdata=rdata
129
130
131
132
133 d=rdata.rfind(common.pppterminator,0,-1)
134 if d>=0:
135 self.log("Multiple N400 packets in data - taking last one starting at "+`d+1`)
136 self.logdata("Original N400 data", origdata, None)
137 rdata=rdata[d+1:]
138
139
140 data=common.pppunescape(rdata)
141
142
143
144
145
146 d=data.find(firsttwo)
147 crc=data[-3:-1]
148 crcok=False
149 for i in range(0,d+1):
150 trydata=data[i:-3]
151 if common.crcs(trydata)==crc:
152 crcok=True
153 break
154
155 if not crcok:
156 self.logdata("first two",firsttwo, None)
157 self.logdata("Original N400 data", origdata, None)
158 self.logdata("Working on N400 data", data, None)
159 raise common.CommsDataCorruption("N400 packet failed CRC check", self.desc)
160
161 res=responseclass()
162 if d>0:
163 if d==i:
164 self.log("Junk at beginning of N400 packet, data at "+`d`)
165 self.logdata("Original N400 data", origdata, None)
166 self.logdata("Working on N400 data", data, None)
167 else:
168 if returnerror:
169 res=self.protocolclass.sanyoerror()
170 else:
171 self.log("N400 Error code "+`ord(data[0])`)
172 self.logdata("Samsung phonebook response", data, None)
173 raise N400CommandException(ord(data[0]))
174
175 data=trydata
176
177
178 buffer=prototypes.buffer(data)
179 res.readfrombuffer(buffer, logtitle="sanyo phonebook response")
180 return res
181
224
226 pbook={}
227 result['calendar']=pbook
228 return result
229
232
235
236
238 protocolclass=Phone.protocolclass
239 serialsname=Phone.serialsname
240 phone_manufacturer='SAMSUNG'
241 phone_model='SPH-N400'
242 usbids_usbtoserial=(
243 ( 0x067b, 0x2303, None),
244 ( 0x0403, 0x6001, None),
245 ( 0x0731, 0x2003, None),
246 )
247 usbids=usbids_usbtoserial
248
249 deviceclasses=("serial",)
250
253
254 _supportedsyncs=(
255 ('phonebook', 'read', None),
256 )
257