Example #1
0
        public VD_MinAvgData getOneMinAvgData(System.Data.DataSet ds)
        {
            System.Data.DataRow rmain = ds.Tables["tblMain"].Rows[0];

               VD_MinAvgData[] laneData = new VD_MinAvgData[ds.Tables["tbllane_count"].Rows.Count];
               int invalidcnt = 0;
               VD_MinAvgData ret = new VD_MinAvgData(this);

               ret.year = System.DateTime.Now.Year;
               ret.month = System.DateTime.Now.Month;
               ret.day = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["day"]);
               ret.hour = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["hour"]);
               ret.min = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["minute"]);

               for (int laneid = 0; laneid < ds.Tables["tbllane_count"].Rows.Count; laneid++)
               {
               int small_car_volume = 0, big_car_volume = 0, connect_car_volume = 0;
               int small_car_speed = 0, big_car_speed = 0, connect_car_speed = 0, average_occupancy = 0, average_car_interval = 0;
               System.Data.DataRow laneRow = ds.Tables["tbllane_count"].Rows[laneid];

               laneData[laneid] = new VD_MinAvgData(this);

               small_car_volume = System.Convert.ToInt32(laneRow["small_car_volume"]);

               big_car_volume = System.Convert.ToInt32(laneRow["big_car_volume"]);

               connect_car_volume = System.Convert.ToInt32(laneRow["connect_car_volume"]);
               big_car_speed = System.Convert.ToInt32(laneRow["big_car_speed"]);
               small_car_speed = System.Convert.ToInt32(laneRow["small_car_speed"]);
               connect_car_speed = System.Convert.ToInt32(laneRow["connect_car_speed"]);
               average_occupancy = System.Convert.ToInt32(laneRow["average_occupancy"]);
               average_car_interval = System.Convert.ToInt32(laneRow["average_car_interval"]);

               //  車道總流量計算

               if (small_car_volume == 0xff && big_car_volume == 0xff && connect_car_volume == 0xff)
                   laneData[laneid].vol = -1;
               else
               {
                   if (small_car_volume != 0xff)
                       laneData[laneid].vol += small_car_volume;
                   if (big_car_volume != 0xff)
                       laneData[laneid].vol += big_car_volume;
                   if (connect_car_volume != 0xff)
                       laneData[laneid].vol += connect_car_volume;
               }

               if (laneData[laneid].vol == -1 || connect_car_speed == 0xff && small_car_speed == 0xff && big_car_speed == 0xff)
                   laneData[laneid].speed = -1;
               else
               {
                   if (connect_car_volume != 0xff && connect_car_speed != 0xff)
                       laneData[laneid].speed += connect_car_volume * connect_car_speed;
                   if (small_car_volume != 0xff && small_car_speed != 0xff)
                       laneData[laneid].speed += small_car_volume * small_car_speed;

                   if (big_car_volume != 0xff && big_car_speed != 0xff)
                       laneData[laneid].speed += big_car_volume * big_car_speed;

               }

               if (laneData[laneid].speed == -1 || laneData[laneid].vol == -1)
                   laneData[laneid].speed = -1;
               else if (laneData[laneid].vol == 0)

                   laneData[laneid].speed = 0;
               else

                   laneData[laneid].speed = laneData[laneid].speed / laneData[laneid].vol;

               if (average_occupancy == 0xff)
                   laneData[laneid].occupancy = -1;
               else
                   laneData[laneid].occupancy = average_occupancy;

               laneData[laneid].interval = average_car_interval;

               }// for
               // 記算不分車道總流量
               invalidcnt = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {
               ret.vol += laneData[laneId].vol;
               if (laneData[laneId].vol == -1)
                   invalidcnt++;
               }

               if (ret.vol == laneData.Length * -1)
               ret.vol = -1;
               else
               ret.vol = ret.vol + invalidcnt + (ret.vol + invalidcnt) / (laneData.Length - invalidcnt) * invalidcnt;

               //計算平均車速

               invalidcnt = 0;
               int totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {
               if (laneData[laneId].vol != -1 && laneData[laneId].speed != -1)
               {
                   ret.speed += laneData[laneId].vol * laneData[laneId].speed;
                   totalvol += laneData[laneId].vol;
               }
               else
                   invalidcnt++;
               }

               if (invalidcnt == laneData.Length)
               ret.speed = -1;
               else if (totalvol == 0)
               ret.speed = 0;
               else
               ret.speed = ret.speed / totalvol;

               //計算平均佔有率

               invalidcnt = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {

               if (laneData[laneId].occupancy == -1)
                   invalidcnt++;
               else
                   ret.occupancy += laneData[laneId].occupancy;

               }

               if (invalidcnt == laneData.Length)
               ret.occupancy = -1;
               else
               ret.occupancy = ret.occupancy / (laneData.Length - invalidcnt);

               return ret;
        }
Example #2
0
        //public bool CheckVD_DataValid(System.Data.DataSet ds)
        //{
        //    System.Data.DataRow r = ds.Tables["tblMain"].Rows[0];
        //}
        public VD_MinAvgData getFiveMinMovingAvgData()
        {
            VD_MinAvgData ret = new VD_MinAvgData(this.vdtc);

               lock (this.queData)
               {

               object[] objs= queData.ToArray();
               VD_MinAvgData[] OneMinDatas = new VD_MinAvgData[objs.Length];

               for (int i = 0; i < OneMinDatas.Length; i++)
                   OneMinDatas[i] = (VD_MinAvgData)objs[i];

               // cal five min total vol
               ret.year = this.maxDateTime.Year;
               ret.month = this.maxDateTime.Month;
               ret.day = this.maxDateTime.Day;
               ret.hour = this.maxDateTime.Hour;
               ret.min = this.maxDateTime.Minute;
               ret.vdName = this.vdtc.DeviceName;

               int invalidCnt = 0;
               for (int i = 0; i < OneMinDatas.Length; i++)
               {
                   if (!OneMinDatas[i].IsValid)
                       invalidCnt++;

                   ret.vol += OneMinDatas[i].vol;
               }

               if (invalidCnt == OneMinDatas.Length)
                   ret.vol = -1;
               else
                   ret.vol = ret.vol + invalidCnt + (ret.vol+invalidCnt) / (OneMinDatas.Length - invalidCnt) * invalidCnt;  //補足無效資料
               // cal 5 min  avg speed
               invalidCnt = 0;
               int totalvol=0;
                for (int i = 0; i < OneMinDatas.Length; i++)
                {
                    if (OneMinDatas[i].speed != -1 || OneMinDatas[i].vol != -1)
                    {
                        ret.speed += OneMinDatas[i].speed * OneMinDatas[i].vol;
                        totalvol += OneMinDatas[i].vol;
                    }

                    else
                        invalidCnt++;

                }

                if (invalidCnt == OneMinDatas.Length)
                    ret.speed = -1;
                else if (totalvol == 0)
                    ret.speed = 0;
                else
                    ret.speed = ret.speed / totalvol;

               //cal 5 min occupancy

                invalidCnt = 0;

               for (int i = 0; i < OneMinDatas.Length; i++)
               {
                   if (OneMinDatas[i].occupancy == -1)
                       invalidCnt++;
                   else
                       ret.occupancy += OneMinDatas[i].occupancy;
               }

               if (invalidCnt == OneMinDatas.Length)
                   ret.occupancy = -1;
               else
                   ret.occupancy = ret.occupancy / (OneMinDatas.Length - invalidCnt);

               return ret;
               }

               //throw new NotImplementedException();
        }
Example #3
0
        public void inData(VD_MinAvgData data)
        {
            lock (queData)
            {
                try
                {
                   // int day, hour, min;
                    //day=System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["day"]);
                    //hour=System.Convert.ToInt32( ds.Tables["tblmain"].Rows[0]["hour"]);
                    //min=System.Convert.ToInt32( ds.Tables["tblmain"].Rows[0]["minute"]);

                   // VD_MinAvgData data = this.getOneMinAvgData( ds);
                    Console.WriteLine(data.ToString()+" enque!");
                  //  System.DateTime dt = new DateTime(System.DateTime.Now.Year,System.DateTime.Now.Month,day, hour,min,0);
                    if (queData.Count == 0)
                    {
                        queData.Enqueue(data);
                        maxDateTime = minDateTime =data.dateTime;
                    }
                    else if (data.dateTime > maxDateTime)
                    {
                        queData.Enqueue(data);
                        maxDateTime = data.dateTime;
                        if (queData.Count > 5)
                        {

                            while (queData.Count > 5)
                                queData.Dequeue();

                        }
                        data = (VD_MinAvgData)queData.Peek();
                       // day = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["day"]);
                       // hour = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["hour"]);
                       // min = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["minute"]);
                        minDateTime = data.dateTime;

                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.StackTrace);
                }

            }
        }
Example #4
0
        public void inData(VD_MinAvgData data)
        {
            lock (queData)
            {
                try
                {

                 //   ConsoleServer.WriteLine(data.ToString()+" enque!");

                    if (queData.Count == 0)
                    {
                        queData.Enqueue(data);
                        maxDateTime = minDateTime =data.dateTime;
                    }
                    else if (data.dateTime > maxDateTime )
                    {
                        queData.Enqueue(data);
                        if (System.Math.Abs(((TimeSpan)(data.dateTime - System.DateTime.Now)).TotalMinutes) < 6)
                            maxDateTime = data.dateTime;
                        else
                            maxDateTime = new DateTime(System.DateTime.Now.Year, System.DateTime.Now.Month, System.DateTime.Now.Day,
                                System.DateTime.Now.Hour, System.DateTime.Now.Minute, 0);
                        if (queData.Count > 5)
                        {

                            while (queData.Count > 5)
                                queData.Dequeue();

                        }
                        data = (VD_MinAvgData)queData.Peek();
                       // day = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["day"]);
                       // hour = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["hour"]);
                       // min = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["minute"]);
                        minDateTime = data.dateTime;

                    }
                }
                catch (Exception ex)
                {
                    ConsoleServer.WriteLine(ex.StackTrace);
                }

            }
        }
Example #5
0
        // 主動回報事件
        void VDTC_OnTCReport(object tc, TextPackage txt)
        {
            System.Data.DataSet ds=null;

               if (txt.Text[0] == 0x10  ) //cycle data 1 min cycle
               {
                   try
                   {
                       ds=m_protocol.GetSendDsByTextPackage(txt,CmdType.CmdReport);
                       ds.AcceptChanges();
                       if (true/*System.Convert.ToInt32(ds.Tables[0].Rows[0]["response_type"]) == 0 || System.Convert.ToInt32(ds.Tables[0].Rows[0]["response_type"]) == 4*/)
                       {

                           VD_MinAvgData data = getOneMinAvgData(ds,System.DateTime.Now.Year,System.DateTime.Now.Month);
                           curr_1_min_data = data;
                           if (dtlast0x10 != data.dateTime)
                                OneMinDataStore.inData(data);

                         // if(dtlast0x10!=data.dateTime)
                           VD_MinAvgData fiveMinData = this.OneMinDataStore.getFiveMinMovingAvgData();

                           if (this.OnFiveMinAvgData != null)
                               try
                               {
                                   this.OnFiveMinAvgData(this, fiveMinData);
                               }
                               catch (Exception ex)
                               {
                                   ConsoleServer.WriteLine(this.DeviceName+ex.Message+ex.StackTrace);
                               }
                           if (this.On1MinTrafficData != null)
                               try
                               {
                                   if (dtlast0x10 != data.dateTime)
                                       this.On1MinTrafficData(this, data);
                                   else
                                       ConsoleServer.WriteLine(this.DeviceName+"1min data repeat!");

                               }
                               catch (Exception ex) { ConsoleServer.WriteLine(this.DeviceName+ex.Message+ex.StackTrace); };

                           dtlast0x10 = data.dateTime;
                           // 顯示取得最近1分鐘資料
                        //   ConsoleServer.WriteLine(this.DeviceName + " " + "Five min AVG:" + fiveMinData.ToString());
                       }

                   }
                   catch (Exception ex)
                   {
                       ConsoleServer.WriteLine(this.DeviceName+" "+"Five min AVG"+ex.Message);
                   }
               }
               else  if(txt.Cmd==0x17) // 20 sec 事件資料
               {
                //  ConsoleServer.WriteLine(txt.ToString());
                  try
                  {
                      ds = m_protocol.GetSendDsByTextPackage(txt, CmdType.CmdReport);
                      ds.AcceptChanges();
                      if (this.On20SecEvent != null)
                          this.On20SecEvent(this, getOneMinAvgData(ds, System.DateTime.Now.Year, System.DateTime.Now.Month));
                      //if (this.OnRealTimeData != null)
                      //    this.OnRealTimeData(this, ds);
                  }
                  catch (Exception ex)
                  {
                      ConsoleServer.WriteLine(this.DeviceName+" "+" 20 sec 事件資料"+ex.Message + "\r\n" + ex.StackTrace);
                  }
              }

              else if (txt.Cmd == 0x18)  //現點速率
              {

                  try
                  {
                      ConsoleServer.WriteLine(txt.ToString());
                      if (System.DateTime.Now >= m_realEventEndTime)
                      {
                          ConsoleServer.WriteLine(this.DeviceName + "關閉現點速率");
                          //this.Tc_SetRealData(0);
                          AsyncSend(new SendPackage(CmdType.CmdSet,CmdClass.B,0xffff,new byte[]{0x11,00}));
                          return;
                      }
                      ds = m_protocol.GetSendDsByTextPackage(txt, CmdType.CmdReport);
                      ds.AcceptChanges();
                      if (this.OnRealTimeData != null)
                          this.OnRealTimeData(this, ds);
                  }
                  catch (Exception ex)
                  {
                      ConsoleServer.WriteLine(this.DeviceName+" "+"現點速率:"+ex.Message + "\r\n" + ex.StackTrace);
                  }
              }
              else if (txt.Cmd == 0x1a)  //觸動事件
              {
                  try
                  {
                      ds = m_protocol.GetSendDsByTextPackage(txt, CmdType.CmdReport);
                      ds.AcceptChanges();
                      if (this.OnTriggerEvent != null)
                          this.OnTriggerEvent(this, ds);
                  }
                  catch (Exception ex)
                  {
                      ConsoleServer.WriteLine(this.DeviceName+" "+"觸動事件:" + ex.Message + "\r\n" + ex.StackTrace);
                  }
              }
        }
Example #6
0
        public VD_MinAvgData getOneMinAvgData(System.Data.DataSet ds,int year,int month)
        {
            System.Data.DataRow rmain = ds.Tables["tblMain"].Rows[0];

               VD_MinAvgData[] laneData = new VD_MinAvgData[ds.Tables["tbllane_count"].Rows.Count];
               int invalidcnt = 0;
               VD_MinAvgData ret = new VD_MinAvgData(this.DeviceName);

               ret.year = year ;
               ret.month = month;
               ret.day = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["day"]);
               ret.hour = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["hour"]);
               ret.min = System.Convert.ToInt32(ds.Tables["tblmain"].Rows[0]["minute"]);
               if (ds.Tables[0].Rows[0]["func_name"].ToString() == "report_event_data") // for 20sec event data
               ret.sec =System.Convert.ToInt32( ds.Tables[0].Rows[0]["second"]);
               ret.orgds = ds;

               for (int laneid = 0; laneid < ds.Tables["tbllane_count"].Rows.Count; laneid++)
               {
               int small_car_volume = 0, big_car_volume = 0, connect_car_volume = 0;
               int small_car_speed = 0, big_car_speed = 0, connect_car_speed = 0, average_occupancy = 0, average_car_interval = 0;
               int small_car_length = 0, big_car_length = 0, connect_car_length = 0;
               System.Data.DataRow laneRow = ds.Tables["tbllane_count"].Rows[laneid];

               laneData[laneid] = new VD_MinAvgData(this.DeviceName);

               laneData[laneid].year = ret.year;
               laneData[laneid].month = ret.month;
               laneData[laneid].day = ret.day;
               laneData[laneid].hour = ret.hour;
               laneData[laneid].min= ret.min;
               laneData[laneid].sec = ret.sec;
               small_car_volume = System.Convert.ToInt32(laneRow["small_car_volume"]);

               big_car_volume = System.Convert.ToInt32(laneRow["big_car_volume"]);

               connect_car_volume = System.Convert.ToInt32(laneRow["connect_car_volume"]);
               big_car_speed = System.Convert.ToInt32(laneRow["big_car_speed"]);
               small_car_speed = System.Convert.ToInt32(laneRow["small_car_speed"]);
               connect_car_speed = System.Convert.ToInt32(laneRow["connect_car_speed"]);
               average_occupancy = System.Convert.ToInt32(laneRow["average_occupancy"]);
               //if (average_occupancy == 255)
               //    average_occupancy = -1;
               average_car_interval = System.Convert.ToInt32(laneRow["average_car_interval"]);

               if (average_car_interval == 65535 )
                   average_car_interval = -1;
               //if (average_car_interval == 255)
               //    average_car_interval = -1;

               small_car_length = System.Convert.ToInt32(laneRow["small_car_length"]);
               big_car_length = System.Convert.ToInt32(laneRow["big_car_length"]);
               connect_car_length = System.Convert.ToInt32(laneRow["connect_car_length"]);

               if (small_car_volume == 0 && small_car_speed > 0 || small_car_volume == 0 && small_car_length > 0)
               {
                   laneData[laneid].small_car_volume = -1;
               }
               else
               {
                   laneData[laneid].small_car_volume = (small_car_volume == 255) ? -1 : small_car_volume;
                   if (!Comm.TC.VDDataValidCheck.SpeedVolumnRangeCheck(laneData[laneid].speed, laneData[laneid].vol))
                   {
                       laneData[laneid].small_car_volume = -1;
                      // laneData[laneid].small_car_speed = -1;
                   }

               }

               if (big_car_volume == 0 && big_car_speed > 0 || big_car_volume == 0 && big_car_length > 0)
               {
                   laneData[laneid].big_car_volume = -1;
               }
               else
               {
                   laneData[laneid].big_car_volume = (big_car_volume == 255) ? -1 : big_car_volume;
                   if (!Comm.TC.VDDataValidCheck.SpeedVolumnRangeCheck(laneData[laneid].speed, laneData[laneid].vol))
                   {
                       laneData[laneid].big_car_volume = -1;
                      // laneData[laneid].big_car_speed = -1;
                   }
               }

               if (connect_car_volume == 0 && connect_car_speed > 0 || connect_car_volume == 0 && connect_car_length > 0)
               {
                   laneData[laneid].connect_car_volume = -1;
               }
               else
               {
                   laneData[laneid].connect_car_volume = (connect_car_volume == 255) ? -1 : connect_car_volume;
                   if (!Comm.TC.VDDataValidCheck.SpeedVolumnRangeCheck(laneData[laneid].speed, laneData[laneid].vol))
                   {
                       laneData[laneid].connect_car_volume = -1;
                      // laneData[laneid].connect_car_speed = -1;
                   }
               }

               laneData[laneid].small_car_speed = (small_car_speed == 255 || small_car_volume==-1) ? -1 : small_car_speed;
               laneData[laneid].big_car_speed=(big_car_speed==255 || big_car_volume==-1)?-1:big_car_speed;
               laneData[laneid].connect_car_speed = (connect_car_speed == 255) ? -1 : connect_car_speed;
               laneData[laneid].occupancy = (average_occupancy == 255) ? -1 : average_occupancy;

               //if(average_car_interval==65535 || average_car_interval==255)
               //    Console.WriteLine("wild!");
               laneData[laneid].interval = average_car_interval;
               laneData[laneid].small_car_length = (small_car_length == 255) ? -1 : small_car_length;
               laneData[laneid].big_car_length = (big_car_length == 255) ? -1 : big_car_length;
               laneData[laneid].connect_car_length = (connect_car_length == 255) ? -1 : connect_car_length;

            /*
               ret.small_car_volume+=(small_car_volume==-1)?0:small_car_volume;
               ret.big_car_volume+=(big_car_volume == -1) ? 0 : big_car_volume;
               ret.connect_car_volume += (connect_car_volume == -1) ? 0 : connect_car_volume;

             * */

               /*
               ret.connect_car_speed += (laneData[laneid].connect_car_speed == -1) ? 0 : laneData[laneid].connect_car_speed;
               ret.small_car_speed += (laneData[laneid].small_car_speed == -1) ? 0 : laneData[laneid].small_car_speed;
               ret.big_car_speed += (laneData[laneid].big_car_speed == -1) ? 0 : laneData[laneid].big_car_speed;

               ret.connect_car_length += (laneData[laneid].connect_car_length == -1) ? 0 : laneData[laneid].connect_car_length;
               ret.small_car_length += (laneData[laneid].small_car_length == -1) ? 0 : laneData[laneid].small_car_length;
               ret.big_car_length += (laneData[laneid].big_car_length == -1) ? 0 : laneData[laneid].big_car_length;
                *
                */

               //  車道總流量計算

               if ( laneData[laneid].small_car_volume == -1 || laneData[laneid].big_car_volume ==-1 ||  laneData[laneid].connect_car_volume == -1  )
               {
                   laneData[laneid].vol = -1;
                   laneData[laneid].big_car_volume = laneData[laneid].small_car_volume = laneData[laneid].connect_car_volume = -1;
               }
               else
               {
                   //if (small_car_volume != 0xff)
                   //{
                       laneData[laneid].vol += small_car_volume;

                   //}
                   //else
                   //    laneData[laneid].small_car_volume = -1;

                   //if (big_car_volume != 0xff)
                   //{
                       laneData[laneid].vol += big_car_volume;

                   //}
                   //else
                   //    laneData[laneid].big_car_volume = -1;

                   //if (connect_car_volume != 0xff)
                   //{
                       laneData[laneid].vol += connect_car_volume;

                   //}
                   //else
                   //    laneData[laneid].connect_car_volume = -1;

               }

               if (laneData[laneid].vol == -1 || laneData[laneid].connect_car_speed == -1 || laneData[laneid].small_car_speed ==-1 || laneData[laneid].big_car_speed == -1)
               {
                   laneData[laneid].speed = -1;
                   connect_car_speed = small_car_speed = big_car_speed = -1;
               }
               else
               {
                 //  if (connect_car_volume != 0xff && connect_car_speed != 0xff)
                       laneData[laneid].speed += connect_car_volume * connect_car_speed;
                  // if (small_car_volume != 0xff && small_car_speed != 0xff)
                       laneData[laneid].speed += small_car_volume * small_car_speed;

                  // if (big_car_volume != 0xff && big_car_speed != 0xff)
                       laneData[laneid].speed += big_car_volume * big_car_speed;

               }

               if (laneData[laneid].speed == -1 || laneData[laneid].vol == -1)
                   laneData[laneid].speed = -1;

               else if (laneData[laneid].vol == 0)

                   laneData[laneid].speed = 0;
               else

                   laneData[laneid].speed = laneData[laneid].speed / laneData[laneid].vol;

               //車道平均車長計算

               if (laneData[laneid].vol == -1 || connect_car_length == 0xff || small_car_length == 0xff || big_car_length == 0xff)
               {
                   laneData[laneid].length = -1;
                   connect_car_length = small_car_length = big_car_length = -1;
               }
               else
               {
                 //  if (connect_car_length != 0xff && connect_car_volume != 0xff)
                       laneData[laneid].length += connect_car_volume * connect_car_length;
                //   if (small_car_volume != 0xff && small_car_length != 0xff)
                       laneData[laneid].length += small_car_volume *small_car_length;

               //    if (big_car_volume != 0xff && big_car_length != 0xff)
                       laneData[laneid].length += big_car_volume * big_car_length;

               }

               if (laneData[laneid].length == -1 || laneData[laneid].vol == -1)
                   laneData[laneid].length= -1;
               else if (laneData[laneid].vol == 0)

                   laneData[laneid].length = 0;
               else

                   laneData[laneid].length = laneData[laneid].length / laneData[laneid].vol;

               if (average_occupancy == 0xff)
                   laneData[laneid].occupancy = -1;
               else
                   laneData[laneid].occupancy = average_occupancy;

             //  laneData[laneid].interval = average_car_interval;

               }// for
               // 記算不分車道總流量

               invalidcnt = 0;
               ret.vol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {
              // ret.vol += laneData[laneId].vol;
               if (laneData[laneId].vol == -1)
                   invalidcnt++;
               else
                   ret.vol += laneData[laneId].vol;
               }

               if (invalidcnt == laneData.Length)
               ret.vol = -1;
               else
               {
               ret.vol = ret.vol + invalidcnt + (ret.vol + invalidcnt) / (laneData.Length - invalidcnt) * invalidcnt;
               if(invalidcnt!=0)
                ret.isReCalculate = true;
              // this.is
               }

               //計算平均車速

               invalidcnt = 0;
               int totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {
               if (laneData[laneId].vol != -1 && laneData[laneId].speed != -1)
               {
                   ret.speed += laneData[laneId].vol * laneData[laneId].speed;
                   totalvol += laneData[laneId].vol;
               }
               else
                   invalidcnt++;
               }

               if (invalidcnt == laneData.Length)
               ret.speed = -1;
               else if (totalvol == 0)
               ret.speed = 0;
               else
               ret.speed = ret.speed / totalvol;

               //計算平均佔有率

               invalidcnt = 0;
               totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {

               if (laneData[laneId].vol == -1)
                   invalidcnt++;
               else
               {
                   ret.occupancy += laneData[laneId].occupancy * laneData[laneId].vol;
                   totalvol += laneData[laneId].vol;
               }

               }
               if (invalidcnt == laneData.Length)
               ret.occupancy= -1;
               else if (totalvol == 0)
               ret.occupancy = 0;
               else
               ret.occupancy = ret.occupancy / totalvol;
               //invalidcnt = 0;

               //for (int laneId = 0; laneId < laneData.Length; laneId++)
               //{

               //    if (laneData[laneId].occupancy == -1)

               //        invalidcnt++;
               //    else
               //        ret.occupancy += laneData[laneId].occupancy;

               //}

               //if (invalidcnt == laneData.Length)
               //    ret.occupancy = -1;
               //else
               //    ret.occupancy = ret.occupancy / (laneData.Length - invalidcnt);

               //計算平均車長

               invalidcnt = 0;
               totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {

               if (laneData[laneId].vol == -1 )
                   invalidcnt++;
               else
               {
                   ret.length += laneData[laneId].length * laneData[laneId].vol;
                   totalvol += laneData[laneId].vol;
               }

               }
               if (invalidcnt == laneData.Length)
               ret.length = -1;
               else if (totalvol == 0)
               ret.length = 0;
               else
               ret.length = ret.length / totalvol;

               //計算平均interval

               invalidcnt = 0;
               totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {

               if (laneData[laneId].vol == -1)
                   invalidcnt++;
               else
               {
                   ret.interval += laneData[laneId].interval * laneData[laneId].vol;
                   totalvol += laneData[laneId].vol;
               }

               }
               if (invalidcnt == laneData.Length)
               ret.interval = -1;
               else if (totalvol == 0)
               ret.interval = 0;
               else
               ret.interval = ret.interval / totalvol;

               //計算平均interval

               ret.orgVDLaneData = laneData;

               //計算平均 各車種   車流

               invalidcnt = 0;
               totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {

               if (laneData[laneId].small_car_volume == -1)
                   invalidcnt++;
               else
               {
                   ret.small_car_volume += laneData[laneId].small_car_volume ;
                  // totalvol += laneData[laneId].small_car_volume;
               }

               }
               if (invalidcnt == laneData.Length)
               ret.small_car_volume = -1;

               invalidcnt = 0;
               totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {

               if (laneData[laneId].big_car_volume == -1)
                   invalidcnt++;
               else
               {
                   ret.big_car_volume += laneData[laneId].big_car_volume;
                   // totalvol += laneData[laneId].small_car_volume;
               }

               }
               if (invalidcnt == laneData.Length)
               ret.big_car_volume = -1;

               invalidcnt = 0;
               totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {

               if (laneData[laneId].connect_car_volume== -1)
                   invalidcnt++;
               else
               {
                   ret.connect_car_volume += laneData[laneId].connect_car_volume;
                   // totalvol += laneData[laneId].small_car_volume;
               }

               }
               if (invalidcnt == laneData.Length)
               ret.connect_car_volume = -1;

             // 各車種長度

               invalidcnt = 0;
               totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {

               if (laneData[laneId].small_car_volume== -1)
                   invalidcnt++;
               else
               {
                   ret.small_car_length += laneData[laneId].small_car_length*laneData[laneId].small_car_volume;
                   // totalvol += laneData[laneId].small_car_volume;
               }

               }
               if (invalidcnt == laneData.Length)
               ret.small_car_length = -1;
               else if( ret.small_car_volume==0)
               ret.small_car_length =0;
               else
               ret.small_car_length = ret.small_car_length / ret.small_car_volume;

               invalidcnt = 0;
               totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {

               if (laneData[laneId].big_car_volume == -1)
                   invalidcnt++;
               else
               {
                   ret.big_car_length += laneData[laneId].big_car_length * laneData[laneId].big_car_volume;

               }

               }
               if (invalidcnt == laneData.Length)
               ret.big_car_length = -1;
               else if( ret.big_car_volume==0)
               ret.big_car_length=0;
               else
               ret.big_car_length = ret.big_car_length / ret.big_car_volume;

               invalidcnt = 0;
               totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {

               if (laneData[laneId].connect_car_volume == -1)
                   invalidcnt++;
               else
               {
                   ret.connect_car_length += laneData[laneId].connect_car_length * laneData[laneId].connect_car_volume;

               }

               }

               if (invalidcnt == laneData.Length)
               ret.connect_car_length = -1;
               else if(ret.connect_car_volume==0)
                ret.connect_car_length=0;
               else
               ret.connect_car_length = ret.connect_car_length / ret.connect_car_volume;

               //計算平均 車束

               invalidcnt = 0;
               totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {

               if (laneData[laneId].small_car_volume == -1)
                   invalidcnt++;
               else
               {
                   ret.small_car_speed += laneData[laneId].small_car_speed * laneData[laneId].small_car_volume;
                   // totalvol += laneData[laneId].small_car_volume;
               }

               }
               if (invalidcnt == laneData.Length)
               ret.small_car_length = -1;
               else if(ret.small_car_volume==0)
               ret.small_car_speed=0;
               else
               ret.small_car_speed = ret.small_car_speed / ret.small_car_volume;

               //------------big car speed
               invalidcnt = 0;
               totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {

               if (laneData[laneId].big_car_volume == -1)
                   invalidcnt++;
               else
               {
                   ret.big_car_speed += laneData[laneId].big_car_speed * laneData[laneId].big_car_volume;
                   // totalvol += laneData[laneId].small_car_volume;
               }

               }
               if (invalidcnt == laneData.Length)
               ret.big_car_speed = -1;
               else  if(ret.big_car_volume==0)
               ret.big_car_speed=0;
               else
               ret.big_car_speed = ret.big_car_speed / ret.big_car_volume;

               invalidcnt = 0;
               totalvol = 0;
               for (int laneId = 0; laneId < laneData.Length; laneId++)
               {

               if (laneData[laneId].connect_car_volume == -1)
                   invalidcnt++;
               else
               {
                   ret.connect_car_speed += laneData[laneId].connect_car_speed * laneData[laneId].connect_car_volume;
                   // totalvol += laneData[laneId].small_car_volume;
               }

               }
               if (invalidcnt == laneData.Length)
               ret.big_car_speed = -1;
               else if (ret.connect_car_volume == 0)
               ret.connect_car_speed = 0;
               else
               ret.connect_car_speed = ret.connect_car_speed / ret.connect_car_volume;

               return ret;
        }