public override void ParseLogicStep(T_LogicStep Step) { base.ParseLogicStep(Step); Detect = this.Parameters.ToInstance <DetectAction>(); if (Detect.Indexs != null) { injector.Entercloses.AsParallel().ForAll(et => et.Selected = Detect.Indexs.Contains(et.Index)); } }
private static void CallSetup( string tag, string toNumber, bool shouldRun, ManualResetEventSlim waitHandle, Func <CallingEventParams.DetectParams, bool> isDetectValid, Action setSuccessfulDetection, CallDetect detect) { if (!shouldRun) { waitHandle.Set(); sDetect = null; return; } Logger.LogInformation("[{0}] Beginning setup for call to {1}", tag, toNumber); PhoneCall call = sCallingAPI.NewPhoneCall(toNumber, sCallFromNumber); Logger.LogInformation("[{0}] Call created, associating events", tag); call.OnDetectUpdate += (CallingAPI api, Call detectedCall, CallingEventParams detectEventParams, CallingEventParams.DetectParams detectParams) => { if (detectParams.Detect.Parameters.Event == "READY") { return; } if (detectParams.Detect.Parameters.Event == "finished") { if (isDetectValid(detectParams)) { Logger.LogInformation("[{0}] Completed successfully", tag); setSuccessfulDetection(); } // Not necessarily unsuccessful in the else case, e.g. // Human detection gives an event of HUMAN under machine detection, but it can't be "finished" and "HUMAN" at the same time sDetect = null; return; } Logger.LogInformation("[{0}] OnDetect with ID: {1}, {2} for {3}", tag, detectedCall.ID, detectParams.Detect.Type, detectParams.ControlID); if (isDetectValid(detectParams)) { setSuccessfulDetection(); Task.Run(() => { sDetect.Stop(); sDetect = null; }); Logger.LogInformation("[{0}] Completed successfully", tag); } else { Logger.LogError("[{0}] Unsuccessful", tag); } }; Logger.LogInformation("[{0}] OnDetect associated", tag); call.OnEnded += (CallingAPI api, Call endedCall, CallingEventParams stateEventParams, CallingEventParams.StateParams stateParams) => { Logger.LogInformation("[{0}] OnEnded with ID: {1}", tag, endedCall.ID); sDetect = null; waitHandle.Set(); Logger.LogInformation("[{0}] OnEnded complete", tag); }; Logger.LogInformation("[{0}] OnEnded associated", tag); call.OnAnswered += (CallingAPI api, Call answeredCall, CallingEventParams answerEventParams, CallingEventParams.StateParams stateParams) => { Logger.LogInformation("[{0}] OnAnswered with ID: {1}", tag, answeredCall.ID); Task.Run(() => { try { Logger.LogInformation("[{0}] Performing detect", tag); sDetect = answeredCall.DetectAsync(detect); Logger.LogInformation("[{0}] Detect performed", tag); } catch (Exception exc) { Logger.LogError(exc, $"[{tag}] call.Detect failed"); waitHandle.Set(); sDetect = null; return; } }); }; Logger.LogInformation("[{0}] OnAnswered associated", tag); call.OnConnectStateChange += (CallingAPI api, Call connectStateChangeCall, CallingEventParams connectStateChangeEventParams, CallingEventParams.ConnectParams connectStateChangeParams) => { Logger.LogInformation("[{0}] OnConnectStateChange: {1}", tag, connectStateChangeParams.State); }; Logger.LogInformation("[{0}] OnConnectStateChange associated", tag); call.OnReceiveStateChange += (CallingAPI api, Call receiveStateChangeCall, CallingEventParams receiveStateChangeEventParams, CallingEventParams.ReceiveParams receiveStateChangeParams) => { Logger.LogInformation("[{0}] OnReceiveStateChange: {1}", tag, receiveStateChangeParams.CallState); }; Logger.LogInformation("[{0}] OnReceiveStateChange associated", tag); call.OnStateChange += (CallingAPI api, Call stateChangeCall, CallingEventParams stateChangeEventParams, CallingEventParams.StateParams stateChangeParams) => { Logger.LogInformation("[{0}] OnStateChange: {1}", tag, stateChangeParams.CallState); }; Logger.LogInformation("[{0}] OnStateChange associated", tag); try { Logger.LogInformation("[{0}] Executing call", tag); var dialAction = call.Dial(); Logger.LogInformation("[{0}] Call executed", tag); } catch (Exception exc) { Logger.LogError(exc, $"[{tag}] call.DialAsync failed"); waitHandle.Set(); sDetect = null; return; } }
protected override void OnViewLoaded() { base.OnViewLoaded(); Detect = Detect ?? new DetectAction(); }
private bool RunLogic(IList <T_LogicStep> steps, out String msg) { msg = null; var seque_root = Sequence.create(); var seque = Sequence.create(); var resmanager = ResManager.getInstance(); var generater = ActionGenerater.getInstance(); int loop_times = 0; foreach (var step in steps) { switch (step.StepEnum) { case LogicStepEnum.Alert: seque.AddAction(SkCallBackFun.create((ActionBase act_tem) => { ErrorSystem.WriteActError(step.Parameters, true, false, 9999); return(true); })); break; case LogicStepEnum.InitAll: var act_init = opDevice.InitAllDevice(); seque.AddAction(act_init); break; case LogicStepEnum.Centrifuge: { CommonAction action = Convert2T <CommonAction>(step.Parameters); var cen = cenMrg.GetCentrifugeByCode(action.Code); if (cen != null) { if (action.DoAction == 0) //正常离心程序 { int hspeed = (int)cen.Centrifugem.HightSpeed.SetValue; int lspeed = (int)cen.Centrifugem.LowSpeed.SetValue; int htime = (int)cen.Centrifugem.HightSpeedTime.SetValue; int ltime = (int)cen.Centrifugem.LowSpeedTime.SetValue; int uphtime = (int)cen.Centrifugem.AddHSpeedTime.SetValue; int upltime = (int)cen.Centrifugem.AddLSpeedTime.SetValue; int stime = (int)cen.Centrifugem.StopSpeedTime.SetValue; var act = CentrifugeStart.create(cen, 3000000, hspeed, lspeed, htime, ltime, uphtime, upltime, stime); seque.AddAction(act); } else if (action.DoAction == 1) //移动指定卡位 { var resinfo = ResManager.getInstance().SearchGelCard("T_BJ_Centrifuge", action.Code, "", (int)action.SeatIndex); var act = MoveTo.create(cen, 30000, -1, -1, resinfo.CenGelP[resinfo.CountX], 5); seque.AddAction(act); } else if (action.DoAction == 2) //开舱门 { var act = HandOpenCloseDoor.create(handDevice, 3000, action.Code, true); seque.AddAction(act); } else if (action.DoAction == 3) //关舱门 { var act = HandOpenCloseDoor.create(handDevice, 3000, action.Code, false); seque.AddAction(act); } else if (action.DoAction == 4) //初始化 { var act = InitXyz.create(cen, 3000, false, false, true); seque.AddAction(act); } } else { ErrorSystem.WriteActError("找不到指定离心机", true, false, 9999); } } break; case LogicStepEnum.Couveuse: { } break; case LogicStepEnum.Delay: { int DelayTime = Convert.ToInt32(step.Parameters); seque.AddAction(SKSleep.create(DelayTime)); } break; case LogicStepEnum.DetectSquid: { DetectAction action = Convert2T <DetectAction>(step.Parameters); List <Enterclose> iinjects = new List <Enterclose>(); foreach (var entindex in action.Indexs) { iinjects.Add(injDevice.Injector.Entercloses[entindex]); } seque.AddAction(InjectDetector.create(3000, iinjects.ToArray(), IMask.Gen((int)action.Start), IMask.Gen((int)action.ZLimit), IMask.Gen(0))); } break; case LogicStepEnum.SimpleAction: { SimpleAction action = Convert2T <SimpleAction>(step.Parameters); AbstractCanDevice device = null; switch (action.Device) { case "加样器": device = injDevice; break; case "机械手": device = handDevice; break; case "卡仓": device = gelwareDevice; break; case "破孔器": device = gelwareDevice; break; } if (action.Action == "移动") { ActionBase act_move = null; int x = action.Direction == "X" ? (int)action.Value : -1; int y = action.Direction == "Y" ? (int)action.Value : -1; int z = action.Direction == "Z"? (int)action.Value:-1; if (action.Direction == "XYZ") { x = y = z = (int)action.Value; } if (device is InjectorDevice) { act_move = InjectMoveTo.create(device, 3000, injDevice.Injector.Entercloses, x, IMask.Gen(y), IMask.Gen(z)); } else { act_move = MoveTo.create(device, 3000, x, y, z); } seque.AddAction(act_move); } else if (action.Action == "初始化") { ActionBase act_move = null; bool x = action.Direction == "X" ? true : false; bool y = action.Direction == "Y" ? true : false; bool z = action.Direction == "Z" ? true : false; if (action.Direction == "XYZ") { x = y = z = true; } if (device is InjectorDevice) { act_move = InitXyz.create(device, 30000, injDevice.Injector.Entercloses, x, y, z); } else { act_move = InitXyz.create(device, 30000, x, y, z); } seque.AddAction(act_move); } } break; case LogicStepEnum.TakeAndPutDownGel: { GelAction[] actions = Convert2T <GelAction[]>(step.Parameters); seque.AddAction(MoveTo.create(handDevice, 3000, -1, -1, 0)); ResInfoData take_seat = null; if (actions[0].BJType == "T_BJ_GelSeat") { take_seat = resmanager.SearchGelCard("T_BJ_GelSeat", "", "", actions[0].Index, 0, true, actions[0].BJName); generater.GenerateTakeGelFromNormal(take_seat, ref seque); } else if (actions[0].BJType == "T_BJ_Centrifuge") { take_seat = resmanager.SearchGelCard("T_BJ_Centrifuge", "", "", actions[0].Index, 0, true, actions[0].BJName); var act = generater.GenerateTakeGelFromCent(take_seat, "", ref seque); } else if (actions[0].BJType == "T_BJ_GelWarehouse") { take_seat = resmanager.SearchGelCard("T_BJ_GelWarehouse", "", "", actions[0].Index, 0, true, actions[0].BJName); var act = generater.GenerateTakeGelFromWare(take_seat, ref seque); } if (actions[1].BJType == "T_BJ_GelSeat") { var put_seat = resmanager.SearchGelCard("T_BJ_GelSeat", "", "", actions[1].Index, 0, true, actions[1].BJName); generater.GeneratePutGelToNormal(put_seat, take_seat, ref seque); } else if (actions[1].BJType == "T_BJ_Centrifuge") { var put_seat = resmanager.SearchGelCard("T_BJ_Centrifuge", "", "", actions[1].Index, 0, true, actions[1].BJName); generater.GeneratePutGelToCent(put_seat.CenCode, put_seat, take_seat, ref seque); } else if (actions[1].BJType == "T_BJ_GelWarehouse") { var put_seat = resmanager.SearchGelCard("T_BJ_GelWarehouse", "", "", actions[1].Index, 0, true, actions[1].BJName); generater.GeneratePutGelToWare(put_seat, take_seat, ref seque); } } break; case LogicStepEnum.TakeGel: { GelAction action = Convert2T <GelAction>(step.Parameters); ResInfoData take_seat = null; if (action.BJType == "T_BJ_GelSeat") { take_seat = resmanager.SearchGelCard("T_BJ_GelSeat", "", "", action.Index, 0, true, action.BJName); generater.GenerateTakeGelFromNormal(take_seat, ref seque); } else if (action.BJType == "T_BJ_Centrifuge") { take_seat = resmanager.SearchGelCard("T_BJ_Centrifuge", "", "", action.Index, 0, true, action.BJName); var act = generater.GenerateTakeGelFromCent(take_seat, "", ref seque); } else if (action.BJType == "T_BJ_GelWarehouse") { take_seat = resmanager.SearchGelCard("T_BJ_GelWarehouse", "", "", action.Index, 0, true, action.BJName); var act = generater.GenerateTakeGelFromWare(take_seat, ref seque); } break; } case LogicStepEnum.PutDownGel: { GelAction action = Convert2T <GelAction>(step.Parameters); ResInfoData take_seat = resmanager.handseat_resinfo; if (action.BJType == "T_BJ_GelSeat") { var put_seat = resmanager.SearchGelCard("T_BJ_GelSeat", "", "", action.Index, 0, true, action.BJName); generater.GeneratePutGelToNormal(put_seat, take_seat, ref seque); } else if (action.BJType == "T_BJ_Centrifuge") { var put_seat = resmanager.SearchGelCard("T_BJ_Centrifuge", "", "", action.Index, 0, true, action.BJName); generater.GeneratePutGelToCent(put_seat.CenCode, put_seat, take_seat, ref seque); } else if (action.BJType == "T_BJ_GelWarehouse") { var put_seat = resmanager.SearchGelCard("T_BJ_GelWarehouse", "", "", action.Index, 0, true, action.BJName); generater.GeneratePutGelToWare(put_seat, take_seat, ref seque); } break; } case LogicStepEnum.TakeTip: { TakeTipAction action = Convert2T <TakeTipAction>(step.Parameters); var ents = injDevice.Injector.Entercloses.Where(ent => ent.Valid && action.Indexs.Contains(ent.Index)).ToArray(); var tipseat = Constants.BJDict[typeof(T_BJ_Tip).Name].Where(item => item.Name == action.TipBoxName).FirstOrDefault() as T_BJ_Tip; List <ActionPoint> tip_seat = new List <ActionPoint>(); foreach (var ent in ents) { int x = (int)(tipseat.X - action.C * tipseat.GapX); int y = (int)(tipseat.Y + action.R * tipseat.GapY); var point = new ActionPoint(); point.x = x; point.y = y; point.z = (int)tipseat.Limit; point.type = TestStepEnum.JXZT; point.index = ent.Index; tip_seat.Add(point); } var sequ_taketip = Sequence.create(); var move_act = InjectMoveActs.create(injDevice, 3000, tip_seat.ToArray(), false); sequ_taketip.AddAction(InjectMoveTo.create(injDevice, 3000, ents, -1, IMask.Gen(-1), IMask.Gen(0))); sequ_taketip.AddAction(move_act); seque.AddAction(sequ_taketip); } break; case LogicStepEnum.OutTip: { TakeTipAction action = Convert2T <TakeTipAction>(step.Parameters); var ents = injDevice.Injector.Entercloses.Where(ent => ent.Valid && action.Indexs.Contains(ent.Index)).ToArray(); var sequ_puttip = Sequence.create(); List <ActionPoint> unload_seat = new List <ActionPoint>(); var inject_unload = resmanager.unload_list; if (inject_unload.Count() == 1) { var unloader = inject_unload[0]; for (int i = 0; i < 4; i++) { var unload_point = new ActionPoint((int)unloader.X, (int)unloader.Y + i * (int)unloader.FZ, (int)unloader.Z, TestStepEnum.JXZT); unload_point.puttip_x = (int)unloader.FirstX; unload_seat.Add(unload_point); } sequ_puttip.AddAction(InjectMoveTo.create(injDevice, 3000, ents, -1, IMask.Gen(-1), IMask.Gen(0))); sequ_puttip.AddAction(InjectMoveActs.create(injDevice, 3000, unload_seat.ToArray(), true)); seque.AddAction(sequ_puttip); } } break; case LogicStepEnum.Piercer: { var paper_seat = resmanager.GetResByCode("", "T_BJ_GelSeat", "", "4"); seque.AddAction(PaperCard.create(pieDevice, 3000, paper_seat, 0)); } break; case LogicStepEnum.LoopStart: { LogicLoop logicLoop = Convert2T <LogicLoop>(step.Parameters); loop_times = logicLoop.Count; seque_root.AddAction(seque); seque = Sequence.create(); } break; case LogicStepEnum.LoopEnd: { var act_repat = Repeat.create(seque, loop_times); seque_root.AddAction(act_repat); seque = Sequence.create(); loop_times = 0; } break; } } seque_root.AddAction(seque); seque_root.runAction(opDevice); return(true); }
private bool GetActionFlag(SpeedhackAction action) { return(DetectAction.HasFlag(action)); }
private static void CallMachineReady(string toNumber) { const string tag = "Machine Ready"; Logger.LogInformation("[{0}] Beginning setup for call to {1}", tag, toNumber); PhoneCall call = sCallingAPI.NewPhoneCall(toNumber, sCallFromNumber); Logger.LogInformation("[{0}] Call created, associating events", tag); call.OnDetectUpdate += (CallingAPI api, Call detectedCall, CallingEventParams detectEventParams, CallingEventParams.DetectParams detectParams) => { if (detectParams.Detect.Parameters.Event == "READY") { Logger.LogInformation("[{0}] Completed successfully", tag); sMachineReadySuccessful = true; sMachineReadyCompleted.Set(); return; } if (detectParams.Detect.Parameters.Event == "MACHINE") { // We do expect one of these since usually MACHINE occurs before READY return; } Logger.LogInformation("[{0}] OnDetect with ID: {1}, {2} for {3}", tag, detectedCall.ID, detectParams.Detect.Type, detectParams.ControlID); Logger.LogError("[{0}] Unsuccessful", tag); }; Logger.LogInformation("[{0}] OnDetect associated", tag); call.OnEnded += (CallingAPI api, Call endedCall, CallingEventParams stateEventParams, CallingEventParams.StateParams stateParams) => { Logger.LogInformation("[{0}] OnEnded with ID: {1}", tag, endedCall.ID); sDetect = null; sMachineReadyCompleted.Set(); Logger.LogInformation("[{0}] OnEnded complete", tag); }; Logger.LogInformation("[{0}] OnEnded associated", tag); call.OnAnswered += (CallingAPI api, Call answeredCall, CallingEventParams answerEventParams, CallingEventParams.StateParams stateParams) => { Logger.LogInformation("[{0}] OnAnswered with ID: {1}", tag, answeredCall.ID); Task.Run(() => { try { Logger.LogInformation("[{0}] Performing detect", tag); var detectResult = answeredCall.DetectAnsweringMachine(waitForBeep: true); Logger.LogInformation("[{0}] Detect performed", tag); } catch (Exception exc) { Logger.LogError(exc, $"[{tag}] call.Detect failed"); sMachineReadyCompleted.Set(); sDetect = null; return; } }); }; Logger.LogInformation("[{0}] OnAnswered associated", tag); call.OnConnectStateChange += (CallingAPI api, Call connectStateChangeCall, CallingEventParams connectStateChangeEventParams, CallingEventParams.ConnectParams connectStateChangeParams) => { Logger.LogInformation("[{0}] OnConnectStateChange: {1}", tag, connectStateChangeParams.State); }; Logger.LogInformation("[{0}] OnConnectStateChange associated", tag); call.OnReceiveStateChange += (CallingAPI api, Call receiveStateChangeCall, CallingEventParams receiveStateChangeEventParams, CallingEventParams.ReceiveParams receiveStateChangeParams) => { Logger.LogInformation("[{0}] OnReceiveStateChange: {1}", tag, receiveStateChangeParams.CallState); }; Logger.LogInformation("[{0}] OnReceiveStateChange associated", tag); call.OnStateChange += (CallingAPI api, Call stateChangeCall, CallingEventParams stateChangeEventParams, CallingEventParams.StateParams stateChangeParams) => { Logger.LogInformation("[{0}] OnStateChange: {1}", tag, stateChangeParams.CallState); }; Logger.LogInformation("[{0}] OnStateChange associated", tag); try { Logger.LogInformation("[{0}] Executing call", tag); var dialAction = call.Dial(); Logger.LogInformation("[{0}] Call executed", tag); } catch (Exception exc) { Logger.LogError(exc, $"[{tag}] call.DialAsync failed"); sMachineReadyCompleted.Set(); sDetect = null; return; } }