wawaji_wumahang.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import logging
  4. import simplejson as json
  5. from apps.web.constant import FAULT_LEVEL, DeviceCmdCode, ErrorCode, DeviceErrorCodeDesc, FAULT_CODE
  6. from apps.web.core.adapter.base import SmartBox, fill_2_hexByte
  7. from apps.web.core.exceptions import ServiceException, DeviceNetworkTimeoutError
  8. from apps.web.core.networking import MessageSender
  9. logger = logging.getLogger(__name__)
  10. class WawajiMaichongBox(SmartBox):
  11. def __init__(self, device):
  12. super(WawajiMaichongBox, self).__init__(device)
  13. # 只需要处理抓到娃娃以及NG的消息。
  14. def analyze_event_data(self, data):
  15. if data.has_key('messageType') and data['messageType'] == 'PUT_ITEM':
  16. return {'funCode':'96'}
  17. if not data.has_key('data'):
  18. return None
  19. funCode = data['data'][4:6]
  20. if funCode == '8B':
  21. if data['data'][6:8] != '31':
  22. return None
  23. errCode = data['data'][8:10]
  24. errInfo = self.translate_error_desc(errCode)
  25. return {'funCode':'8B','faultName':errInfo.get('desc',''),'faultCode':FAULT_CODE.WAWAJI_WUMAHANG_NG,
  26. 'level':FAULT_LEVEL.NORMAL,
  27. 'desc':errInfo.get('oper','')
  28. }
  29. elif funCode == '96':
  30. if int(data['data'][12:14],16) > 1:
  31. return None
  32. return {'funCode':'96'}
  33. return None
  34. def translate_error_desc(self,errCode):
  35. errDict = {
  36. '01':{'desc':u'CPU故障','oper':u'1.更换U1 CPU。\n2.PCB故障。'},
  37. '02':{'desc':u'收线故障','oper':u'1.检查当收线时,上停SW是否确实弹开。\n2.检查上停SW是否故障。\n3.天车组的空中接头是否有接触不良的情形?\n4.主板上的J9 PIN是否有松脱接触不良情形?\n5.主板故障。'},
  38. '03':{'desc':u'防线故障','oper':u'1.检查绕线机的线是否有乱线的情形?\n2.检查上停SW是否故障。\n3.天车组的空中接头是否有接触不良的情形?\n4.主板上的J9 PIN是否有松脱接触不良情形?\n5.主板故障。'},
  39. '04':{'desc':u'出货SENSOR故障','oper':u'1.请检查是否灵敏度过高?请调整灵敏度VR,使排电的LED处于“暗”的状态\n2.J5电眼线是否脱落?\n3.电眼故障。\n4.主板故障。'},
  40. '05':{'desc':u'前停SW或后停SW故障','oper':u'1.检查前停SW或后停SW是否故障?\n2.天车组的空中接头是否有接触不良的情形?\n3.主板上的J9 PIN是否有松动接触不良的情形?\n4.主板故障。'},
  41. '06':{'desc':u'左停SW故障','oper':u'1.检查左停SW是否故障?\n2.天车组的空中接头是否有接触不良的情形?\n3.主板上的J9 PIN是否有松动接触不良的情形?\n4.主板故障。'},
  42. '07':{'desc':u'Coin1(投币1)表故障','oper':u'1.检查J5的插PIN是否有接触不良的情形\n2.计数器是否有故障?插PIN是否有松动?\n3.主板故障。'},
  43. '09':{'desc':u'出货表离线','oper':u'1.检查J5的插PIN是否有接触不良的情形\n2.计数器是否有故障?插PIN是否有松动?\n3.主板故障。'},
  44. '11':{'desc':u'Coin1(投币1)投币超时','oper':u'1.投币器故障。\n2.玩家钓鱼。'},
  45. '14':{'desc':u'93C66故障','oper':u'1.更换93C66。'}
  46. }
  47. return errDict.get(errCode,None)
  48. def check_result(self,devInfo):
  49. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  50. if devInfo['rst'] == -1:
  51. raise ServiceException(
  52. {'result': 2, 'description': u'娃娃机正在玩命找网络,请您稍候再试'})
  53. elif devInfo['rst'] == 1:
  54. raise ServiceException(
  55. {'result': 2, 'description': u'娃娃机忙,无响应,请您稍候再试。也可能是您的设备版本过低,暂时不支持此功能'})
  56. def check_dev_status(self, attachParas = None):
  57. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  58. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'8B','data':'000000'})
  59. self.check_result(devInfo)
  60. if devInfo['data'][6:8] == '31':
  61. errInfo = self.translate_error_desc(devInfo['data'][8:10])
  62. raise ServiceException({'result': 0, 'description': u'设备故障:%s,暂时无法使用' % errInfo.get('desc','')})
  63. def test(self, coins):
  64. return MessageSender.net_pay(self.device, 1, timeout = 120)
  65. def start_device(self, package, openId, attachParas):
  66. pay_count = int(package['coins'])
  67. result = MessageSender.net_pay(self.device, pay_count, timeout = 120)
  68. if result['rst'] == ErrorCode.DEVICE_CONN_FAIL:
  69. raise DeviceNetworkTimeoutError()
  70. elif result['rst'] != ErrorCode.DEVICE_SUCCESS:
  71. logger.debug('WawajiMaichongBox() failed to start, result was=%s' % (json.dumps(result),))
  72. raise ServiceException({'result': 2, 'description': DeviceErrorCodeDesc.get(result['rst'])})
  73. return result
  74. def get_total_coin(self):
  75. result = MessageSender.send(self.device, DeviceCmdCode.GET_DEVINFO,
  76. {'cmd': DeviceCmdCode.GET_DEVINFO, 'IMEI': self._device['devNo']})
  77. if result['rst'] != ErrorCode.DEVICE_SUCCESS:
  78. logger.debug('WawajiMaichongBox() failed to get total coin, result was=%s' % (json.dumps(result),))
  79. description = u'当前设备信号弱没有响应,请您稍后重试。'
  80. raise ServiceException({'result': 2, 'description': description})
  81. if not result.has_key('total_coin'):
  82. raise ServiceException({'result': 2, 'description': u'当前设备暂时不支持获取总的硬币数目,待版本自动升级后,会支持'})
  83. return result['total_coin']
  84. # 基类函数,检查告警状态,只能做一个简单的检查,设备是否在线
  85. def check_alarm(self, alarm):
  86. if alarm.faultCode == FAULT_CODE.OFFLINE:
  87. dev_info = MessageSender.send(device = self.device,
  88. cmd = DeviceCmdCode.GET_DEVINFO,
  89. payload = {'IMEI': self.device.devNo, 'fields': []},
  90. timeout = 15)
  91. if dev_info['rst'] == 0:
  92. return u'设备状态检查在线,网络通畅,网络可能出现闪断'
  93. else:
  94. raise ServiceException({'result': 2, 'description': u'设备玩命也无法找到网络,设备可能不在线'})
  95. elif alarm.faultCode == FAULT_CODE.WAWAJI_WUMAHANG_NG:
  96. self.check_dev_status()
  97. return u'设备状态正常,故障已经恢复'
  98. else:
  99. return u'无法检查该设备的告警状态,建议您用其他方式确认此告警是否正常'
  100. def get_claw_values(self):
  101. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  102. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'07','data':'C1C2C3C4'})
  103. self.check_result(devInfo)
  104. data = devInfo['data']
  105. return {'c1':int(data[6:8],16),'c2':int(data[8:10],16),'c3':int(data[10:12],16),'c4':int(data[12:14],16)}
  106. def set_claw_value(self,c1,c2,c3,c4):
  107. if c1<0 or c1 >48:
  108. raise ServiceException({'result': 2, 'description': u'c1的抓力范围为0-48'})
  109. if c2<0 or c2 >48:
  110. raise ServiceException({'result': 2, 'description': u'c2的抓力范围为0-48'})
  111. if c3<0 or c3 >48:
  112. raise ServiceException({'result': 2, 'description': u'c3的抓力范围为0-48'})
  113. if c4<0 or c4 >48:
  114. raise ServiceException({'result': 2, 'description': u'c4的抓力范围为0-48'})
  115. data = fill_2_hexByte(hex(c1), 2)
  116. data += fill_2_hexByte(hex(c2), 2)
  117. data += fill_2_hexByte(hex(c3), 2)
  118. data += fill_2_hexByte(hex(c4), 2)
  119. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  120. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'01','data':data})
  121. self.check_result(devInfo)
  122. def get_claw_maxcount(self):
  123. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  124. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'08','data':'00000000'})
  125. self.check_result(devInfo)
  126. data = devInfo['data']
  127. return {'greaterForceCount':int(data[6:10],16),'remainingGreaterForceCount':int(data[10:14],16)}
  128. def set_claw_maxcount(self,remainingGreaterForceCount):
  129. if remainingGreaterForceCount<1 or remainingGreaterForceCount >999:
  130. raise ServiceException({'result': 2, 'description': u'大力次数范围为1-999'})
  131. data = fill_2_hexByte(hex(remainingGreaterForceCount), 4)
  132. data += '0000'
  133. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  134. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'08','data':data})
  135. self.check_result(devInfo)
  136. def set_next_claw_by_max(self):
  137. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  138. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'02','data':'00000000'})
  139. self.check_result(devInfo)
  140. def get_game_time_line_lenth(self):
  141. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  142. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'05','data':'00000000'})
  143. self.check_result(devInfo)
  144. data = devInfo['data']
  145. return {'gameDuration':int(data[6:10],16),'lineOfDefense':int(data[12:14],16)}
  146. def set_game_time_line_lenth(self,gameDuration,lineOfDefense):
  147. data = fill_2_hexByte(hex(gameDuration), 4)
  148. data += fill_2_hexByte(hex(lineOfDefense), 4)
  149. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  150. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'05','data':data})
  151. self.check_result(devInfo)
  152. def get_ng_status(self):
  153. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  154. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'0B','data':'00000000'})
  155. self.check_result(devInfo)
  156. data = devInfo['data']
  157. code = ''
  158. errDesc,suggestion = u'系统处于正常状态',''
  159. if data[6:8] == '31':
  160. code = int(data[8:10],16)
  161. errInfoDict = self.translate_error_desc(code)
  162. errDesc = errInfoDict.get('desc','')
  163. suggestion = errInfoDict.get('oper','')
  164. return {'ngCode':[{'code':code,'desc':errDesc,'suggestion':suggestion}]}
  165. def get_device_function_by_key(self, key):
  166. if 'c1' in key:
  167. return self.get_claw_values()
  168. elif 'greaterForceCount' in key:
  169. return self.get_claw_maxcount()
  170. elif 'gameDuration' in key:
  171. return self.get_game_time_line_lenth()
  172. elif 'ngCode' in key:
  173. return self.get_ng_status()
  174. def set_device_function_param(self,request, lastSetConf):
  175. if request.POST.has_key('c1'):
  176. c1 = int(request.POST.get('c1', None))
  177. c2 = int(request.POST.get('c2', None))
  178. c3 = int(request.POST.get('c3', None))
  179. c4 = int(request.POST.get('c4', None))
  180. self.set_claw_value(c1, c2, c3, c4)
  181. elif request.POST.has_key('remainingGreaterForceCount'):
  182. greaterForceCount = int(request.POST.get('remainingGreaterForceCount', None))
  183. self.set_claw_maxcount(greaterForceCount)
  184. elif request.POST.has_key('gameDuration'):
  185. gameDuration = int(request.POST.get('gameDuration', None))
  186. lineOfDefense = int(request.POST.get('lineOfDefense', None))
  187. self.set_game_time_line_lenth(gameDuration, lineOfDefense)
  188. def reboot_device(self):
  189. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  190. {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'06','data':'0A0B0C0D'})
  191. self.check_result(devInfo)
  192. def set_device_function(self,request, lastSetConf):
  193. if request.POST.has_key('greaterForce'):
  194. self.set_next_claw_by_max()
  195. elif request.POST.has_key('reboot'):
  196. self.reboot_device()