| 
      
        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