From: Stephen W. <sa...@us...> - 2004-03-03 07:54:02
|
I rushed the SCP-5500 support to get it into this latest test release. As a result, it has a feature in which writing to the phonebook on the phone will sometimes throw an exception. Repeating the "Send Phone Data" operation WITHOUT rebooting the phone, usually succeeds. I believe what happens is that when the phone is put into programming mode, it is actually not ready to accept data. A phonebook entry written to the phone returns with the first few bytes of the packet, prepended with at 0x18, likely some kind of not-ready error code. I thought of either just waiting several seconds or handing the 0x18 error code when I recalled that the QCPLINK (http://qcplink.sourceforge.net/) protocol document describes a way to check the programming status by sending a packet with 0x0c in it (plus checksum and 7e). The return packet contains the ESN as well as 4 bytes that change value if the 0x0c command is repeatedly sent just after putting the phone into programming mode. I tried this on my Sanyo phones and the packet returned the esn and 4 flags in exactly the same place as the QCP-2760 phone used in the qcplink project. (The Sanyo packets have less padding at the end.) If I poll rapidly after putting the phone in write mode, the 4 flags change state at different times. So I just chose the flag that changed last and used that to determine when it is safe to write to the phone. This trick seems to work on the phones I tried it on, 4900, 8100, and 5500. Perhaps it might be of use to other phones Stephen PACKET statusrequest: 1 UINT {'constant': 0x0c} +command PACKET statusresponse: P UINT {'constant': 0x0} readyvalue 1 UINT command 3 UNKNOWN dunno1 4 UINT esn 1 UINT flag0 14 UNKNOWN dunno2 1 UINT ready 1 UINT dunno3 1 UINT flag2 6 UINT dunno4 1 UINT flag3 * UNKNOWN unknown def writewait(self): """Loop until phone status indicates ready to write""" for i in range(100): req=self.protocolclass.statusrequest() res=self.sendpbcommand(req, self.protocolclass.statusresponse) # print res.flag0, res.ready, res.flag2, res.flag3 if res.ready==res.readyvalue: return time.sleep(0.1) self.log("Phone did not transfer to ready to write state") self.log("Waiting a bit longer and trying anyway") return |