예제 #1
0
    public static void InitSampleTower(int ID)
    {
        GameObject towerObj = (GameObject)Instantiate(buildManager.availableTowers[ID].gameObject);

        buildManager.sampleTower.Add(towerObj.GetComponent <UnitTower>());
        buildManager.sampleTower[buildManager.sampleTower.Count - 1].InitPerkParameters();

        towerObj.transform.parent = buildManager.transform;

        if (!buildManager.retainPrefabShaderForSamples)
        {
            UnitUtility.SetMat2AdditiveRecursively(buildManager.sampleTower[ID].thisT);
        }

        if (towerObj.collider != null)
        {
            Destroy(towerObj.collider);
        }
        UnitUtility.DestroyColliderRecursively(towerObj.transform);
        //~ #if UNITY_4_0
        //~ towerObj.SetActive(false);
        //~ #else
        //~ towerObj.SetActiveRecursively(false);
        //~ #endif
        Utility.SetActive(towerObj, false);
    }
예제 #2
0
파일: DbDataStore.cs 프로젝트: rmdz76/atmo
        public DateTime GetMaxSyncStamp()
        {
            if (!ForceConnectionOpen())
            {
                throw new Exception("Could not open database.");
            }

            DateTime minStamp = default(DateTime);

            using (var command = _connection.CreateTextCommand("SELECT stamp FROM syncstamps ORDER BY stamp DESC LIMIT 1")) {
                using (var reader = command.ExecuteReader()) {
                    if (reader.Read())
                    {
                        minStamp = UnitUtility.ConvertFromPosixTime(reader.GetInt32(0));
                    }
                }
            }
            if (default(DateTime).Equals(minStamp))
            {
                using (var command = _connection.CreateTextCommand("SELECT stamp FROM dayrecord ORDER BY stamp DESC LIMIT 1")) {
                    // todo: pull this from the 10minute instead?
                    using (var reader = command.ExecuteReader()) {
                        if (reader.Read())
                        {
                            minStamp = UnitUtility.ConvertFromPosixTime(reader.GetInt32(0));
                        }
                    }
                }
            }
            return(minStamp);
        }
예제 #3
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="readings"></param>
        /// <returns></returns>
        /// <remarks>
        /// Result is ordered by stamp in ascending order.
        /// </remarks>
        public static IEnumerable <ReadingsSummary> Summarize <T>(IEnumerable <T> readings, TimeUnit unit) where T : IReading
        {
            List <T>        collectedReadings = new List <T>();
            IEnumerator <T> enumerator        = readings.GetEnumerator();     //readings.OrderBy(r => r.TimeStamp).GetEnumerator();

            if (enumerator.MoveNext())
            {
                collectedReadings.Add(enumerator.Current);
                DateTime dateRangeLow  = UnitUtility.StripToUnit(enumerator.Current.TimeStamp, unit);
                DateTime dateRangeHigh = UnitUtility.IncrementByUnit(dateRangeLow, unit);
                while (enumerator.MoveNext())
                {
                    if (enumerator.Current.TimeStamp < dateRangeHigh)
                    {
                        collectedReadings.Add(enumerator.Current);
                    }
                    else
                    {
                        yield return(FormSummary(dateRangeLow, dateRangeHigh, collectedReadings));

                        collectedReadings.Clear();
                        collectedReadings.Add(enumerator.Current);
                        dateRangeLow  = UnitUtility.StripToUnit(enumerator.Current.TimeStamp, unit);
                        dateRangeHigh = UnitUtility.IncrementByUnit(dateRangeLow, unit);
                    }
                }
                if (collectedReadings.Count > 0)
                {
                    yield return(FormSummary(dateRangeLow, dateRangeHigh, collectedReadings));
                }
            }
        }
예제 #4
0
        private void QueryThreadBody()
        {
            if (!_queryActive)
            {
                return;
            }

            int  networkSize  = 4;
            var  values       = new PackedReadingValues[networkSize];
            bool?usingDaqTemp = null;
            int  highestValid = -1;
            var  now          = DateTime.Now;
            var  daqSafeTime  = UnitUtility.StripToSecond(now);

            for (int i = 0; i < values.Length; i++)
            {
                values[i] = QueryValues(i);
            }

            for (int i = 0; i < values.Length; i++)
            {
                if (!values[i].IsValid)
                {
                    continue;
                }

                if (PackedValuesFlags.AnemTemperatureSource != (values[i].RawFlags & PackedValuesFlags.AnemTemperatureSource))
                {
                    usingDaqTemp = true;
                }
                else if (!usingDaqTemp.HasValue)
                {
                    usingDaqTemp = false;
                }

                highestValid = Math.Max(highestValid, i);
            }

            if (highestValid < 0)
            {
                highestValid = 3;
            }

            networkSize = highestValid + 1;
            _lastClock  = QueryAdjustedClock(0);
            _daqStat    = _lastDaqStatusQuery >= now?QueryStatus() : DaqStatusValues.Default;

            for (int i = 0; i < values.Length; i++)
            {
                _sensors[i].HandleObservation(values[i], networkSize, daqSafeTime);
            }

            _networkSize = networkSize;
            if (!_usingDaqTempUntil.HasValue || _usingDaqTempUntil.Value <= DateTime.Now)
            {
                _usingDaqTemp      = usingDaqTemp;
                _usingDaqTempUntil = null;
            }
        }
예제 #5
0
파일: DbDataStore.cs 프로젝트: rmdz76/atmo
        public IEnumerable <PackedReading> GetReadings(string sensor, DateTime from, TimeSpan span)
        {
            DateTime to = from.Add(span);

            if (to < from)
            {
                DateTime s = to;
                to   = from;
                from = s;
            }
            if (!ForceConnectionOpen())
            {
                throw new Exception("Could not open database.");
            }
            using (var command = _connection.CreateTextCommand(
                       "SELECT stamp,[values] FROM Record"
                       + " INNER JOIN Sensor ON (Sensor.sensorId = Record.sensorId)"
                       + " WHERE Sensor.nameKey = @sensorNameKey"
                       + " AND Record.stamp >= @minPosixStamp"
                       + " AND Record.stamp <= @maxPosixStamp"
                       + " ORDER BY stamp " + ((span < TimeSpan.Zero) ? "DESC" : "ASC")
                       )) {
                command.AddParameter("minPosixStamp", DbType.Int32, UnitUtility.ConvertToPosixTime(from));
                command.AddParameter("maxPosixStamp", DbType.Int32, UnitUtility.ConvertToPosixTime(to));
                command.AddParameter("sensorNameKey", DbType.String, sensor);

                using (var reader = command.ExecuteReader()) {
                    int       ordStamp  = reader.GetOrdinal("stamp");
                    int       ordValues = reader.GetOrdinal("values");
                    byte[]    values    = new byte[8];
                    const int chunkSize = 256;
                    bool      isReading = true;
                    var       cache     = new List <PackedReading>(chunkSize);

                    while (isReading)
                    {
                        cache.Clear();
                        for (int i = 0; i < chunkSize; i++)
                        {
                            if (!reader.Read())
                            {
                                isReading = false;
                                break;
                            }
                            reader.GetBytes(ordValues, 0, values, 0, values.Length);
                            cache.Add(new PackedReading(
                                          UnitUtility.ConvertFromPosixTime(reader.GetInt32(ordStamp)),
                                          PackedReadingValues.ConvertFromPackedBytes(values, 0)
                                          ));
                        }
                        foreach (var item in cache)
                        {
                            yield return(item);
                        }
                    }
                }
            }
        }
예제 #6
0
    public virtual void Awake()
    {
        thisT   = transform;
        thisObj = gameObject;

        HPAttribute.Init(thisT);

        UnitUtility.DestroyColliderRecursively(thisT);
    }
예제 #7
0
    public virtual void Awake()
    {
        thisT   = transform;
        thisObj = gameObject;

        //if(subClass==_UnitSubClass.Creep)
        HPAttribute.Init(thisT, (int)subClass);

        UnitUtility.DestroyColliderRecursively(thisT);
    }
예제 #8
0
    public void _ShowSampleTower(int ID)
    {
        if (currentSampleID == ID || currentBuildInfo == null)
        {
            return;
        }

        if (currentSampleID >= 0)
        {
            ClearSampleTower();
        }

        bool matched = false;

        //~ foreach(_TowerType type in currentBuildInfo.buildableType){
        //~ if(type==sampleTower[ID].type){
        //~ matched=true;
        //~ break;
        //~ }
        //~ }
        foreach (TowerAvailability avai in currentBuildInfo.towerAvaiList)
        {
            if (avai.ID == sampleTower[ID].prefabID)
            {
                if (avai.enabledInLvl)
                {
                    matched = true;
                }
                break;
            }
        }

        if (!retainPrefabShaderForSamples)
        {
            if (matched)
            {
                UnitUtility.SetAdditiveMatColorRecursively(sampleTower[ID].thisT, Color.green);
            }
            else
            {
                UnitUtility.SetAdditiveMatColorRecursively(sampleTower[ID].thisT, Color.red);
            }
        }

        currentSampleID = ID;
        sampleTower[ID].thisT.position = currentBuildInfo.position;
        //sampleTower[ID].thisObj.SetActiveRecursively(true);
        //~ #if UNITY_4_0
        //~ sampleTower[ID].thisObj.SetActive(true);
        //~ #else
        //~ sampleTower[ID].thisObj.SetActiveRecursively(true);
        //~ #endif
        Utility.SetActive(sampleTower[ID].thisObj, true);
        GameControl.ShowIndicator(sampleTower[ID]);
    }
예제 #9
0
        public void Process(T readings)
        {
            // wind dir stuff
            if (null != readings.Mean)
            {
                var speed = readings.Mean.WindSpeed;
                if (!Double.IsNaN(speed))
                {
                    var energy = speed * speed;
                    var power  = energy * speed;
                    foreach (var set in readings.GetWindDirectionCounts())
                    {
                        if (0 == set.Value || 0 == set.Key || Double.IsNaN(set.Key))
                        {
                            continue;
                        }

                        var dirSlot = UnitUtility.WrapDegree(((int)((set.Key + _angleHalfStep) / _angleStep)) * _angleStep);
                        WindDirectionEnergy windDirEnrg;
                        var modEnergy = power * set.Value;
                        if (_directionLookup.TryGetValue(dirSlot, out windDirEnrg))
                        {
                            windDirEnrg.Frequency += set.Value;
                            windDirEnrg.Power     += modEnergy;
                        }
                    }
                }
            }

            // wind speed stuff
            foreach (var set in readings.GetWindSpeedCounts())
            {
                if (/*0 == set.Value ||*/ Double.IsNaN(set.Key))
                {
                    continue;
                }

                var speedBucket = ((int)((set.Key + _speedHalfStep) / _speedStep)) * _speedStep;
                WindSpeedFrequency windSpeedFreq;
                if (_speedLookup.TryGetValue(speedBucket, out windSpeedFreq))
                {
                    windSpeedFreq.Frequency += set.Value;
                }
                else
                {
                    _speedLookup.Add(speedBucket, new WindSpeedFrequency(speedBucket, set.Value));
                }
            }

            _weibullCalcNeeded = true;
        }
예제 #10
0
    public void Init(Transform transform)
    {
        fullHP = Mathf.Max(0, fullHP);

        HP = fullHP;

        rootTransform = transform;
        cam           = Camera.main.transform;

        if (overlayBase == null)
        {
            overlayBase = GameObject.CreatePrimitive(PrimitiveType.Plane).transform;

            if (overlayHP)
            {
                overlayBase.position = overlayHP.position;
                overlayBase.rotation = overlayHP.rotation;
            }

            UnitUtility.DestroyColliderRecursively(overlayBase);
            overlayBase.renderer.enabled = false;
            overlayBase.parent           = transform;

            neverShowBase = true;
        }

        offsetB = overlayBase.localPosition;

        if (overlayHP)
        {
            scaleModifierH = UnitUtility.GetWorldScale(overlayHP).x *5;
        }

        if (overlayHP != null)
        {
            overlayHP.gameObject.layer = LayerManager.LayerOverlay();
            overlayRendererH           = overlayHP.renderer;
            overlayHP.parent           = overlayBase;
            overlayScaleH = overlayHP.localScale;
            offsetH       = overlayHP.localPosition;
            if (alwaysShowOverlay)
            {
                overlayRendererH.enabled = true;
            }
        }

        if (alwaysShowOverlay)
        {
            overlayIsVisible = true;
        }
    }
예제 #11
0
    GameObject buildHill()
    {
        float realPercentage = 100 / groundHeightInPercent;

        transform.position = new Vector3(UnitUtility.centerWidth(), UnitUtility.centerHeight(), 100);
        GameObject mainHill = Instantiate(hillPrefab, transform);
        //groundFill = transform.Find("GroundFill").gameObject;
        float groundHeight = UnitUtility.percentHeight(groundHeightInPercent);

        mainHill.transform.position   = new Vector3(UnitUtility.centerWidth(), -550 + transform.position.y, hillDepth);
        mainHill.transform.localScale = new Vector3(Screen.width * 2, hillDepth, hillDepth);
        Debug.Log("groundHeightInPercent: " + groundHeightInPercent);
        return(mainHill);
    }
예제 #12
0
파일: DbDataStore.cs 프로젝트: rmdz76/atmo
        private TimeRange PushReadings <T>(
            IDbCommand command, IEnumerable <T> readings, Func <T, byte[]> conversion,
            DbParameter stampParam, DbParameter valuesParam
            )
            where T : IReading
        {
            DateTime minStamp = new DateTime(9999, 1, 1);
            DateTime maxStamp = new DateTime(0);
            int      counter  = 0;

            try {
                command.Transaction = _connection.BeginTransaction();
                foreach (var reading in readings)
                {
                    stampParam.Value  = UnitUtility.ConvertToPosixTime(reading.TimeStamp);
                    valuesParam.Value = conversion(reading);
                    command.ExecuteNonQuery();
                    counter++;
                    if (counter >= RecordBatchQuantity)
                    {
                        counter = 0;
                        command.Transaction.Commit();
                        command.Transaction = _connection.BeginTransaction();
                    }
                    if (reading.TimeStamp < minStamp)
                    {
                        minStamp = reading.TimeStamp;
                    }
                    if (reading.TimeStamp > maxStamp)
                    {
                        maxStamp = reading.TimeStamp;
                    }
                }
                if (command.Transaction != null)
                {
                    command.Transaction.Commit();
                }
            }
            catch (Exception ex) {
                if (null != command.Transaction)
                {
                    command.Transaction.Rollback();
                }
            }

            return(new TimeRange(minStamp, maxStamp));
        }
예제 #13
0
파일: DbDataStore.cs 프로젝트: rmdz76/atmo
        private bool UpdateSummaryRecords(TimeRange rangeCovered, string sensorName, int sensorId)
        {
            TimeRange tenMinuteAlignedRange = new TimeRange(
                UnitUtility.StripToUnit(rangeCovered.Low, TimeUnit.TenMinutes),
                UnitUtility.StripToUnit(rangeCovered.High, TimeUnit.TenMinutes) + TenMinutes
                );
            var minuteSummaries = StatsUtil.Summarize(
                GetReadings(sensorName, tenMinuteAlignedRange.Low, tenMinuteAlignedRange.Span), TimeUnit.Minute
                ).ToList();
            bool minsOk = PushSummaries(sensorId, "MinuteRecord", minuteSummaries, new PosixTimeRange(tenMinuteAlignedRange));

            var tenMinuteSummaries = new List <ReadingsSummary>();
            {
                List <List <ReadingsSummary> > tenMinutePeriodSummaries = new List <List <ReadingsSummary> >();
                List <ReadingsSummary>         currentMinuteSummaries   = new List <ReadingsSummary>();
                foreach (ReadingsSummary minuteSummary in minuteSummaries)
                {
                    if (currentMinuteSummaries.Count == 0 ||
                        PeriodTenMinutes(currentMinuteSummaries[0].BeginStamp).Equals(PeriodTenMinutes(minuteSummary.BeginStamp))
                        )
                    {
                        currentMinuteSummaries.Add(minuteSummary);
                    }
                    else
                    {
                        tenMinutePeriodSummaries.Add(currentMinuteSummaries);
                        currentMinuteSummaries = new List <ReadingsSummary>();
                    }
                }
                if (currentMinuteSummaries.Count > 0)
                {
                    tenMinutePeriodSummaries.Add(currentMinuteSummaries);
                }
                foreach (List <ReadingsSummary> minutelyForCondensing in tenMinutePeriodSummaries)
                {
                    ReadingsSummary summary = StatsUtil.Combine(minutelyForCondensing);
                    summary.BeginStamp = PeriodTenMinutes(summary.BeginStamp);
                    summary.EndStamp   = summary.BeginStamp.Add(TenMinutes).AddTicks(-1);
                    tenMinuteSummaries.Add(summary);
                }
            }

            bool tenMinsOk = PushSummaries(sensorId, "TenminuteRecord", tenMinuteSummaries, new PosixTimeRange(tenMinuteAlignedRange));

            return(minsOk && tenMinsOk);
        }
예제 #14
0
    // Use this for initialization
    void Start()
    {
        if (indicator == null)
        {
            indicator = (Transform)Instantiate(Resources.Load("AbilityIndicator", typeof(Transform)));
            if (indicator == null)
            {
                Debug.Log("warning, no default indicator has been assigned for AbilityManager");
                indicator.parent = transform;
            }
        }

        int overlayLayer = LayerManager.LayerOverlay();

        foreach (Ability ability in allAbilityList)
        {
            if (ability.indicator != null)
            {
                ability.indicator = (Transform)Instantiate(ability.indicator);
                UnitUtility.DestroyColliderRecursively(ability.indicator);
                Utility.SetActive(ability.indicator.gameObject, false);
                Utility.SetLayerRecursively(ability.indicator, overlayLayer);
                //Debug.Log("visualEffect:  "+ability.ID);
                //~ ability.indicator.gameObject.name=ability.name;

                if (ability.autoScaleIndicator)
                {
                    float scale = 2 * ability.aoeRange / 10;
                    ability.indicator.localScale = new Vector3(scale, 1, scale);
                }

                ability.indicator.gameObject.layer = overlayLayer;
                ability.indicator.parent           = transform;
            }

            if (ability.visualEffect != null)
            {
                ObjectPoolManager.New(ability.visualEffect, 1);
            }
        }

        Utility.SetActive(indicator.gameObject, false);
        indicator.gameObject.layer = LayerManager.LayerOverlay();
    }
예제 #15
0
    public void _ShowSampleTower(int ID)
    {
        if (currentSampleID == ID || currentBuildInfo == null)
        {
            return;
        }

        if (currentSampleID > 0)
        {
            ClearSampleTower();
        }

        bool matched = false;

        foreach (_TowerType type in currentBuildInfo.buildableType)
        {
            if (type == sampleTower[ID].type)
            {
                matched = true;
                break;
            }
        }

        if (!retainPrefabShaderForSamples)
        {
            if (matched)
            {
                UnitUtility.SetAdditiveMatColorRecursively(sampleTower[ID].thisT, Color.green);
            }
            else
            {
                UnitUtility.SetAdditiveMatColorRecursively(sampleTower[ID].thisT, Color.red);
            }
        }

        currentSampleID = ID;
        sampleTower[ID].thisT.position = currentBuildInfo.position;
        sampleTower[ID].thisObj.SetActiveRecursively(true);
        GameControl.ShowIndicator(sampleTower[ID]);
    }
예제 #16
0
        public static IEnumerable <ReadingAggregate> AggregateMean <T>(IEnumerable <T> readings, TimeUnit unit)
            where T : IReading
        {
            int count;
            var enumerator = readings.OrderBy(r => r.TimeStamp).GetEnumerator();

            if (!enumerator.MoveNext())
            {
                yield break;
            }
            var collectedReadings = new List <T> {
                enumerator.Current
            };
            var dateRangeLow  = UnitUtility.StripToUnit(enumerator.Current.TimeStamp, unit);
            var dateRangeHigh = UnitUtility.IncrementByUnit(dateRangeLow, unit);

            while (enumerator.MoveNext())
            {
                if (enumerator.Current.TimeStamp < dateRangeHigh)
                {
                    collectedReadings.Add(enumerator.Current);
                }
                else
                {
                    var values = AggregateMeanValues(collectedReadings, out count);
                    yield return(new ReadingAggregate(dateRangeLow, dateRangeHigh, values, count));

                    collectedReadings.Clear();
                    collectedReadings.Add(enumerator.Current);
                    dateRangeLow  = UnitUtility.StripToUnit(enumerator.Current.TimeStamp, unit);
                    dateRangeHigh = UnitUtility.IncrementByUnit(dateRangeLow, unit);
                }
            }
            if (collectedReadings.Count > 0)
            {
                var values = AggregateMeanValues(collectedReadings, out count);
                yield return(new ReadingAggregate(dateRangeLow, dateRangeHigh, values, count));
            }
        }
예제 #17
0
    public static void InitiateSampleTower()
    {
        buildManager.sampleTower = new UnitTower[buildManager.towers.Length];
        for (int i = 0; i < buildManager.towers.Length; i++)
        {
            GameObject towerObj = (GameObject)Instantiate(buildManager.towers[i].gameObject);
            buildManager.sampleTower[i] = towerObj.GetComponent <UnitTower>();

            if (!buildManager.retainPrefabShaderForSamples)
            {
                UnitUtility.SetMat2AdditiveRecursively(buildManager.sampleTower[i].thisT);
            }

            if (towerObj.collider != null)
            {
                Destroy(towerObj.collider);
            }
            UnitUtility.DestroyColliderRecursively(towerObj.transform);
            towerObj.SetActiveRecursively(false);

            //UnitUtility.SetAdditiveMatColorRecursively(towerObj.transform, Color.green);
        }
    }
예제 #18
0
    static public Vector3 GetTilePos(Transform basePlane, Vector3 hitPos)
    {
        //check if the row count is odd or even number
        float remainderX = UnitUtility.GetWorldScale(basePlane).x *10 / _gridSize % 2;
        float remainderZ = UnitUtility.GetWorldScale(basePlane).z *10 / _gridSize % 2;

        //get the rotation offset of the plane
        Quaternion rot = Quaternion.LookRotation(hitPos - basePlane.position);

        //get the x and z distance from the centre of the plane in the baseplane orientation
        //from this point on all x and z will be in reference to the basePlane orientation
        float dist  = Vector3.Distance(hitPos, basePlane.position);
        float distX = Mathf.Sin((rot.eulerAngles.y - basePlane.rotation.eulerAngles.y) * Mathf.Deg2Rad) * dist;
        float distZ = Mathf.Cos((rot.eulerAngles.y - basePlane.rotation.eulerAngles.y) * Mathf.Deg2Rad) * dist;

        //get the sign (1/-1) of the x and y direction
        float signX = distX != 0 ? distX / Mathf.Abs(distX) : 1;
        float signZ = distZ != 0 ? distZ / Mathf.Abs(distZ) : 1;

        //calculate the tile number selected in z and z direction
        float numX = Mathf.Round((distX + (remainderX - 1) * (signX * _gridSize / 2)) / _gridSize);
        float numZ = Mathf.Round((distZ + (remainderZ - 1) * (signZ * _gridSize / 2)) / _gridSize);

        //calculate offset in x-axis,
        float offsetX = -(remainderX - 1) * signX * _gridSize / 2;
        float offsetZ = -(remainderZ - 1) * signZ * _gridSize / 2;

        //get the pos and apply the offset
        Vector3 p = basePlane.TransformDirection(new Vector3(numX, 0, numZ) * _gridSize);

        p += basePlane.TransformDirection(new Vector3(offsetX, 0, offsetZ));

        //set the position;
        Vector3 pos = p + basePlane.position;

        return(pos);
    }
예제 #19
0
파일: DbDataStore.cs 프로젝트: rmdz76/atmo
 public bool PushSyncStamp(DateTime stamp)
 {
     return(PushSyncStamp(UnitUtility.ConvertToPosixTime(stamp)));
 }
예제 #20
0
    // Use this for initialization
    void InitPlatform()
    {
        if (autoSearchForPlatform)
        {
            LayerMask  mask         = 1 << LayerManager.LayerPlatform();
            Collider[] platformCols = Physics.OverlapSphere(Vector3.zero, Mathf.Infinity, mask);
            platforms = new Transform[platformCols.Length];
            for (int j = 0; j < platformCols.Length; j++)
            {
                platforms[j] = platformCols[j].transform;
            }
        }

        buildPlatforms = new Platform[platforms.Length];

        int i = 0;

        foreach (Transform basePlane in platforms)
        {
            //if the platform object havent got a platform componet on it, assign it
            Platform platform = basePlane.gameObject.GetComponent <Platform>();

            if (platform == null)
            {
                platform = basePlane.gameObject.AddComponent <Platform>();
                platform.buildableType = new _TowerType[7];

                //by default, all tower type is builidable
                platform.buildableType[0] = _TowerType.TurretTower;
                platform.buildableType[1] = _TowerType.AOETower;
                //~ platform.buildableType[2]=_TowerType.DirectionalAOETower;
                platform.buildableType[3] = _TowerType.SupportTower;
                //~ platform.buildableType[4]=_TowerType.ResourceTower;
                //~ platform.buildableType[5]=_TowerType.Mine;
                //~ platform.buildableType[6]=_TowerType.Block;
            }

            buildPlatforms[i] = platform;

            //make sure the plane is perfectly horizontal, rotation around the y-axis is presreved
            basePlane.eulerAngles = new Vector3(0, basePlane.rotation.eulerAngles.y, 0);

            //adjusting the scale
            float scaleX = Mathf.Floor(UnitUtility.GetWorldScale(basePlane).x *10 / gridSize) * gridSize * 0.1f;
            float scaleZ = Mathf.Floor(UnitUtility.GetWorldScale(basePlane).z *10 / gridSize) * gridSize * 0.1f;

            if (scaleX == 0)
            {
                scaleX = gridSize * 0.1f;
            }
            if (scaleZ == 0)
            {
                scaleZ = gridSize * 0.1f;
            }

            basePlane.localScale = new Vector3(scaleX, 1, scaleZ);

            //adjusting the texture
            if (autoAdjstTextureToGrid)
            {
                Material mat = basePlane.renderer.material;

                float x = (UnitUtility.GetWorldScale(basePlane).x *10f) / gridSize;
                float z = (UnitUtility.GetWorldScale(basePlane).z *10f) / gridSize;

                mat.mainTextureOffset = new Vector2(0.5f, 0.5f);
                mat.mainTextureScale  = new Vector2(x, z);
            }

            //get the platform component, if any
            //Platform p=basePlane.gameObject.GetComponent<Platform>();
            //buildPlatforms[i]=new BuildPlatform(basePlane, p);
            i++;
        }
    }
예제 #21
0
    static public bool CheckBuildPoint(Vector3 pointer)
    {
        //if(currentBuildInfo!=null) return false;

        BuildableInfo buildableInfo = new BuildableInfo();

        //layerMask for platform only
        LayerMask maskPlatform = 1 << LayerManager.LayerPlatform();
        //layerMask for detect all collider within buildPoint
        LayerMask maskAll = 1 << LayerManager.LayerPlatform();

        if (buildManager.terrainColliderLayer >= 0)
        {
            maskAll |= 1 << buildManager.terrainColliderLayer;
        }

        Ray        ray = Camera.main.ScreenPointToRay(pointer);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, Mathf.Infinity, maskPlatform))
        {
            for (int i = 0; i < buildManager.buildPlatforms.Length; i++)
            {
                Transform basePlane = buildManager.buildPlatforms[i].thisT;
                if (hit.transform == basePlane)
                {
                    //calculating the build center point base on the input position

                    //check if the row count is odd or even number
                    float remainderX = UnitUtility.GetWorldScale(basePlane).x *10 / _gridSize % 2;
                    float remainderZ = UnitUtility.GetWorldScale(basePlane).z *10 / _gridSize % 2;

                    //get the rotation offset of the plane
                    Quaternion rot = Quaternion.LookRotation(hit.point - basePlane.position);

                    //get the x and z distance from the centre of the plane in the baseplane orientation
                    //from this point on all x and z will be in reference to the basePlane orientation
                    float dist  = Vector3.Distance(hit.point, basePlane.position);
                    float distX = Mathf.Sin((rot.eulerAngles.y - basePlane.rotation.eulerAngles.y) * Mathf.Deg2Rad) * dist;
                    float distZ = Mathf.Cos((rot.eulerAngles.y - basePlane.rotation.eulerAngles.y) * Mathf.Deg2Rad) * dist;

                    //get the sign (1/-1) of the x and y direction
                    float signX = distX / Mathf.Abs(distX);
                    float signZ = distZ / Mathf.Abs(distZ);

                    //calculate the tile number selected in z and z direction
                    float numX = Mathf.Round((distX + (remainderX - 1) * (signX * _gridSize / 2)) / _gridSize);
                    float numZ = Mathf.Round((distZ + (remainderZ - 1) * (signZ * _gridSize / 2)) / _gridSize);

                    //calculate offset in x-axis,
                    float offsetX = -(remainderX - 1) * signX * _gridSize / 2;
                    float offsetZ = -(remainderZ - 1) * signZ * _gridSize / 2;

                    //get the pos and apply the offset
                    Vector3 p = basePlane.TransformDirection(new Vector3(numX, 0, numZ) * _gridSize);
                    p += basePlane.TransformDirection(new Vector3(offsetX, 0, offsetZ));

                    //set the position;
                    Vector3 pos = p + basePlane.position;

                    //check if the position is blocked, by any other obstabcle other than the baseplane itself
                    Collider[] cols = Physics.OverlapSphere(pos, _gridSize / 2 * 0.9f, ~maskAll);
                    if (cols.Length > 0)
                    {
                        //Debug.Log("something's in the way "+cols[0]);
                        return(false);
                    }
                    else
                    {
                        //confirm that we can build here
                        buildableInfo.buildable = true;
                        buildableInfo.position  = pos;
                        buildableInfo.platform  = buildManager.buildPlatforms[i];
                    }

                    buildableInfo.buildableType      = buildManager.buildPlatforms[i].buildableType;
                    buildableInfo.specialBuildableID = buildManager.buildPlatforms[i].specialBuildableID;

                    break;
                }
            }
        }
        else
        {
            return(false);
        }

        currentBuildInfo = buildableInfo;

        if (buildManager.enableTileIndicator)
        {
            indicator.active             = true;
            indicator.transform.position = currentBuildInfo.position;
            indicator.transform.rotation = currentBuildInfo.platform.thisT.rotation;
        }

        return(true);
    }
예제 #22
0
    //called to set indicator to a particular node, set the color as well
    //not iOS performance friendly
    static public void SetIndicator(Vector3 pointer)
    {
        if (!buildManager.enableTileIndicator)
        {
            return;
        }

        //layerMask for platform only
        LayerMask maskPlatform = 1 << LayerManager.LayerPlatform();
        //layerMask for detect all collider within buildPoint
        LayerMask maskAll = 1 << LayerManager.LayerPlatform();

        if (buildManager.terrainColliderLayer >= 0)
        {
            maskAll |= 1 << buildManager.terrainColliderLayer;
        }

        Ray        ray = Camera.main.ScreenPointToRay(pointer);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, Mathf.Infinity, maskPlatform))
        {
            for (int i = 0; i < buildManager.buildPlatforms.Length; i++)
            {
                Transform basePlane = buildManager.buildPlatforms[i].thisT;
                if (hit.transform == basePlane)
                {
                    //calculating the build center point base on the input position

                    //check if the row count is odd or even number
                    float remainderX = UnitUtility.GetWorldScale(basePlane).x *10 / _gridSize % 2;
                    float remainderZ = UnitUtility.GetWorldScale(basePlane).z *10 / _gridSize % 2;

                    //get the rotation offset of the plane
                    Quaternion rot = Quaternion.LookRotation(hit.point - basePlane.position);

                    //get the x and z distance from the centre of the plane in the baseplane orientation
                    //from this point on all x and z will be in reference to the basePlane orientation
                    float dist  = Vector3.Distance(hit.point, basePlane.position);
                    float distX = Mathf.Sin((rot.eulerAngles.y - basePlane.rotation.eulerAngles.y) * Mathf.Deg2Rad) * dist;
                    float distZ = Mathf.Cos((rot.eulerAngles.y - basePlane.rotation.eulerAngles.y) * Mathf.Deg2Rad) * dist;

                    //get the sign (1/-1) of the x and y direction
                    float signX = distX / Mathf.Abs(distX);
                    float signZ = distZ / Mathf.Abs(distZ);

                    //calculate the tile number selected in z and z direction
                    float numX = Mathf.Round((distX + (remainderX - 1) * (signX * _gridSize / 2)) / _gridSize);
                    float numZ = Mathf.Round((distZ + (remainderZ - 1) * (signZ * _gridSize / 2)) / _gridSize);

                    //calculate offset in x-axis,
                    float offsetX = -(remainderX - 1) * signX * _gridSize / 2;
                    float offsetZ = -(remainderZ - 1) * signZ * _gridSize / 2;

                    //get the pos and apply the offset
                    Vector3 p = basePlane.TransformDirection(new Vector3(numX, 0, numZ) * _gridSize);
                    p += basePlane.TransformDirection(new Vector3(offsetX, 0, offsetZ));

                    //set the position;
                    Vector3 pos = p + basePlane.position;



                    indicator2.active = true;

                    indicator2.transform.position = pos;
                    indicator2.transform.rotation = basePlane.rotation;

                    Collider[] cols = Physics.OverlapSphere(pos, _gridSize / 2 * 0.9f, ~maskAll);
                    if (cols.Length > 0)
                    {
                        indicator2.renderer.material.SetColor("_TintColor", Color.red);
                    }
                    else
                    {
                        indicator2.renderer.material.SetColor("_TintColor", Color.green);
                    }
                }
            }
        }
        else
        {
            indicator2.active = false;
        }
    }
예제 #23
0
        private static ReadingsSummary FormSummary <T>(DateTime dateRangeLow, DateTime dateRangeHigh, List <T> readings) where T : IReadingValues
        {
            int    tempCount  = 0;
            int    presCount  = 0;
            int    humCount   = 0;
            int    speedCount = 0;
            int    dirCount   = 0;
            double tempSum    = 0;
            double presSum    = 0;
            double humSum     = 0;
            double speedSum   = 0;
            double dirSinSum  = 0;
            double dirCosSum  = 0;

            var tempCounts  = new Dictionary <double, int>();
            var presCounts  = new Dictionary <double, int>();
            var humCounts   = new Dictionary <double, int>();
            var speedCounts = new Dictionary <double, int>();
            var dirCounts   = new Dictionary <double, int>();

            int count;

            ReadingValues minValues;
            ReadingValues maxValues;
            ReadingValues meanValues;
            ReadingValues sampleStandardDeviationValues;

            if (readings.Count > 0)
            {
                minValues = new ReadingValues(readings[0]);
                maxValues = new ReadingValues(readings[0]);

                double value;

                for (int i = 0; i < readings.Count; i++)
                {
                    T reading = readings[i];

                    if (reading.IsTemperatureValid)
                    {
                        tempCount++;
                        value    = reading.Temperature;
                        tempSum += value;

                        if (minValues.Temperature > value)
                        {
                            minValues.Temperature = value;
                        }
                        else if (maxValues.Temperature < value)
                        {
                            maxValues.Temperature = value;
                        }

                        value             = Math.Round(value);
                        tempCounts[value] = tempCounts.TryGetValue(value, out count) ? count + 1 : 1;
                    }
                    if (reading.IsPressureValid)
                    {
                        presCount++;
                        value    = reading.Pressure;
                        presSum += value;

                        if (minValues.Pressure > value)
                        {
                            minValues.Pressure = value;
                        }
                        else if (maxValues.Pressure < value)
                        {
                            maxValues.Pressure = value;
                        }

                        value             = Math.Round(value);
                        presCounts[value] = presCounts.TryGetValue(value, out count) ? count + 1 : 1;
                    }
                    if (reading.IsHumidityValid)
                    {
                        humCount++;
                        value   = reading.Humidity;
                        humSum += value;

                        if (minValues.Humidity > value)
                        {
                            minValues.Humidity = value;
                        }
                        else if (maxValues.Humidity < value)
                        {
                            maxValues.Humidity = value;
                        }

                        value            = Math.Round(value);
                        humCounts[value] = humCounts.TryGetValue(value, out count) ? count + 1 : 1;
                    }
                    if (reading.IsWindSpeedValid)
                    {
                        speedCount++;
                        value     = reading.WindSpeed;
                        speedSum += value;

                        if (minValues.WindSpeed > value)
                        {
                            minValues.WindSpeed = value;
                        }
                        else if (maxValues.WindSpeed < value)
                        {
                            maxValues.WindSpeed = value;
                        }

                        value = Math.Round(value * 2.0) / 2;                     // round to nearest .5
                        speedCounts[value] = speedCounts.TryGetValue(value, out count) ? count + 1 : 1;
                    }
                    if (reading.IsWindDirectionValid)
                    {
                        dirCount++;
                        value = reading.WindDirection;
                        //dirSum += value;

                        double dirRad = value * DegToRadFactor;
                        dirSinSum += Math.Sin(dirRad);
                        dirCosSum += Math.Cos(dirRad);

                        if (minValues.WindDirection > value)
                        {
                            minValues.WindDirection = value;
                        }
                        else if (maxValues.WindDirection < value)
                        {
                            maxValues.WindDirection = value;
                        }

                        value            = Math.Round(value);
                        dirCounts[value] = dirCounts.TryGetValue(value, out count) ? count + 1 : 1;
                    }
                }

                meanValues = new ReadingValues(
                    tempCount == 0 ? Double.NaN : (tempSum / tempCount),
                    presCount == 0 ? Double.NaN : (presSum / presCount),
                    humCount == 0 ? Double.NaN : (humSum / humCount),
                    (dirCount == 0 || Double.IsNaN(dirSinSum) || Double.IsNaN(dirCosSum))
                                                ? Double.NaN
                                                : UnitUtility.WrapDegree(Math.Atan2(dirSinSum / dirCount, dirCosSum / dirCount) * RadToDegFactor),
                    speedCount == 0 ? Double.NaN : (speedSum / speedCount)
                    );

                sampleStandardDeviationValues = new ReadingValues(0, 0, 0, 0, 0);

                for (int i = 0; i < readings.Count; i++)
                {
                    T reading = readings[i];

                    if (reading.IsTemperatureValid)
                    {
                        value = reading.Temperature - meanValues.Temperature;
                        sampleStandardDeviationValues.Temperature += value * value;
                    }
                    if (reading.IsPressureValid)
                    {
                        value = reading.Pressure - meanValues.Pressure;
                        sampleStandardDeviationValues.Pressure += value * value;
                    }
                    if (reading.IsHumidityValid)
                    {
                        value = reading.Humidity - meanValues.Humidity;
                        sampleStandardDeviationValues.Humidity += value * value;
                    }
                    if (reading.IsWindSpeedValid)
                    {
                        value = reading.WindSpeed - meanValues.WindSpeed;
                        sampleStandardDeviationValues.WindSpeed += value * value;
                    }
                    if (reading.IsWindDirectionValid)
                    {
                        value = reading.WindDirection - meanValues.WindDirection;
                        sampleStandardDeviationValues.WindDirection += value * value;
                    }
                }

                sampleStandardDeviationValues.Temperature   = Math.Sqrt(sampleStandardDeviationValues.Temperature / tempCount);
                sampleStandardDeviationValues.Pressure      = Math.Sqrt(sampleStandardDeviationValues.Pressure / presCount);
                sampleStandardDeviationValues.Humidity      = Math.Sqrt(sampleStandardDeviationValues.Humidity / humCount);
                sampleStandardDeviationValues.WindSpeed     = Math.Sqrt(sampleStandardDeviationValues.WindSpeed / speedCount);
                sampleStandardDeviationValues.WindDirection = Math.Sqrt(sampleStandardDeviationValues.WindDirection / dirCount);
            }
            else
            {
                minValues  = ReadingValues.CreateInvalid();
                maxValues  = ReadingValues.CreateInvalid();
                meanValues = ReadingValues.CreateInvalid();
                sampleStandardDeviationValues = ReadingValues.CreateInvalid();
            }

            return(new ReadingsSummary(
                       dateRangeLow,
                       dateRangeHigh.Subtract(new TimeSpan(1)),
                       minValues, maxValues,
                       meanValues, sampleStandardDeviationValues,
                       readings.Count,
                       tempCounts,
                       presCounts,
                       humCounts,
                       speedCounts,
                       dirCounts
                       ));
        }
예제 #24
0
        public void SetValues(ISensor sensor, IReadingValues reading)
        {
            ReadingValuesConverter <IReadingValues, ReadingValues> converter = null;

            if (null != sensor)
            {
                int n;
                sensorNameLabel.Text = (Int32.TryParse(sensor.Name, out n) && 0 <= n && n < 26)
                                        ? ((char)((byte)('A') + (byte)n)).ToString()
                                        : sensor.Name;
                if (null != ConverterCache && sensor is ISensorInfo)
                {
                    var si = sensor as ISensorInfo;
                    converter = ConverterCache.Get(
                        si.TemperatureUnit, TemperatureUnit,
                        si.SpeedUnit, SpeedUnit,
                        si.PressureUnit, PressureUnit
                        );
                }
            }
            else
            {
                sensorNameLabel.Text = "Sensor";
            }

            const string na = "N/A";

            if (null != reading && reading.IsValid)
            {
                var data = null == converter
                                    ? reading
                                    : converter.Convert(reading)
                ;

                string tempText;
                if (data.IsTemperatureValid)
                {
                    tempText = data.Temperature.ToString("F1") + ' ' + UnitUtility.GetFriendlyName(TemperatureUnit);
                }
                else
                {
                    tempText = na;
                }

                string presText;
                if (data.IsPressureValid)
                {
                    var presUnit = PressureUnit;
                    presText = Math.Round(data.Pressure, presUnit == PressureUnit.Millibar ? 1 : 2).ToString()
                               + ' '
                               + UnitUtility.GetFriendlyName(presUnit)
                    ;
                }
                else
                {
                    presText = na;
                }

                string speedText;
                if (data.IsWindSpeedValid)
                {
                    speedText = data.WindSpeed.ToString("F2") + ' ' + UnitUtility.GetFriendlyName(SpeedUnit);
                }
                else
                {
                    speedText = na;
                }

                string dirText;
                if (data.IsWindDirectionValid)
                {
                    dirText = Math.Round(data.WindDirection).ToString()
                              + "\xb0 "
                              + Vector2D.CardinalDirection.DegreesToBestCardinalName(reading.WindDirection)
                    ;
                }
                else
                {
                    dirText = na;
                }

                tempValue.Text     = tempText;
                pressureValue.Text = presText;
                humidityValue.Text = data.IsHumidityValid
                                        ? (Math.Round(data.Humidity * 100.0, 1).ToString() + '%')
                                        : na
                ;
                windSpeedValue.Text = speedText;
                windDirValue.Text   = dirText;
            }
            else
            {
                tempValue.Text      = na;
                pressureValue.Text  = na;
                humidityValue.Text  = na;
                windSpeedValue.Text = na;
                windDirValue.Text   = na;
            }
        }
예제 #25
0
            public static PackedReading GetCurrentReading(DateTime now, Random rand, IReadingValues lastReading)
            {
                double averagePressure = 1014.23;
                double pressureRange   = 100.0;

                double pressure         = (rand.NextDouble() * pressureRange) - (pressureRange / 2) + averagePressure;
                double windDirectionRad = (rand.NextDouble() * Math.PI * 2.0);


                //double windDirectionDeg = Vector2D.RadiansToDegrees(windDirectionRad);
                //Vector2D windDirectionVec = new Vector2D((Math.Cos(windDirectionRad) * 2.0), (Math.Sin(windDirectionRad) * 2.0));
                //double windDirectionDeg = windDirectionVec.GetNorthRelativeClockwiseAngularDegrees();


                double averageWindSpeed = 9;
                double averageTemp      = 51.0;
                double tempRange        = 10.0;
                double averageHumM      = 79;
                double averageHumA      = 58;

                switch (now.Month)
                {
                case 1: {
                    averageWindSpeed = 10.4;
                    averageTemp      = 27.5;
                    averageHumM      = 77;
                    averageHumA      = 66;
                    break;
                }

                case 2: {
                    averageWindSpeed = 10.3;
                    averageTemp      = 30.5;
                    averageHumM      = 75;
                    averageHumA      = 62;
                    break;
                }

                case 3: {
                    averageWindSpeed = 10.6;
                    averageTemp      = 39.8;
                    averageHumM      = 76;
                    averageHumA      = 57;
                    break;
                }

                case 4: {
                    averageWindSpeed = 10.2;
                    averageTemp      = 49.9;
                    averageHumM      = 74;
                    averageHumA      = 51;
                    break;
                }

                case 5: {
                    averageWindSpeed = 8.7;
                    averageTemp      = 60.0;
                    averageHumM      = 77;
                    averageHumA      = 52;
                    break;
                }

                case 6: {
                    averageWindSpeed = 8;
                    averageTemp      = 68.4;
                    averageHumM      = 80;
                    averageHumA      = 53;
                    break;
                }

                case 7: {
                    averageWindSpeed = 7.3;
                    averageTemp      = 72.6;
                    averageHumM      = 83;
                    averageHumA      = 54;
                    break;
                }

                case 8: {
                    averageWindSpeed = 6.8;
                    averageTemp      = 71;
                    averageHumM      = 86;
                    averageHumA      = 56;
                    break;
                }

                case 9: {
                    averageWindSpeed = 7.4;
                    averageTemp      = 64.0;
                    averageHumM      = 87;
                    averageHumA      = 57;
                    break;
                }

                case 10: {
                    averageWindSpeed = 8.3;
                    averageTemp      = 52.5;
                    averageHumM      = 82;
                    averageHumA      = 55;
                    break;
                }

                case 11: {
                    averageWindSpeed = 9.7;
                    averageTemp      = 42.3;
                    averageHumM      = 79;
                    averageHumA      = 62;
                    break;
                }

                case 12: {
                    averageWindSpeed = 10.1;
                    averageTemp      = 32.5;
                    averageHumM      = 78;
                    averageHumA      = 67;
                    break;
                }
                }
                averageTemp      = UnitUtility.ConvertUnit(averageTemp, TemperatureUnit.Fahrenheit, TemperatureUnit.Celsius);
                tempRange        = 4;
                averageWindSpeed = UnitUtility.ConvertUnit(averageWindSpeed, SpeedUnit.MilesPerHour, SpeedUnit.MetersPerSec) * 4.0;

                double humidityRange = Math.Abs(averageHumM - averageHumA) * 1.5;
                double humidity      = (humidityRange * rand.NextDouble()) - (humidityRange / 2.0) + ((averageHumM + averageHumA) / 2.0);

                humidity /= 100.0;
                double temp = (rand.NextDouble() * tempRange) - (tempRange / 2.0) + averageTemp;

                double windSpeed = rand.NextDouble();

                windSpeed = (windSpeed > 0.5) ? 0 : 4.0 * averageWindSpeed * windSpeed * windSpeed;

                double windDirectionDeg = (((rand.NextDouble() * 360.0) * 4) + 90) / 5.0;           // 4 parts random, 1 part 90 degrees

                var newValues = new ReadingValues(
                    temp,
                    pressure,
                    humidity,
                    windDirectionDeg,
                    windSpeed
                    );

                if (null != lastReading && lastReading.IsValid)
                {
                    var readings = new[] { lastReading, lastReading, lastReading, newValues };

                    var meanCalc = new ReadingValuesMeanCalculator <IReadingValues>();
                }

                var stamp = now.Date.Add(new TimeSpan(now.Hour, now.Minute, now.Second));

                return(new PackedReading(
                           stamp,
                           new PackedReadingValues(newValues)
                           ));
            }
예제 #26
0
파일: DbDataStore.cs 프로젝트: rmdz76/atmo
        private bool PushSummaries(int sensorId, string tableName, IEnumerable <ReadingsSummary> summaries, PosixTimeRange totalRange)
        {
            string insertCommandText = String.Format(
                "INSERT INTO {0} (sensorId,stamp,minValues,maxValues,meanValues,stddevValues,recordCount,tempCount,pressCount,humCount,speedCount,dirCount)"
                + " VALUES (@sensorId,@stamp,@minValues,@maxValues,@meanValues,@stddevValues,@recordCount,@tempCount,@pressCount,@humCount,@speedCount,@dirCount)",
                tableName
                );

            string deleteCommandText = String.Format(
                "DELETE FROM {0} WHERE stamp >= @minStamp AND stamp <= @maxStamp AND sensorId = @sensorId",
                tableName
                );

            using (var command = _connection.CreateTextCommand(deleteCommandText)) {
                command.Transaction = _connection.BeginTransaction();

                var sensorIdParam = command.AddParameter("sensorId", DbType.Int32, sensorId);

                if (totalRange.Span != 0)
                {
                    command.AddParameter("minStamp", DbType.Int32, totalRange.Low);
                    command.AddParameter("maxStamp", DbType.Int32, totalRange.High);
                    command.ExecuteNonQuery();
                }

                command.CommandText = insertCommandText;

                var stampParam     = command.AddParameter("stamp", DbType.Int32, null);
                var minValuesParam = command.AddParameter("minValues", DbType.Binary, null);
                minValuesParam.Size = 8;
                var maxValuesParam = command.AddParameter("maxValues", DbType.Binary, null);
                maxValuesParam.Size = 8;
                var meanValuesParam = command.AddParameter("meanValues", DbType.Binary, null);
                meanValuesParam.Size = 8;
                var stddevValuesParam = command.AddParameter("stddevValues", DbType.Binary, null);
                stddevValuesParam.Size = 8;
                var recordCountParam = command.AddParameter("recordCount", DbType.Int32, null);
                recordCountParam.ParameterName = "recordCount";
                var tempCountParam = command.AddParameter("tempCount", DbType.Binary, null);
                tempCountParam.Size = 0;
                var pressCountParam = command.AddParameter("pressCount", DbType.Binary, null);
                pressCountParam.Size = 0;
                var humCountParam = command.AddParameter("humCount", DbType.Binary, null);
                humCountParam.Size = 0;
                var speedCountParam = command.AddParameter("speedCount", DbType.Binary, null);
                speedCountParam.Size = 0;
                var dirCountParam = command.AddParameter("dirCount", DbType.Binary, null);
                dirCountParam.Size = 0;

                int counter = 0;
                foreach (var summary in summaries)
                {
                    stampParam.Value        = UnitUtility.ConvertToPosixTime(summary.BeginStamp);
                    minValuesParam.Value    = PackedReadingValues.ConvertToPackedBytes(summary.Min);
                    maxValuesParam.Value    = PackedReadingValues.ConvertToPackedBytes(summary.Max);
                    meanValuesParam.Value   = PackedReadingValues.ConvertToPackedBytes(summary.Mean);
                    stddevValuesParam.Value = PackedReadingValues.ConvertToPackedBytes(summary.SampleStandardDeviation);
                    recordCountParam.Value  = summary.Count;

                    byte[] data;
                    tempCountParam.Value  =
                        data              = PackedReadingValues.ConvertTemperatureCountsToPackedBytes(summary.TemperatureCounts);
                    tempCountParam.Size   = data.Length;
                    pressCountParam.Value = data = PackedReadingValues.ConvertPressureCountsToPackedBytes(summary.PressureCounts);
                    pressCountParam.Size  = data.Length;
                    humCountParam.Value   = data = PackedReadingValues.ConvertHumidityCountsToPackedBytes(summary.HumidityCounts);
                    humCountParam.Size    = data.Length;
                    speedCountParam.Value = data = PackedReadingValues.ConvertWindSpeedCountsToPackedBytes(summary.WindSpeedCounts);
                    speedCountParam.Size  = data.Length;
                    dirCountParam.Value   =
                        data              = PackedReadingValues.ConvertWindDirectionCountsToPackedBytes(summary.WindDirectionCounts);
                    dirCountParam.Size    = data.Length;

                    command.ExecuteNonQuery();
                    counter++;
                    if (counter >= RecordBatchQuantity)
                    {
                        counter = 0;
                        command.Transaction.Commit();
                        command.Transaction = _connection.BeginTransaction();
                    }
                }
                command.Transaction.Commit();
            }
            return(true);
        }
예제 #27
0
    public void Init(Transform transform, int subClass)
    {
        fullHPDefault     = Mathf.Max(0, fullHPDefault);
        fullShieldDefault = Mathf.Max(0, fullShieldDefault);

        float globalModifierH = 1, globalModifierS = 1;

        if (subClass == 1)
        {
            globalModifierH = GlobalStatsModifier.CreepHP;
            globalModifierS = GlobalStatsModifier.CreepShield;
        }
        else if (subClass == 2)
        {
            globalModifierH = GlobalStatsModifier.TowerHP;
            globalModifierS = GlobalStatsModifier.TowerShield;
        }

        fullHP     = fullHPDefault * globalModifierH;
        HP         = fullHP;
        fullShield = fullShieldDefault * globalModifierS;
        shield     = fullShield;

        rootTransform = transform;
        cam           = Camera.main.transform;

        if (overlayBase == null)
        {
            if (overlayHP)
            {
                overlayBase          = GameObject.CreatePrimitive(PrimitiveType.Plane).transform;
                overlayBase.position = overlayHP.position;
                overlayBase.rotation = overlayHP.rotation;
            }
            else if (overlayShield)
            {
                overlayBase          = GameObject.CreatePrimitive(PrimitiveType.Plane).transform;
                overlayBase.position = overlayShield.position;
                overlayBase.rotation = overlayShield.rotation;
            }
            else
            {
                return;
            }

            UnitUtility.DestroyColliderRecursively(overlayBase);
            overlayBase.renderer.enabled = false;
            overlayBase.parent           = transform;

            neverShowBase = true;
        }

        offsetB = overlayBase.localPosition;

        if (overlayHP)
        {
            scaleModifierH = UnitUtility.GetWorldScale(overlayHP).x *5;
        }
        if (overlayShield)
        {
            scaleModifierS = UnitUtility.GetWorldScale(overlayShield).x *5;
        }

        if (overlayHP != null)
        {
            overlayHP.gameObject.layer = LayerManager.LayerOverlay();
            overlayRendererH           = overlayHP.renderer;
            overlayHP.parent           = overlayBase;
            overlayScaleH = overlayHP.localScale;
            offsetH       = overlayHP.localPosition;
            if (alwaysShowOverlay)
            {
                overlayRendererH.enabled = true;
            }
            else
            {
                overlayRendererH.enabled = false;
            }
        }
        if (overlayShield != null)
        {
            overlayShield.gameObject.layer = LayerManager.LayerOverlay();
            overlayRendererS     = overlayShield.renderer;
            overlayShield.parent = overlayBase;
            overlayScaleS        = overlayShield.localScale;
            offsetS = overlayShield.localPosition;
            if (alwaysShowOverlay)
            {
                overlayRendererS.enabled = true;
            }
            else
            {
                overlayRendererS.enabled = false;
            }
        }

        if (alwaysShowOverlay)
        {
            overlayIsVisible = true;
        }
    }
예제 #28
0
파일: DbDataStore.cs 프로젝트: rmdz76/atmo
        private IEnumerable <T> GetPackedSummaries <T>(string sensor, DateTime from, TimeSpan span, string tableName)
            where T : PackedReadingsSummary, new()
        {
            DateTime to = from.Add(span);

            if (to < from)
            {
                DateTime s = to;
                to   = from;
                from = s;
            }
            if (!ForceConnectionOpen())
            {
                throw new Exception("Could not open database.");
            }
            using (var command = _connection.CreateTextCommand(String.Format(
                                                                   "SELECT stamp,minValues,maxValues,meanValues,stddevValues,recordCount"
                                                                   + ",tempCount,pressCount,humCount,speedCount,dirCount"
                                                                   + " FROM [{0}]"
                                                                   + " INNER JOIN Sensor ON (Sensor.sensorId = [{0}].sensorId)"
                                                                   + " WHERE Sensor.nameKey = @sensorNameKey"
                                                                   + " AND [{0}].stamp >= @minPosixStamp"
                                                                   + " AND [{0}].stamp < @maxPosixStamp"
                                                                   + " ORDER BY stamp " + ((span < TimeSpan.Zero) ? "DESC" : "ASC"),
                                                                   tableName
                                                                   ))) {
                command.AddParameter("minPosixStamp", DbType.Int32, UnitUtility.ConvertToPosixTime(from));
                command.AddParameter("maxPosixStamp", DbType.Int32, UnitUtility.ConvertToPosixTime(to));
                command.AddParameter("sensorNameKey", DbType.String, sensor);

                using (IDataReader reader = command.ExecuteReader()) {
                    int ordStamp        = reader.GetOrdinal("stamp");
                    int ordMinValues    = reader.GetOrdinal("minValues");
                    int ordMaxValues    = reader.GetOrdinal("maxValues");
                    int ordMeanValues   = reader.GetOrdinal("meanValues");
                    int ordStddevValues = reader.GetOrdinal("stddevValues");
                    int ordRecordCount  = reader.GetOrdinal("recordCount");
                    int ordTempCount    = reader.GetOrdinal("tempCount");
                    int ordPressCount   = reader.GetOrdinal("pressCount");
                    int ordHumCount     = reader.GetOrdinal("humCount");
                    int ordSpeedCount   = reader.GetOrdinal("speedCount");
                    int ordDirCount     = reader.GetOrdinal("dirCount");

                    byte[] values = new byte[8];
                    //return ReadAsSensorReadings(reader);
                    while (reader.Read())
                    {
                        reader.GetBytes(ordMinValues, 0, values, 0, values.Length);
                        PackedReadingValues minValues = PackedReadingValues.ConvertFromPackedBytes(values);
                        reader.GetBytes(ordMaxValues, 0, values, 0, values.Length);
                        PackedReadingValues maxValues = PackedReadingValues.ConvertFromPackedBytes(values);
                        reader.GetBytes(ordMeanValues, 0, values, 0, values.Length);
                        PackedReadingValues meanValues = PackedReadingValues.ConvertFromPackedBytes(values);
                        reader.GetBytes(ordStddevValues, 0, values, 0, values.Length);
                        PackedReadingValues stddevValues = PackedReadingValues.ConvertFromPackedBytes(values);
                        var summary = new T {
                            BeginStamp = UnitUtility.ConvertFromPosixTime(reader.GetInt32(ordStamp)),
                            Min        = minValues,
                            Max        = maxValues,
                            Mean       = meanValues,
                            SampleStandardDeviation = stddevValues,
                            Count             = reader.GetInt32(ordRecordCount),
                            TemperatureCounts =
                                PackedReadingValues.PackedCountsToHashUnsigned16(reader.GetValue(ordTempCount) as byte[]),
                            PressureCounts =
                                PackedReadingValues.PackedCountsToHashUnsigned16(reader.GetValue(ordPressCount) as byte[]),
                            HumidityCounts =
                                PackedReadingValues.PackedCountsToHashUnsigned16(reader.GetValue(ordHumCount) as byte[]),
                            WindSpeedCounts =
                                PackedReadingValues.PackedCountsToHashUnsigned16(reader.GetValue(ordSpeedCount) as byte[]),
                            WindDirectionCounts =
                                PackedReadingValues.PackedCountsToHashUnsigned16(reader.GetValue(ordDirCount) as byte[])
                        };
                        yield return(summary);
                    }
                }
            }
        }
예제 #29
0
 public int SpecificUnitPower(UnitMarch unit)
 {
     return(UnitUtility.CalculateSpecificUnitPowerValue(unit, March));
 }
예제 #30
0
        public static ReadingsSummary Combine <TSummary>(List <TSummary> readings) where TSummary : IReadingsSummary
        {
            int      totalTempCount   = 0;
            int      totalPresCount   = 0;
            int      totalHumCount    = 0;
            int      totalSpeedCount  = 0;
            int      totalDirCount    = 0;
            int      totalRecordCount = 0;
            DateTime minStamp         = DateTime.MaxValue;
            DateTime maxStamp         = DateTime.MinValue;
            double   dirSinSum        = 0;
            double   dirCosSum        = 0;

            var summary = new ReadingsSummary(
                default(DateTime),
                default(DateTime),
                ReadingValues.CreateInvalid(),
                ReadingValues.CreateInvalid(),
                ReadingValues.CreateInvalid(),
                ReadingValues.CreateInvalid(),
                0,
                new Dictionary <double, int>(),
                new Dictionary <double, int>(),
                new Dictionary <double, int>(),
                new Dictionary <double, int>(),
                new Dictionary <double, int>()
                );

            if (0 == readings.Count)
            {
                return(summary);
            }

            summary.Min  = new ReadingValues(Double.MaxValue, Double.MaxValue, Double.MaxValue, Double.MaxValue, Double.MaxValue);
            summary.Max  = new ReadingValues(Double.MinValue, Double.MinValue, Double.MinValue, Double.MinValue, Double.MinValue);
            summary.Mean = new ReadingValues(0, 0, 0, 0, 0);
            summary.SampleStandardDeviation = new ReadingValues(0, 0, 0, 0, 0);

            foreach (var reading in readings)
            {
                if (reading.BeginStamp < minStamp)
                {
                    minStamp = reading.BeginStamp;
                }
                if (reading.EndStamp > maxStamp)
                {
                    maxStamp = reading.EndStamp;
                }

                if (summary.Min.Temperature > reading.Min.Temperature)
                {
                    summary.Min.Temperature = reading.Min.Temperature;
                }
                if (summary.Min.Pressure > reading.Min.Pressure)
                {
                    summary.Min.Pressure = reading.Min.Pressure;
                }
                if (summary.Min.Humidity > reading.Min.Humidity)
                {
                    summary.Min.Humidity = reading.Min.Humidity;
                }
                if (summary.Min.WindSpeed > reading.Min.WindSpeed)
                {
                    summary.Min.WindSpeed = reading.Min.WindSpeed;
                }
                if (summary.Min.WindDirection > reading.Min.WindDirection)
                {
                    summary.Min.WindDirection = reading.Min.WindDirection;
                }
                if (summary.Max.Temperature < reading.Max.Temperature)
                {
                    summary.Max.Temperature = reading.Max.Temperature;
                }
                if (summary.Max.Pressure < reading.Max.Pressure)
                {
                    summary.Max.Pressure = reading.Max.Pressure;
                }
                if (summary.Max.Humidity < reading.Max.Humidity)
                {
                    summary.Max.Humidity = reading.Max.Humidity;
                }
                if (summary.Max.WindSpeed < reading.Max.WindSpeed)
                {
                    summary.Max.WindSpeed = reading.Max.WindSpeed;
                }
                if (summary.Max.WindDirection < reading.Max.WindDirection)
                {
                    summary.Max.WindDirection = reading.Max.WindDirection;
                }

                int localTempCount  = AppendCounts(summary.TemperatureCounts, reading.GetTemperatureCounts());
                int localPresCount  = AppendCounts(summary.PressureCounts, reading.GetPressureCounts());
                int localHumCount   = AppendCounts(summary.HumidityCounts, reading.GetHumidityCounts());
                int localSpeedCount = AppendCounts(summary.WindSpeedCounts, reading.GetWindSpeedCounts());
                int localDirCount   = AppendCounts(summary.WindDirectionCounts, reading.GetWindDirectionCounts());

                totalTempCount   += localTempCount;
                totalPresCount   += localPresCount;
                totalHumCount    += localHumCount;
                totalSpeedCount  += localSpeedCount;
                totalDirCount    += localDirCount;
                totalRecordCount += reading.Count;

                summary.Mean.Temperature += reading.Mean.Temperature * localTempCount;
                summary.Mean.Pressure    += reading.Mean.Pressure * localPresCount;
                summary.Mean.Humidity    += reading.Mean.Humidity * localHumCount;
                summary.Mean.WindSpeed   += reading.Mean.WindSpeed * localSpeedCount;

                double dirRad = reading.Mean.WindDirection * DegToRadFactor;
                dirSinSum += Math.Sin(dirRad) * localDirCount;
                dirCosSum += Math.Cos(dirRad) * localDirCount;
            }

            if (0 != totalTempCount && 1 != totalTempCount)
            {
                summary.Mean.Temperature /= totalTempCount;
            }
            if (0 != totalPresCount && 1 != totalPresCount)
            {
                summary.Mean.Pressure /= totalPresCount;
            }
            if (0 != totalHumCount && 1 != totalHumCount)
            {
                summary.Mean.Humidity /= totalHumCount;
            }
            if (0 != totalSpeedCount && 1 != totalSpeedCount)
            {
                summary.Mean.WindSpeed /= totalSpeedCount;
            }
            summary.Mean.WindDirection = (totalDirCount == 0 || Double.IsNaN(dirSinSum) || Double.IsNaN(dirCosSum))
                            ? Double.NaN
                            : UnitUtility.WrapDegree(Math.Atan2(dirSinSum / totalDirCount, dirCosSum / totalDirCount) * RadToDegFactor);


            double dev;

            foreach (var reading in readings)
            {
                int localTempCount  = reading.GetTemperatureCounts().Sum(c => c.Value);
                int localPresCount  = reading.GetPressureCounts().Sum(c => c.Value);
                int localHumCount   = reading.GetHumidityCounts().Sum(c => c.Value);
                int localSpeedCount = reading.GetWindSpeedCounts().Sum(c => c.Value);
                int localDirCount   = reading.GetWindDirectionCounts().Sum(c => c.Value);

                dev = (reading.Mean.Temperature - summary.Mean.Temperature);
                summary.SampleStandardDeviation.Temperature += (dev * dev) * localTempCount;

                dev = (reading.Mean.Pressure - summary.Mean.Pressure);
                summary.SampleStandardDeviation.Pressure += (dev * dev) * localPresCount;

                dev = (reading.Mean.Humidity - summary.Mean.Humidity);
                summary.SampleStandardDeviation.Humidity += (dev * dev) * localHumCount;

                dev = (reading.Mean.WindSpeed - summary.Mean.WindSpeed);
                summary.SampleStandardDeviation.WindSpeed += (dev * dev) * localSpeedCount;

                dev = (reading.Mean.WindDirection - summary.Mean.WindDirection);
                summary.SampleStandardDeviation.WindDirection += (dev * dev) * localDirCount;
            }

            if (0 != totalTempCount && 1 != totalTempCount)
            {
                summary.SampleStandardDeviation.Temperature = Math.Sqrt(summary.SampleStandardDeviation.Temperature / totalTempCount);
            }
            if (0 != totalPresCount && 1 != totalPresCount)
            {
                summary.SampleStandardDeviation.Pressure = Math.Sqrt(summary.SampleStandardDeviation.Pressure / totalPresCount);
            }
            if (0 != totalHumCount && 1 != totalHumCount)
            {
                summary.SampleStandardDeviation.Humidity = Math.Sqrt(summary.SampleStandardDeviation.Humidity / totalHumCount);
            }
            if (0 != totalSpeedCount && 1 != totalSpeedCount)
            {
                summary.SampleStandardDeviation.WindSpeed = Math.Sqrt(summary.SampleStandardDeviation.WindSpeed / totalSpeedCount);
            }
            if (0 != totalDirCount && 1 != totalDirCount)
            {
                summary.SampleStandardDeviation.WindDirection = Math.Sqrt(summary.SampleStandardDeviation.WindDirection / totalDirCount);
            }

            summary.Count      = totalRecordCount;
            summary.BeginStamp = minStamp;
            summary.EndStamp   = maxStamp;
            return(summary);
        }