예제 #1
0
        // GET api/tim?linkid=xxx
        public HttpResponseMessage Get(string linkid)
        {
            Trace.TraceInformation("[TRACE] Entering TimController::Get(string linkid)...");

            if (srInfloDbContext == null)
            {
                return(this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Error connecting to Inflo DB"));
            }
            else
            {
                TMEOutput_Recommended_QWARN_CVMessage[] rQWarnAlerts;
                LoadApplicableAlerts(linkid, out rQWarnAlerts);

                try{
                    var rawTimMessageContent = GenerateTimFromAlerts(rQWarnAlerts);//new byte[] { 0x30, 0x0F, 0x80, 0x01, 0x10, 0x81, 0x04, 0x25, 0x0f, 0x35, 0xad, 0xa4, 0x00, 0x85, 0x02, 0x00, 0x00 };

                    TimMessage rTimMessage = new TimMessage();
                    rTimMessage.payload = string.Concat(Array.ConvertAll(rawTimMessageContent, b => b.ToString("X2")));

                    return(this.Request.CreateResponse <TimMessage>(HttpStatusCode.OK, rTimMessage));
                }
                catch (Exception)
                {
                    return(this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Error generating TIM Message"));
                }
            }
        }
예제 #2
0
 public HttpResponseMessage Post([FromBody] TimMessage message)
 {
     if (this.ModelState.IsValid)
     {
         if (srTimV2VTable != null)
         {
             srTimV2VTable.ExecuteAsync(
                 Microsoft.WindowsAzure.Storage.Table.TableOperation.Insert(
                     new TimV2VTableEntity(message)));
         }
     }
     return(Request.CreateResponse(HttpStatusCode.OK));
 }
예제 #3
0
        // GET api/tim
        public HttpResponseMessage Get(string roadwayid, double mm)
        {
            Trace.TraceInformation("[TRACE] Entering TimController::Get(string roadwayid, double mm)...");

            if (srInfloDbContext == null)
            {
                return(this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Error connecting to Inflo DB"));
            }
            else
            {
                srInfloDbContext.ChangeTracker.DetectChanges();

                //TODO reduce alerts we care about.

                var qWarnRoadwayAlerts    = srInfloDbContext.TMEOutput_QWARNMessage_CV.Where(a => a.RoadwayID.Equals(roadwayid)) /*.Where(a => System.Data.Entity.DbFunctions.AddSeconds(a.DateGenerated, a.ValidityDuration ?? 20) >= DateTime.UtcNow)*/;
                var qWarnIncrAlerts       = qWarnRoadwayAlerts.Where(a => a.BOQMMLocation <= a.FOQMMLocation).Where(a => (mm + AlertSearchRadius) >= a.BOQMMLocation && (mm - AlertSearchRadius) <= a.FOQMMLocation).OrderByDescending(a => a.DateGenerated).Take(1);
                var qWarnDecrAlerts       = qWarnRoadwayAlerts.Where(a => a.BOQMMLocation > a.FOQMMLocation).Where(a => (mm - AlertSearchRadius) <= a.BOQMMLocation && (mm + AlertSearchRadius) >= a.FOQMMLocation).OrderByDescending(a => a.DateGenerated).Take(1);
                var qWarnApplicableAlerts = qWarnIncrAlerts.Union(qWarnDecrAlerts).ToList();

                var qWarnAheadIncrAlerts       = qWarnRoadwayAlerts.Where(a => a.BOQMMLocation <= a.FOQMMLocation).Where(a => (mm + QWarnAheadDistance + AlertSearchRadius) >= a.BOQMMLocation && (mm - AlertSearchRadius) <= a.BOQMMLocation).OrderByDescending(a => a.DateGenerated).Take(1);
                var qWarnAheadDecrAlerts       = qWarnRoadwayAlerts.Where(a => a.BOQMMLocation > a.FOQMMLocation).Where(a => (mm - QWarnAheadDistance - AlertSearchRadius) <= a.BOQMMLocation && (mm + AlertSearchRadius) >= a.BOQMMLocation).OrderByDescending(a => a.DateGenerated).Take(1);
                var qWarnAheadApplicableAlerts = qWarnAheadIncrAlerts.Union(qWarnAheadDecrAlerts).ToList();

                var spdHarmRoadwayAlerts    = srInfloDbContext.TMEOutput_SPDHARMMessage_CV.Where(a => a.RoadwayId.Equals(roadwayid)).Where(a => System.Data.Entity.DbFunctions.AddSeconds(a.DateGenerated, a.ValidityDuration ?? 20) >= DateTime.UtcNow);
                var spdHarmIncrAlerts       = spdHarmRoadwayAlerts.Where(a => a.BeginMM <= a.EndMM).Where(a => (mm + AlertSearchRadius) >= a.BeginMM && (mm - AlertSearchRadius) <= a.EndMM).OrderByDescending(a => a.DateGenerated).Take(1);
                var spdHarmDecrAlerts       = spdHarmRoadwayAlerts.Where(a => a.BeginMM > a.EndMM).Where(a => (mm - AlertSearchRadius) <= a.BeginMM && (mm + AlertSearchRadius) >= a.EndMM).OrderByDescending(a => a.DateGenerated).Take(1);
                var spdHarmApplicableAlerts = spdHarmIncrAlerts.Union(spdHarmDecrAlerts).ToList();

                try
                {
                    ExtractedTIM timMessage = new ExtractedTIM();
                    timMessage.setPacketId(TimAgencyId, DateTime.Now);

                    List <ExtractedTimFrame> frames = new List <ExtractedTimFrame>();

                    foreach (var alert in qWarnApplicableAlerts)
                    {
                        double startMM = alert.BOQMMLocation;
                        double endMM   = (double)alert.FOQMMLocation;

                        double length = Math.Abs(endMM - startMM);
                        int    time   = -1;
                        if (alert.SpeedInQueue != null && alert.SpeedInQueue != 0)
                        {
                            time = (int)(length * 60 / (short)alert.SpeedInQueue);
                        }
                        int duration = alert.ValidityDuration == null ? AlertDefaultDuration : (int)alert.ValidityDuration;

                        ExtractedTimFrame frame = BuildAlertFrame(roadwayid, String.Format("q,{0:F1},{1},{2}", length, time, "Q-WARN: In Queue"), alert.DateGenerated, duration, startMM, endMM);

                        if (frame.getAlertPathCount() > 0)
                        {
                            frames.Add(frame);
                        }
                    }

                    foreach (var alert in qWarnAheadApplicableAlerts)
                    {
                        double endMM = alert.BOQMMLocation;
                        double startMM;
                        if (alert.BOQMMLocation > alert.FOQMMLocation)
                        {
                            startMM = endMM + QWarnAheadDistance;
                        }
                        else
                        {
                            startMM = endMM - QWarnAheadDistance;
                        }

                        double length = Math.Abs(endMM - startMM);
                        int    time   = -1;
                        if (alert.SpeedInQueue != null && alert.SpeedInQueue != 0)
                        {
                            time = (int)(length * 60 / (short)alert.SpeedInQueue);
                        }
                        int duration = alert.ValidityDuration == null ? AlertDefaultDuration : (int)alert.ValidityDuration;

                        ExtractedTimFrame frame = BuildAlertFrame(roadwayid, String.Format("a,{0:F1},{1},{2}", length, time, "Q-WARN: Queue Ahead"), alert.DateGenerated, duration, startMM, endMM);

                        if (frame.getAlertPathCount() > 0)
                        {
                            frames.Add(frame);
                        }
                    }

                    foreach (var alert in spdHarmApplicableAlerts)
                    {
                        double startMM = alert.BeginMM;
                        double endMM   = (double)alert.EndMM;

                        int duration            = alert.ValidityDuration == null ? AlertDefaultDuration : (int)alert.ValidityDuration;
                        ExtractedTimFrame frame = BuildAlertFrame(roadwayid, String.Format("s,{0},{1}", alert.RecommendedSpeed, alert.Justification), alert.DateGenerated, duration, startMM, endMM);

                        if (frame.getAlertPathCount() > 0)
                        {
                            frames.Add(frame);
                        }
                    }

                    timMessage.setFrames(frames.ToArray());

                    var rawTimMessageContent = timMessage.generateASN();

                    TimMessage rTimMessage = new TimMessage();
                    rTimMessage.payload = string.Concat(Array.ConvertAll(rawTimMessageContent, b => b.ToString("X2")));

                    return(this.Request.CreateResponse <TimMessage>(HttpStatusCode.OK, rTimMessage));
                }
                catch (Exception e)
                {
                    return(this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Error generating TIM Message", e));
                }
            }
        }