示例#1
0
        public SparkFun_APDS9960(ref I2cDevice i2CDevice)
        {
            I2C = i2CDevice;

            _gestureUdDelta = 0;
            _gestureLrDelta = 0;

            _gestureUdCount = 0;
            _gestureLrCount = 0;

            _gestureNearCount = 0;
            _gestureFarCount  = 0;

            _gestureState  = StateDefinitions.NA_STATE;
            _gestureMotion = DirectionDefinitions.DIR_NONE;
        }
示例#2
0
        private void ResetGestureParameters()
        {
            _gestureData.Index         = 0;
            _gestureData.TotalGestures = 0;

            _gestureUdDelta = 0;
            _gestureLrDelta = 0;

            _gestureUdCount = 0;
            _gestureLrCount = 0;

            _gestureNearCount = 0;
            _gestureFarCount  = 0;

            _gestureState  = StateDefinitions.NA_STATE;
            _gestureMotion = DirectionDefinitions.DIR_NONE;
        }
示例#3
0
        public void StateDefintionReceive(string stateName, string currentMessageName)
        {
            var definition = StateDefinitions.FirstOrDefault(x => x.Name == stateName);

            definition?.ReceiveMessage(currentMessageName);
        }
示例#4
0
 public bool ContainsStateDefintion(string name)
 {
     return(StateDefinitions.Any(x => x.Name == name));
 }
示例#5
0
        public SparkFun_APDS9960(ref I2cDevice i2CDevice)
        {
            I2C = i2CDevice;

            _gestureUdDelta = 0;
            _gestureLrDelta = 0;

            _gestureUdCount = 0;
            _gestureLrCount = 0;

            _gestureNearCount = 0;
            _gestureFarCount = 0;

            _gestureState = StateDefinitions.NA_STATE;
            _gestureMotion = DirectionDefinitions.DIR_NONE;
        }
示例#6
0
        private bool ProcessGestureData()
        {
            byte uFirst = 0;
            byte dFirst = 0;
            byte lFirst = 0;
            byte rFirst = 0;
            byte uLast = 0;
            byte dLast = 0;
            byte lLast = 0;
            byte rLast = 0;
            int udRatioFirst;
            int lrRatioFirst;
            int udRatioLast;
            int lrRatioLast;
            int udDelta;
            int lrDelta;
            int i;

            /* If we have less than 4 total gestures, that's not enough */
            if (_gestureData.TotalGestures <= 4)
            {
                return false;
            }

            /* Check to make sure our data isn't out of bounds */
            if ((_gestureData.TotalGestures <= 32) && (_gestureData.TotalGestures > 0))
            {
                /* Find the first value in U/D/L/R above the threshold */
                for (i = 0; i < _gestureData.TotalGestures; i++)
                {
                    if ((_gestureData.UData[i] > GESTURE_THRESHOLD_OUT) && (_gestureData.DData[i] > GESTURE_THRESHOLD_OUT) && (_gestureData.LData[i] > GESTURE_THRESHOLD_OUT) && (_gestureData.RData[i] > GESTURE_THRESHOLD_OUT))
                    {
                        uFirst = _gestureData.UData[i];
                        dFirst = _gestureData.DData[i];
                        lFirst = _gestureData.LData[i];
                        rFirst = _gestureData.RData[i];
                        break;
                    }
                }

                /* If one of the _first values is 0, then there is no good data */
                if ((uFirst == 0) || (dFirst == 0) || (lFirst == 0) || (rFirst == 0))
                {
                    return false;
                }
                /* Find the last value in U/D/L/R above the threshold */
                for (i = _gestureData.TotalGestures - 1; i >= 0; i--)
                {
                    if ((_gestureData.UData[i] > GESTURE_THRESHOLD_OUT) && (_gestureData.DData[i] > GESTURE_THRESHOLD_OUT) && (_gestureData.LData[i] > GESTURE_THRESHOLD_OUT) && (_gestureData.RData[i] > GESTURE_THRESHOLD_OUT))
                    {
                        uLast = _gestureData.UData[i];
                        dLast = _gestureData.DData[i];
                        lLast = _gestureData.LData[i];
                        rLast = _gestureData.RData[i];
                        break;
                    }
                }
            }

            /* Calculate the first vs. last ratio of up/down and left/right */
            udRatioFirst = ((uFirst - dFirst) * 100) / (uFirst + dFirst);
            lrRatioFirst = ((lFirst - rFirst) * 100) / (lFirst + rFirst);
            udRatioLast = ((uLast - dLast) * 100) / (uLast + dLast);
            lrRatioLast = ((lLast - rLast) * 100) / (lLast + rLast);
            /* Determine the difference between the first and last ratios */
            udDelta = udRatioLast - udRatioFirst;
            lrDelta = lrRatioLast - lrRatioFirst;
            /* Accumulate the UD and LR delta values */
            _gestureUdDelta += udDelta;
            _gestureLrDelta += lrDelta;
            /* Determine U/D gesture */
            if (_gestureUdDelta >= GESTURE_SENSITIVITY_1)
            {
                _gestureUdCount = 1;
            }
            else if (_gestureUdDelta <= -GESTURE_SENSITIVITY_1)
            {
                _gestureUdCount = -1;
            }
            else
            {
                _gestureUdCount = 0;
            }

            /* Determine L/R gesture */
            if (_gestureLrDelta >= GESTURE_SENSITIVITY_1)
            {
                _gestureLrCount = 1;
            }
            else if (_gestureLrDelta <= -GESTURE_SENSITIVITY_1)
            {
                _gestureLrCount = -1;
            }
            else
            {
                _gestureLrCount = 0;
            }

            /* Determine Near/Far gesture */
            if ((_gestureUdCount == 0) && (_gestureLrCount == 0))
            {
                if ((Math.Abs(udDelta) < GESTURE_SENSITIVITY_2) && (Math.Abs(lrDelta) < GESTURE_SENSITIVITY_2))
                {
                    if ((udDelta == 0) && (lrDelta == 0))
                    {
                        _gestureNearCount++;
                    }
                    else if ((udDelta != 0) || (lrDelta != 0))
                    {
                        _gestureFarCount++;
                    }

                    if ((_gestureNearCount >= 10) && (_gestureFarCount >= 2))
                    {
                        if ((udDelta == 0) && (lrDelta == 0))
                        {
                            _gestureState = StateDefinitions.NEAR_STATE;
                        }
                        else if ((udDelta != 0) && (lrDelta != 0))
                        {
                            _gestureState = StateDefinitions.FAR_STATE;
                        }
                        return true;
                    }
                }
            }
            else
            {
                if ((Math.Abs(udDelta) < GESTURE_SENSITIVITY_2) && (Math.Abs(lrDelta) < GESTURE_SENSITIVITY_2))
                {
                    if ((udDelta == 0) && (lrDelta == 0))
                    {
                        _gestureNearCount++;
                    }

                    if (_gestureNearCount >= 10)
                    {
                        _gestureUdCount = 0;
                        _gestureLrCount = 0;
                        _gestureUdDelta = 0;
                        _gestureLrDelta = 0;
                    }
                }
            }
            return false;
        }
示例#7
0
        private void ResetGestureParameters()
        {
            _gestureData.Index = 0;
            _gestureData.TotalGestures = 0;

            _gestureUdDelta = 0;
            _gestureLrDelta = 0;

            _gestureUdCount = 0;
            _gestureLrCount = 0;

            _gestureNearCount = 0;
            _gestureFarCount = 0;

            _gestureState = StateDefinitions.NA_STATE;
            _gestureMotion = DirectionDefinitions.DIR_NONE;
        }
示例#8
0
        private bool ProcessGestureData()
        {
            byte uFirst = 0;
            byte dFirst = 0;
            byte lFirst = 0;
            byte rFirst = 0;
            byte uLast  = 0;
            byte dLast  = 0;
            byte lLast  = 0;
            byte rLast  = 0;
            int  udRatioFirst;
            int  lrRatioFirst;
            int  udRatioLast;
            int  lrRatioLast;
            int  udDelta;
            int  lrDelta;
            int  i;

            /* If we have less than 4 total gestures, that's not enough */
            if (_gestureData.TotalGestures <= 4)
            {
                return(false);
            }

            /* Check to make sure our data isn't out of bounds */
            if ((_gestureData.TotalGestures <= 32) && (_gestureData.TotalGestures > 0))
            {
                /* Find the first value in U/D/L/R above the threshold */
                for (i = 0; i < _gestureData.TotalGestures; i++)
                {
                    if ((_gestureData.UData[i] > GESTURE_THRESHOLD_OUT) && (_gestureData.DData[i] > GESTURE_THRESHOLD_OUT) && (_gestureData.LData[i] > GESTURE_THRESHOLD_OUT) && (_gestureData.RData[i] > GESTURE_THRESHOLD_OUT))
                    {
                        uFirst = _gestureData.UData[i];
                        dFirst = _gestureData.DData[i];
                        lFirst = _gestureData.LData[i];
                        rFirst = _gestureData.RData[i];
                        break;
                    }
                }

                /* If one of the _first values is 0, then there is no good data */
                if ((uFirst == 0) || (dFirst == 0) || (lFirst == 0) || (rFirst == 0))
                {
                    return(false);
                }
                /* Find the last value in U/D/L/R above the threshold */
                for (i = _gestureData.TotalGestures - 1; i >= 0; i--)
                {
                    if ((_gestureData.UData[i] > GESTURE_THRESHOLD_OUT) && (_gestureData.DData[i] > GESTURE_THRESHOLD_OUT) && (_gestureData.LData[i] > GESTURE_THRESHOLD_OUT) && (_gestureData.RData[i] > GESTURE_THRESHOLD_OUT))
                    {
                        uLast = _gestureData.UData[i];
                        dLast = _gestureData.DData[i];
                        lLast = _gestureData.LData[i];
                        rLast = _gestureData.RData[i];
                        break;
                    }
                }
            }

            /* Calculate the first vs. last ratio of up/down and left/right */
            udRatioFirst = ((uFirst - dFirst) * 100) / (uFirst + dFirst);
            lrRatioFirst = ((lFirst - rFirst) * 100) / (lFirst + rFirst);
            udRatioLast  = ((uLast - dLast) * 100) / (uLast + dLast);
            lrRatioLast  = ((lLast - rLast) * 100) / (lLast + rLast);
            /* Determine the difference between the first and last ratios */
            udDelta = udRatioLast - udRatioFirst;
            lrDelta = lrRatioLast - lrRatioFirst;
            /* Accumulate the UD and LR delta values */
            _gestureUdDelta += udDelta;
            _gestureLrDelta += lrDelta;
            /* Determine U/D gesture */
            if (_gestureUdDelta >= GESTURE_SENSITIVITY_1)
            {
                _gestureUdCount = 1;
            }
            else if (_gestureUdDelta <= -GESTURE_SENSITIVITY_1)
            {
                _gestureUdCount = -1;
            }
            else
            {
                _gestureUdCount = 0;
            }

            /* Determine L/R gesture */
            if (_gestureLrDelta >= GESTURE_SENSITIVITY_1)
            {
                _gestureLrCount = 1;
            }
            else if (_gestureLrDelta <= -GESTURE_SENSITIVITY_1)
            {
                _gestureLrCount = -1;
            }
            else
            {
                _gestureLrCount = 0;
            }

            /* Determine Near/Far gesture */
            if ((_gestureUdCount == 0) && (_gestureLrCount == 0))
            {
                if ((Math.Abs(udDelta) < GESTURE_SENSITIVITY_2) && (Math.Abs(lrDelta) < GESTURE_SENSITIVITY_2))
                {
                    if ((udDelta == 0) && (lrDelta == 0))
                    {
                        _gestureNearCount++;
                    }
                    else if ((udDelta != 0) || (lrDelta != 0))
                    {
                        _gestureFarCount++;
                    }

                    if ((_gestureNearCount >= 10) && (_gestureFarCount >= 2))
                    {
                        if ((udDelta == 0) && (lrDelta == 0))
                        {
                            _gestureState = StateDefinitions.NEAR_STATE;
                        }
                        else if ((udDelta != 0) && (lrDelta != 0))
                        {
                            _gestureState = StateDefinitions.FAR_STATE;
                        }
                        return(true);
                    }
                }
            }
            else
            {
                if ((Math.Abs(udDelta) < GESTURE_SENSITIVITY_2) && (Math.Abs(lrDelta) < GESTURE_SENSITIVITY_2))
                {
                    if ((udDelta == 0) && (lrDelta == 0))
                    {
                        _gestureNearCount++;
                    }

                    if (_gestureNearCount >= 10)
                    {
                        _gestureUdCount = 0;
                        _gestureLrCount = 0;
                        _gestureUdDelta = 0;
                        _gestureLrDelta = 0;
                    }
                }
            }
            return(false);
        }