/// <summary> /// Called when the receiver reports data from a device indicating a hit has registered. /// We need to update the scorekeeper service if a game is in progress. /// </summary> /// <param name="deviceData">The sensor impact data.</param> protected void OnSensorHit(DeviceDataEventArgs deviceData) { CompetitorModel competitor = this.ScoreKeeperService.Competitors.FirstOrDefault(c => c.DeviceId.Equals(deviceData.DeviceId)); if (competitor != null) { byte impactLevel = Math.Max(deviceData.HeadHitValue, deviceData.VestHitValue); // If we are in partnering mode, we need to flip to award score/impact to the correct person if (competitor.HasPartner) competitor = competitor.Partner; competitor.LastImpactLevel = impactLevel; if (!this.StopWatchService.IsRunning && this.StopWatchService.DisplayTime == this.StopWatchService.Duration) { competitor.Score = competitor.HighestImpactLevel; } else if (this.StopWatchService.IsRunning && impactLevel >= competitor.RequiredImpactLevel) { competitor.Score += 1; // TODO: Allow configurable points this.Logger.Log("KickAndPunch score for " + competitor.DisplayName + " is now " + competitor.Score, Category.Info, Priority.Low); } } }
/// <summary> /// Raises the <see cref="E:HitReceived"/> event. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="LaJust.EIDSS.Communications.Entities.DeviceDataEventArgs"/> instance containing the event data.</param> protected virtual void OnStrikeDetected(object sender, DeviceDataEventArgs e) { EventHandler<DeviceDataEventArgs> handler = this.StrikeDetected; try { handler(this, e); } catch (Exception ex) { Trace.TraceError("{0}.OnStrikeDetected: {1}", CLASSNAME, ex.GetBaseException()); throw; } }
/// <summary> /// Processes the strike received for V2 receiver (EIDSS 3.0) /// </summary> /// <param name="e">The <see cref="LaJust.EIDSS.Communications.Hardware.DataPacketReceivedEventArgs"/> instance containing the event data.</param> /// <returns>Device Event Data</returns> private DeviceDataEventArgs Process_TargetDataReceivedV2(DataPacketReceivedEventArgs e) { // Generate acknowledgement packet and send to receiver this.receiverComm.SendDataPacket(new byte[3] { e.DataPacket[(int)TargetDataFieldsV2.GameNumber], (byte)OpCodeCmds.Acknowledgement, e.DataPacket[(int)TargetDataFieldsV2.SequenceNumber] }); // Parse data packet DeviceDataEventArgs deviceData = new DeviceDataEventArgs() { ReceiverId = this.Id, GameNumber = e.DataPacket[(byte)TargetDataFieldsV2.GameNumber], OperationCode = (OpCodes)e.DataPacket[(byte)TargetDataFieldsV2.OpCode], RegistrationSequence = e.DataPacket[(byte)TargetDataFieldsV2.RegSequence], VestHitValue = e.DataPacket[(byte)TargetDataFieldsV2.VestHitValue], HeadHitValue = e.DataPacket[(byte)TargetDataFieldsV2.HeadHitValue], // Remove "touch sensor" bit from wet bag panel byte by AND with 0x77 (0111 0111) WetBagPanel = (WetBagPanelEnum)(e.DataPacket[(byte)TargetDataFieldsV2.TargetPanel] & 0x77), // Determine "touch sensor" bit from wet bag panel byte by checking 0x08 or 0x80 bits TouchStatus = (((e.DataPacket[(byte)TargetDataFieldsV2.TargetPanel] & 0x08) == 0x08) || ((e.DataPacket[(byte)TargetDataFieldsV2.TargetPanel] & 0x80) == 0x80)) ? TouchSensorStatusEnum.Required : TouchSensorStatusEnum.NotRequired, DeviceStatus = (DeviceStatusEnum)e.DataPacket[(byte)TargetDataFieldsV2.TargetStatus], DeviceId = new DeviceId(e.DataPacket[(byte)TargetDataFieldsV2.ID1], e.DataPacket[(byte)TargetDataFieldsV2.ID2], e.DataPacket[(byte)TargetDataFieldsV2.ID3]), SequenceNumber = e.DataPacket[(byte)TargetDataFieldsV2.SequenceNumber], TargetNumber = e.DataPacket[(byte)TargetDataFieldsV2.TargetNumber], TargetTotal = e.DataPacket[(byte)TargetDataFieldsV2.TargetTotal] }; return deviceData; }
/// <summary> /// Processes the strike received for V2 receiver (EIDSS 3.0) /// </summary> /// <param name="e">The <see cref="LaJust.EIDSS.Communications.Hardware.DataPacketReceivedEventArgs"/> instance containing the event data.</param> /// <returns>Device Event Data</returns> private DeviceDataEventArgs Process_HoguDataReceivedV2(DataPacketReceivedEventArgs e) { // Generate acknowledgement packet and send to receiver this.receiverComm.SendDataPacket(new byte[3] { e.DataPacket[(byte)HoguDataFieldsV2.GameNumber], (byte)OpCodeCmds.Acknowledgement, e.DataPacket[(byte)HoguDataFieldsV2.SequenceNumber] }); // Parse data packet DeviceDataEventArgs deviceData = new DeviceDataEventArgs() { ReceiverId = this.Id, GameNumber = e.DataPacket[(byte)HoguDataFieldsV2.GameNumber], OperationCode = (OpCodes)e.DataPacket[(byte)HoguDataFieldsV2.OpCode], RegistrationSequence = e.DataPacket[(byte)HoguDataFieldsV2.RegSequence], VestHitValue = e.DataPacket[(byte)HoguDataFieldsV2.VestHitValue], HeadHitValue = e.DataPacket[(byte)HoguDataFieldsV2.HeadHitValue], TouchStatus = (TouchSensorStatusEnum)e.DataPacket[(byte)HoguDataFieldsV2.TouchStatus], DeviceStatus = (DeviceStatusEnum)e.DataPacket[(byte)HoguDataFieldsV2.HoguStatus], DeviceId = new DeviceId(e.DataPacket[(byte)HoguDataFieldsV2.ID1], e.DataPacket[(byte)HoguDataFieldsV2.ID2], e.DataPacket[(byte)HoguDataFieldsV2.ID3]), SequenceNumber = e.DataPacket[(byte)HoguDataFieldsV2.SequenceNumber] }; return deviceData; }
/// <summary> /// Processes the strike received for version 1 receiver (EIDSS 2.0) /// </summary> /// <param name="e">The <see cref="LaJust.EIDSS.Communications.Hardware.DataPacketReceivedEventArgs"/> instance containing the event data.</param> /// <returns>Device Event Data</returns> #if EIDSS2 private DeviceDataEventArgs Process_HoguDataReceivedV1(DataPacketReceivedEventArgs e) { // Generate acknowledgement packet and send to receiver this.receiverComm.SendDataPacket(new byte[3] { e.DataPacket[(byte)HoguDataFieldsV1.GameNumber], (byte)OpCodeCmds.Acknowledgement, e.DataPacket[(byte)HoguDataFieldsV1.SequenceNumber] }); // Parse data packet DeviceDataEventArgs deviceData = new DeviceDataEventArgs() { ReceiverId = this.Id, GameNumber = e.DataPacket[(byte)HoguDataFieldsV1.GameNumber], OperationCode = (OpCodes)e.DataPacket[(byte)HoguDataFieldsV1.OpCode], RegistrationSequence = e.DataPacket[(byte)HoguDataFieldsV1.RegSequence], VestHitValue = e.DataPacket[(byte)HoguDataFieldsV1.VestHitValue], HeadHitValue = e.DataPacket[(byte)HoguDataFieldsV1.HeadHitValue], TouchStatus = (TouchSensorStatusEnum)e.DataPacket[(byte)HoguDataFieldsV1.TouchStatus], DeviceStatus = (DeviceStatusEnum)e.DataPacket[(byte)HoguDataFieldsV1.HoguStatus], SequenceNumber = e.DataPacket[(byte)HoguDataFieldsV1.SequenceNumber] }; // Insert device Id information we stored during registration as V1 data packet does not include it switch (deviceData.OperationCode) { case OpCodes.ChungDataV1: deviceData.DeviceId = this.chungDeviceId; break; case OpCodes.HongDataV1: deviceData.DeviceId = this.hongDeviceId; break; } return deviceData; }
/// <summary> /// Publish the event data. /// </summary> /// <param name="deviceData">The device data.</param> private void Publish_EventData(DeviceDataEventArgs deviceData) { // Check for duplicate packet if (deviceData.SequenceNumber == this.lastSeqNumber) { return; } else { this.lastSeqNumber = deviceData.SequenceNumber; } // Validate known device Id if (!deviceData.DeviceId.IsValid() || !this.deviceRegistrations.ContainsKey(deviceData.DeviceId)) { Trace.TraceWarning("{0}.Process_EventData: Unknown device id. ID={1}", CLASSNAME, deviceData.DeviceId); return; } // Validate registration sequence if (this.deviceRegistrations[deviceData.DeviceId].RegistrationSequence != deviceData.RegistrationSequence) { Trace.TraceWarning("{0}.Process_EventData: Incorrect registration sequence. ID={1} Expected={2} Actual={3}", CLASSNAME, deviceData.DeviceId, this.deviceRegistrations[deviceData.DeviceId], deviceData.RegistrationSequence); return; } // Trace/Debug Information (only if we have listeners) if (Trace.Listeners.Count > 0) { Trace.TraceInformation( "{0}.Process_EventData: OpCode={1} Match={2} RegSeq={3} VestHit={4} HeadHit={5} Touch={6} Status={7} Id={8} TgtNum={9} TgtTot={10} Panel={11} Seq={12}", CLASSNAME, deviceData.OperationCode, deviceData.GameNumber, deviceData.RegistrationSequence, deviceData.VestHitValue, deviceData.HeadHitValue, deviceData.TouchStatus, deviceData.DeviceStatus, deviceData.DeviceId, deviceData.TargetNumber, deviceData.TargetTotal, deviceData.WetBagPanel, deviceData.SequenceNumber); } // Send device status update event ThreadPool.QueueUserWorkItem(delegate { this.OnDeviceStatusUpdate(new DeviceStatusEventArgs() { ReceiverId = this.Id, DeviceId = deviceData.DeviceId, DeviceStatus = deviceData.DeviceStatus }); }); // If the pressure of head or vest is greater than zero send a strike impact event if (deviceData.HeadHitValue > 0 || deviceData.VestHitValue > 0) { // code to software patch sensor issue 12/19/09 if (deviceData.WetBagPanel == WetBagPanelEnum.BottomMiddle) { deviceData.VestHitValue = (byte)((double)deviceData.VestHitValue * 1.20); } ThreadPool.QueueUserWorkItem(delegate { this.OnStrikeDetected(deviceData); }); } }