# -*- 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()