123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- import logging
- import simplejson as json
- from apps.web.constant import FAULT_LEVEL, DeviceCmdCode, ErrorCode, DeviceErrorCodeDesc, FAULT_CODE
- from apps.web.core.adapter.base import SmartBox, fill_2_hexByte
- from apps.web.core.exceptions import ServiceException, DeviceNetworkTimeoutError
- from apps.web.core.networking import MessageSender
- logger = logging.getLogger(__name__)
- class WawajiMaichongBox(SmartBox):
- def __init__(self, device):
- super(WawajiMaichongBox, self).__init__(device)
- # 只需要处理抓到娃娃以及NG的消息。
- def analyze_event_data(self, data):
- if data.has_key('messageType') and data['messageType'] == 'PUT_ITEM':
- return {'funCode':'96'}
-
- if not data.has_key('data'):
- return None
-
- funCode = data['data'][4:6]
- if funCode == '8B':
- if data['data'][6:8] != '31':
- return None
- errCode = data['data'][8:10]
- errInfo = self.translate_error_desc(errCode)
- return {'funCode':'8B','faultName':errInfo.get('desc',''),'faultCode':FAULT_CODE.WAWAJI_WUMAHANG_NG,
- 'level':FAULT_LEVEL.NORMAL,
- 'desc':errInfo.get('oper','')
- }
- elif funCode == '96':
- if int(data['data'][12:14],16) > 1:
- return None
- return {'funCode':'96'}
-
- return None
-
- def translate_error_desc(self,errCode):
- errDict = {
- '01':{'desc':u'CPU故障','oper':u'1.更换U1 CPU。\n2.PCB故障。'},
- '02':{'desc':u'收线故障','oper':u'1.检查当收线时,上停SW是否确实弹开。\n2.检查上停SW是否故障。\n3.天车组的空中接头是否有接触不良的情形?\n4.主板上的J9 PIN是否有松脱接触不良情形?\n5.主板故障。'},
- '03':{'desc':u'防线故障','oper':u'1.检查绕线机的线是否有乱线的情形?\n2.检查上停SW是否故障。\n3.天车组的空中接头是否有接触不良的情形?\n4.主板上的J9 PIN是否有松脱接触不良情形?\n5.主板故障。'},
- '04':{'desc':u'出货SENSOR故障','oper':u'1.请检查是否灵敏度过高?请调整灵敏度VR,使排电的LED处于“暗”的状态\n2.J5电眼线是否脱落?\n3.电眼故障。\n4.主板故障。'},
- '05':{'desc':u'前停SW或后停SW故障','oper':u'1.检查前停SW或后停SW是否故障?\n2.天车组的空中接头是否有接触不良的情形?\n3.主板上的J9 PIN是否有松动接触不良的情形?\n4.主板故障。'},
- '06':{'desc':u'左停SW故障','oper':u'1.检查左停SW是否故障?\n2.天车组的空中接头是否有接触不良的情形?\n3.主板上的J9 PIN是否有松动接触不良的情形?\n4.主板故障。'},
- '07':{'desc':u'Coin1(投币1)表故障','oper':u'1.检查J5的插PIN是否有接触不良的情形\n2.计数器是否有故障?插PIN是否有松动?\n3.主板故障。'},
- '09':{'desc':u'出货表离线','oper':u'1.检查J5的插PIN是否有接触不良的情形\n2.计数器是否有故障?插PIN是否有松动?\n3.主板故障。'},
- '11':{'desc':u'Coin1(投币1)投币超时','oper':u'1.投币器故障。\n2.玩家钓鱼。'},
- '14':{'desc':u'93C66故障','oper':u'1.更换93C66。'}
- }
- return errDict.get(errCode,None)
-
- def check_result(self,devInfo):
- if devInfo.has_key('rst') and devInfo['rst'] != 0:
- if devInfo['rst'] == -1:
- raise ServiceException(
- {'result': 2, 'description': u'娃娃机正在玩命找网络,请您稍候再试'})
- elif devInfo['rst'] == 1:
- raise ServiceException(
- {'result': 2, 'description': u'娃娃机忙,无响应,请您稍候再试。也可能是您的设备版本过低,暂时不支持此功能'})
-
- def check_dev_status(self, attachParas = None):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'8B','data':'000000'})
- self.check_result(devInfo)
-
- if devInfo['data'][6:8] == '31':
- errInfo = self.translate_error_desc(devInfo['data'][8:10])
- raise ServiceException({'result': 0, 'description': u'设备故障:%s,暂时无法使用' % errInfo.get('desc','')})
-
- def test(self, coins):
- return MessageSender.net_pay(self.device, 1, timeout = 120)
- def start_device(self, package, openId, attachParas):
- pay_count = int(package['coins'])
- result = MessageSender.net_pay(self.device, pay_count, timeout = 120)
- if result['rst'] == ErrorCode.DEVICE_CONN_FAIL:
- raise DeviceNetworkTimeoutError()
- elif result['rst'] != ErrorCode.DEVICE_SUCCESS:
- logger.debug('WawajiMaichongBox() failed to start, result was=%s' % (json.dumps(result),))
- raise ServiceException({'result': 2, 'description': DeviceErrorCodeDesc.get(result['rst'])})
- return result
- def get_total_coin(self):
- result = MessageSender.send(self.device, DeviceCmdCode.GET_DEVINFO,
- {'cmd': DeviceCmdCode.GET_DEVINFO, 'IMEI': self._device['devNo']})
- if result['rst'] != ErrorCode.DEVICE_SUCCESS:
- logger.debug('WawajiMaichongBox() failed to get total coin, result was=%s' % (json.dumps(result),))
- description = u'当前设备信号弱没有响应,请您稍后重试。'
- raise ServiceException({'result': 2, 'description': description})
- if not result.has_key('total_coin'):
- raise ServiceException({'result': 2, 'description': u'当前设备暂时不支持获取总的硬币数目,待版本自动升级后,会支持'})
- return result['total_coin']
- # 基类函数,检查告警状态,只能做一个简单的检查,设备是否在线
- def check_alarm(self, alarm):
- if alarm.faultCode == FAULT_CODE.OFFLINE:
- dev_info = MessageSender.send(device = self.device,
- cmd = DeviceCmdCode.GET_DEVINFO,
- payload = {'IMEI': self.device.devNo, 'fields': []},
- timeout = 15)
- if dev_info['rst'] == 0:
- return u'设备状态检查在线,网络通畅,网络可能出现闪断'
- else:
- raise ServiceException({'result': 2, 'description': u'设备玩命也无法找到网络,设备可能不在线'})
- elif alarm.faultCode == FAULT_CODE.WAWAJI_WUMAHANG_NG:
- self.check_dev_status()
- return u'设备状态正常,故障已经恢复'
- else:
- return u'无法检查该设备的告警状态,建议您用其他方式确认此告警是否正常'
- def get_claw_values(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'07','data':'C1C2C3C4'})
- self.check_result(devInfo)
- data = devInfo['data']
- 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)}
-
- def set_claw_value(self,c1,c2,c3,c4):
- if c1<0 or c1 >48:
- raise ServiceException({'result': 2, 'description': u'c1的抓力范围为0-48'})
- if c2<0 or c2 >48:
- raise ServiceException({'result': 2, 'description': u'c2的抓力范围为0-48'})
- if c3<0 or c3 >48:
- raise ServiceException({'result': 2, 'description': u'c3的抓力范围为0-48'})
- if c4<0 or c4 >48:
- raise ServiceException({'result': 2, 'description': u'c4的抓力范围为0-48'})
-
- data = fill_2_hexByte(hex(c1), 2)
- data += fill_2_hexByte(hex(c2), 2)
- data += fill_2_hexByte(hex(c3), 2)
- data += fill_2_hexByte(hex(c4), 2)
-
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'01','data':data})
- self.check_result(devInfo)
-
- def get_claw_maxcount(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'08','data':'00000000'})
- self.check_result(devInfo)
- data = devInfo['data']
- return {'greaterForceCount':int(data[6:10],16),'remainingGreaterForceCount':int(data[10:14],16)}
-
- def set_claw_maxcount(self,remainingGreaterForceCount):
- if remainingGreaterForceCount<1 or remainingGreaterForceCount >999:
- raise ServiceException({'result': 2, 'description': u'大力次数范围为1-999'})
-
- data = fill_2_hexByte(hex(remainingGreaterForceCount), 4)
- data += '0000'
-
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'08','data':data})
- self.check_result(devInfo)
-
- def set_next_claw_by_max(self):
-
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'02','data':'00000000'})
- self.check_result(devInfo)
-
- def get_game_time_line_lenth(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'05','data':'00000000'})
- self.check_result(devInfo)
- data = devInfo['data']
- return {'gameDuration':int(data[6:10],16),'lineOfDefense':int(data[12:14],16)}
-
- def set_game_time_line_lenth(self,gameDuration,lineOfDefense):
- data = fill_2_hexByte(hex(gameDuration), 4)
- data += fill_2_hexByte(hex(lineOfDefense), 4)
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'05','data':data})
- self.check_result(devInfo)
-
- def get_ng_status(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'0B','data':'00000000'})
- self.check_result(devInfo)
- data = devInfo['data']
- code = ''
- errDesc,suggestion = u'系统处于正常状态',''
- if data[6:8] == '31':
- code = int(data[8:10],16)
- errInfoDict = self.translate_error_desc(code)
- errDesc = errInfoDict.get('desc','')
- suggestion = errInfoDict.get('oper','')
-
- return {'ngCode':[{'code':code,'desc':errDesc,'suggestion':suggestion}]}
-
-
- def get_device_function_by_key(self, key):
- if 'c1' in key:
- return self.get_claw_values()
- elif 'greaterForceCount' in key:
- return self.get_claw_maxcount()
- elif 'gameDuration' in key:
- return self.get_game_time_line_lenth()
- elif 'ngCode' in key:
- return self.get_ng_status()
-
- def set_device_function_param(self,request, lastSetConf):
- if request.POST.has_key('c1'):
- c1 = int(request.POST.get('c1', None))
- c2 = int(request.POST.get('c2', None))
- c3 = int(request.POST.get('c3', None))
- c4 = int(request.POST.get('c4', None))
- self.set_claw_value(c1, c2, c3, c4)
- elif request.POST.has_key('remainingGreaterForceCount'):
- greaterForceCount = int(request.POST.get('remainingGreaterForceCount', None))
- self.set_claw_maxcount(greaterForceCount)
- elif request.POST.has_key('gameDuration'):
- gameDuration = int(request.POST.get('gameDuration', None))
- lineOfDefense = int(request.POST.get('lineOfDefense', None))
- self.set_game_time_line_lenth(gameDuration, lineOfDefense)
-
- def reboot_device(self):
- devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
- {'cmd': DeviceCmdCode.OPERATE_DEV_SYNC, 'IMEI': self._device['devNo'],'funCode':'06','data':'0A0B0C0D'})
- self.check_result(devInfo)
- def set_device_function(self,request, lastSetConf):
- if request.POST.has_key('greaterForce'):
- self.set_next_claw_by_max()
- elif request.POST.has_key('reboot'):
- self.reboot_device()
|