Beispiel #1
0
        internal override bool processAnswerString(string a)
        {
            if (!base.processAnswerString(a))
            {
                _status = PowerStatus.UNKNOWN;
                return false;
            }

            if(_cmdDetail == Power.QUERY){
                a = a.Replace("%1POWR=", "");
                int retVal = int.Parse(a);
                if (retVal >= (int)PowerStatus.OFF && retVal <= (int)PowerStatus.WARMUP)
                    _status = (PowerStatus)(retVal);
                else
                    _status = PowerStatus.UNKNOWN;
            }

            return true;
        }
Beispiel #2
0
        /// <summary>
        /// Handle data from the client sockets
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void SL_DataReceived(object sender, SocketAsyncEventArgs e)
        {
            Socket s = e.UserToken as Socket;
            System.Net.IPEndPoint ep = (System.Net.IPEndPoint)s.RemoteEndPoint;

            packets = Interlocked.Increment(ref packets);
            // call the specific instrument handler here using the ID.
            // This routine is needed if there are more than one type of instrument.
            // match with port it came from, each connection will have a different port.
            LMInstrument activeInstr = Instruments.Active.MatchByPort(ep.Port);  // dev note: this might be slow, could speed up this by switching to a map rather than a list
            bool verbose = gControl.collog.ShouldTrace(LogLevels.Verbose);
            if (verbose)
            {
                PacketLogSLOW(activeInstr, e);
            }
            if (activeInstr.DAQState == DAQInstrState.ReceivingData)
            {
                activeInstr.NumProcessedRawDataBuffers++;

                if (verbose) /* diag buffer tracing */
                {
                    string temp = string.Format("{0}: bytes {1}, total bytes {2}, LM {3}",
                                             activeInstr.NumProcessedRawDataBuffers, e.BytesTransferred, numTotalBytes, Instruments.Active.IndexOf(activeInstr));
                    gControl.collog.TraceEvent(LogLevels.Verbose, 686, temp);
                }

                try
                {

                    if (CurState.IsQuitRequested)
                        throw new AnalysisDefs.CancellationRequestedException();
                    else if ((e.BytesTransferred % 2) == 0) // EVEN messages are data.
                    {
                        // dev note: file writing is controlled via LiveFileWrite
                        (activeInstr.file as NCCFile.NCDFile).Write(e.Buffer, e.Offset, e.BytesTransferred);

                        try
                        {
                            // this method copies the buffer and sends it on to neutron counting
                            var res = activeInstr.RDT.PassBufferToTheCounters(e.Buffer, e.Offset, e.BytesTransferred);
                            if (res != null) //Handle this error condition as if it is a regular ODD-count packet with the end marker
                            {
                                HandleEndOfCycleProcessing(activeInstr, res);
                            }
                        }
                        catch (Exception ex)
                        {
                            HandleFatalGeneralError(activeInstr, ex);
                        }
                    }
                    else //    ODD - last data is the status message.
                    {
                        try
                        {
                            LMComm.LMMMLingo.Tokens response = LMMMComm.DataPacketResponseMatch(e.Buffer, e.Offset, e.BytesTransferred);
                            // command parsing here should be as fast as possible because data collection is active and may be hampered by even short delays in this section
                            // it is a status message, the last message of an assay
                            if (response == LMComm.LMMMLingo.Tokens.statusdata) // dev note: must be odd length and end with '......' or '......' (old style) or else start with 'Status\r\n' (new style Nov. 2010)
                            {
                                try // // write the last message to the file.This might be a partial data + last message
                                {
                                    (activeInstr.file as NCCFile.NCDFile).Write(e.Buffer, e.Offset, e.BytesTransferred);
                                    (activeInstr.file as NCCFile.NCDFile).CloseWriter();
                                }
                                catch (Exception fex)
                                {
                                    if ((activeInstr.file as NCCFile.NCDFile).stream != null)
                                        gControl.collog.TraceEvent(LogLevels.Error, 642, "{0}: error on close {1}", (activeInstr.file as NCCFile.NCDFile).stream.Name, fex.Message);
                                }

                                var res = activeInstr.RDT.PassBufferToTheCounters(e.Buffer, e.Offset, e.BytesTransferred);
                                HandleEndOfCycleProcessing(activeInstr, res);
                            }
                            else if (response == LMComm.LMMMLingo.Tokens.tosenddatasize) // this says how many bytes are going to be sent
                            {
                                numTotalBytes = LMMMComm.ResponseToSendDataSize(e.Buffer, e.Offset, e.BytesTransferred);  // t
                                gControl.collog.TraceEvent(LogLevels.Verbose, 654, "Expecting " + Convert.ToString(numTotalBytes) + " (to sen)");
                            }
                            else if (response == LMComm.LMMMLingo.Tokens.unrecognizeddata) // unrecognized command
                            {
                                string temp = LMMMComm.ResponseUnrecoSample(e.Buffer, e.Offset, e.BytesTransferred);
                                gControl.collog.TraceInformation(temp);
                            }
                            else // it might be an odd message with some data tacked on the beginning
                            {
                                if (gControl.collectingFileData)
                                {
                                    (activeInstr.file as NCCFile.NCDFile).Write(e.Buffer, e.Offset, e.BytesTransferred);
                                    (activeInstr.file as NCCFile.NCDFile).CloseWriter();
                                }
                                if (response == LMComm.LMMMLingo.Tokens.rates) // somehow got a rates block
                                {
                                    RatesStatus p = new RatesStatus();
                                    String received = LMMMComm.NonDataResponse(e.Buffer, e.Offset, e.BytesTransferred);
                                    LMMMComm.SplitRatesReadResponse(received, ref p);
                                    gControl.collog.TraceInformation("ReceivingData rates {0} on LM {1}:{2}", p.ToString(), Instruments.Active.IndexOf(activeInstr), activeInstr.id.DetectorId);
                                }
                                CurState.State = DAQInstrState.Online;
                                gControl.collog.TraceInformation("Cycle " + CurState.Measurement.CurrentRepetition + " complete");
                                if ((CurState.Measurement.CurrentRepetition < CurState.Measurement.RequestedRepetitions) || (CurState.Measurement.RequestedRepetitions == 0))
                                {
                                    bool ok = activeInstr.RDT.EndOfCycleProcessing(CurState.Measurement);
                                    if (ok)
                                    {
                                        gControl.FireEvent(EventType.ActionInProgress, gControl);
                                        gControl.StartLM_SRAssay();
                                    }
                                    else
                                        gControl.MajorOperationCompleted(); // the overall pend handle used by cmd line
                                }
                                else
                                {
                                    gControl.collog.TraceInformation("All assay cycles completed, but with data in an odd-sized packet");
                                    bool ok = activeInstr.RDT.EndOfCycleProcessing(CurState.Measurement, last:true);
                                    gControl.MajorOperationCompleted(); // the overall pend handle used by cmd line
                                }
                            }
                        }
                        catch (AnalysisDefs.FatalNeutronCountingException fae)  // propagated up from the AnalysisHandler
                        {
                            HandleFatalGeneralError(activeInstr, fae);
                        }
                        catch (AnalysisDefs.CancellationRequestedException)  // thrown from this method
                        {
                            StopActiveAssayImmediately();
                        }
                        catch (Exception oddex)
                        {
                            gControl.collog.TraceEvent(LogLevels.Error, 643, "Internal error, stopping active processing, {0}: Odd data length handler: {1}",
                                activeInstr.NumProcessedRawDataBuffers, oddex.Message);
                            HandleFatalGeneralError(activeInstr, oddex);
                        }
                    }
                }
                catch (AnalysisDefs.CancellationRequestedException)  // thrown from this method
                {
                    StopActiveAssayImmediately();
                }
                if (verbose) gControl.collog.Flush();
            }
            else if (activeInstr.DAQState == DAQInstrState.Online || activeInstr.DAQState == DAQInstrState.HVCalib) // we are not taking data.
            {
                String received = LMMMComm.NonDataResponse(e.Buffer, e.Offset, e.BytesTransferred);

                if (activeInstr.IsNew())
                {
                    string iname = String.Empty;
                    string type = InstrType.LMMM.ToString();
                    LMMMComm.SplitBroadcastResponse(received, ref type, ref iname, ref activeInstr.id.version);
                    activeInstr.id.DetectorId = iname;
                    activeInstr.id.SetSRType(type);
                    gControl.collog.TraceInformation("The new instrument is " + LMLoggers.LognLM.FlattenChars(received));
                    gControl.collog.TraceInformation(Instruments.All.Count + " instrument(s) online");
                    activeInstr.selected = true;  // this should only be set if there is no UI
                    CurState.State = DAQInstrState.Online;
                    gControl.FireEvent(EventType.ActionPrep, gControl);
                }
                else
                {
                    // slow parsing in this section is fine because data collection is not occurring
                    LMComm.LMMMLingo.Tokens response = LMMMComm.ResponseMatchPrefix(received);
                    if (response == LMComm.LMMMLingo.Tokens.cstatus) //  it is a status readback
                    {
                        LMMMComm.SplitCStatusResponse(received, ref activeInstr.lmstatus);
                        gControl.collog.TraceInformation(
                            "cStatus for LM {0}:{1} is dbg:{2}, leds:{3}, input:{4}, HVset:{5}, HV:{6}, LLD Max:{7}, LLD:{8}, (u1:{9})",
                            Instruments.Active.IndexOf(activeInstr), activeInstr.id.DetectorId, activeInstr.lmstatus.debug, activeInstr.lmstatus.leds, activeInstr.lmstatus.inputPath, activeInstr.lmstatus.setpoint, activeInstr.lmstatus.hv,
                            activeInstr.lmstatus.MaxLLD, activeInstr.lmstatus.LLD, activeInstr.lmstatus.u1);
                    }
                    else if (response == LMComm.LMMMLingo.Tokens.hvread) // it is a hv readback
                    {
                        int hv = 0;
                        LMMMComm.SplitHVReadResponse(received, ref hv);
                        gControl.collog.TraceInformation("HVread {0} volts for LM {1}:{2}", hv,
                             Instruments.Active.IndexOf(activeInstr), activeInstr.id.DetectorId);
                    }
                    else if (response == LMComm.LMMMLingo.Tokens.hvcalib) // it is a hv calibration point
                    {
                        HVControl.HVStatus hvst = new HVControl.HVStatus();
                        LMMMComm.SplitHVCalibResponse(received, ref hvst);
                        gControl.AppendHVCalibration(hvst);
                        gControl.collog.TraceInformation("HVcalib for LM {0}:{1} is [setpt:{2}, read:{3},  . . .]",
                              Instruments.Active.IndexOf(activeInstr), activeInstr.id.DetectorId, hvst.HVsetpt, hvst.HVread);
                        gControl.StepHVCalibration();
                    }
                    else if (response == LMComm.LMMMLingo.Tokens.rates) // it is a rates response
                    {
                        RatesStatus p = new RatesStatus();
                        LMMMComm.SplitRatesReadResponse(received, ref p);
                        gControl.collog.TraceInformation("Rates {0} on LM {1}:{2}", p.ToString(),
                             Instruments.Active.IndexOf(activeInstr), activeInstr.id.DetectorId);
                    }
                    else if (response == LMComm.LMMMLingo.Tokens.power) // it is a power status
                    {
                        PowerStatus p = new PowerStatus();
                        LMMMComm.SplitPowerReadResponse(received, ref p);
                        gControl.collog.TraceInformation("Power AC {0}, Batt {1}, Batt Level {2} on LM {3}:{4}", p.ACPresent, p.batteryPresent, p.batterylevelPct,
                             Instruments.Active.IndexOf(activeInstr), activeInstr.id.DetectorId);
                    }
                    else if (response == LMComm.LMMMLingo.Tokens.lld) // LLD status
                    {
                        int lld = 0;
                        LMMMComm.SplitLLDReadResponse(received, ref lld);
                        gControl.collog.TraceInformation("LLD {0} on LM {1}:{2}", lld,
                             Instruments.Active.IndexOf(activeInstr), activeInstr.id.DetectorId);
                    }
                    else // RR: this could be binary data if you cancel an assay and linux is sending a buffer.
                    // RR: this is a large amount of data and we don't want it displayed.
                    // tbd RR: figure out how to turn this back on when data is finished dumping.
                    {
                        if (verbose)
                        {
                            PacketLogSLOW(activeInstr, e);
                        }
                    }
                }
                if (verbose) gControl.collog.Flush();
            }
        }
 private static extern bool GetSystemPowerStatusEx(PowerStatus pStatus, bool fUpdate);