public ReportBase BuildTables( Object context, BackgroundWorker worker, int refreshMS )
{
Debug.WriteLine( String.Format( "{0}() ThreadID = {1}", System.Reflection.MethodInfo.GetCurrentMethod( ).Name, Thread.CurrentThread.ManagedThreadId ) );
if ( IsDisposed )
throw new ObjectDisposedException( "LakeChabotReader" );
if ( Mode != rfidReader.OperationMode.BoundToReader )
return new rfidSimpleReport( context, OperationOutcome.FailByContext,
new rfidException( rfidErrorCode.ReaderIsNotBound, "Reader must be bound before invoking BuildTables." ) );
if ( _control.State != FunctionControl.FunctionState.Idle )
return new rfidSimpleReport( context, OperationOutcome.FailByContext, new Exception( "Cannot build tables, the prior task has not completed" ) );
if ( null == worker )
return new rfidSimpleReport( context, OperationOutcome.FailByApplicationError, new ArgumentNullException( "worker", "BackgroundWorker is required" ) );
if ( refreshMS < MIN_REFRESH_MS || refreshMS > MAX_REFRESH_MS )
return new rfidSimpleReport( context, OperationOutcome.FailByApplicationError, new ArgumentOutOfRangeException( "refreshMS", refreshMS, string.Format( "Value must be between {0} and {1}", MIN_REFRESH_MS, MAX_REFRESH_MS ) ) );
_refreshRateMS = refreshMS;
_bgdWorker = worker;
_periodTagList.Clear( );
_requestTagList.Clear( );
rfidOperationReport report
= new rfidOperationReport( context,
ElapsedMilliseconds,
RequestCount,
ProcessedAntennaCycleCount,
ProcessedInventoryCycleCount,
BadPacketCount,
CRCErrorCount,
ProcessedPacketCount,
ProcessedRoundCount,
ProcessedInventoryCount,
SessionUniqueTags,
RequestUniqueTags,
CurrentUniqueTags,
SessionDuration );
DateTime ReportDue = DateTime.Now.AddMilliseconds( refreshMS );
OperationOutcome outcome = OperationOutcome.Success;
_control.StartAction( );
int totalPacketsToProcess = FileHandler.TotalPacketCount - ProcessedPacketCount;
int localPacketCount = 0;
PacketData.PacketWrapper envelope;
while ( ( envelope = FileHandler.GetPendingPacket( ) ) != null )
{
localPacketCount++;
ProcessPacket( envelope );
DateTime now = DateTime.Now;
if ( ReportDue.Ticks <= now.Ticks )
{
_bgdWorker.ReportProgress(
( int ) ( 100 * ( ( float ) localPacketCount / ( float ) totalPacketsToProcess ) ),
report.GetProgressReport( ElapsedMilliseconds,
RequestCount,
ProcessedAntennaCycleCount,
ProcessedInventoryCycleCount,
BadPacketCount,
CRCErrorCount,
ProcessedPacketCount,
ProcessedRoundCount,
ProcessedInventoryCount,
SessionUniqueTags,
RequestUniqueTags,
CurrentUniqueTags,
SessionDuration ) );
_periodTagList.Clear( );
ReportDue = now.AddMilliseconds( refreshMS );
}
FunctionControl.RequestedAction action = FunctionController.GetActionRequest( );
if ( action != FunctionControl.RequestedAction.Continue )
{
break;
}
}
switch ( _control.State )
{
case FunctionControl.FunctionState.Stopping:
outcome = OperationOutcome.SuccessWithUserCancel;
break;
case FunctionControl.FunctionState.Aborting:
outcome = OperationOutcome.FailByUserAbort;
break;
case FunctionControl.FunctionState.Running:
outcome = OperationOutcome.Success;
break;
case FunctionControl.FunctionState.Idle:
case FunctionControl.FunctionState.Paused:
case FunctionControl.FunctionState.Unknown:
default:
outcome = OperationOutcome.Unknown;
break;
}
_control.Finished( );
report.OperationCompleted( outcome,
ElapsedMilliseconds,
RequestCount,
RawAntennaCycleCount,
RawInventoryCycleCount,
BadPacketCount,
CRCErrorCount,
RawPacketCount,
RawRoundCount,
RawInventoryCount,
SessionUniqueTags,
RequestUniqueTags,
CurrentUniqueTags,
SessionDuration );
return report;
}