Ejemplo n.º 1
0
        private void UpdateColor()
        {
            // adjust red, green, and blue for brightness
            byte red   = (byte)((double)_red * _brightness);
            byte green = (byte)((double)_green * _brightness);
            byte blue  = (byte)((double)_blue * _brightness);

            int iRetry = 0;

            while (iRetry < 36)
            {
                _writeFrameBuffer[0] = 0x80;
                _writeFrameBuffer[1] = 0x02;  // Module command 'SetColor'
                _writeFrameBuffer[2] = red;   // Red
                _writeFrameBuffer[3] = green; // Green
                _writeFrameBuffer[4] = blue;  // Blue
                _writeFrameBuffer[_writeFrameBuffer.Length - 1] = CRC8.Compute8(_writeFrameBuffer, 0, _writeFrameBuffer.Length - 1);
                _spi.Write(_writeFrameBuffer);

                byte verifyRed, verifyGreen, verifyBlue;
                GetColor(out verifyRed, out verifyGreen, out verifyBlue);

                if (red == verifyRed && green == verifyGreen && blue == verifyBlue)
                {
                    return;
                }

                iRetry++;
            }
        }
Ejemplo n.º 2
0
        public double GetValue()
        {
            _writeFrameBuffer[0] = 0x80;
            _writeFrameBuffer[1] = 0x01;  // Module command 'Get ADC value'
            _writeFrameBuffer[_writeFrameBuffer.Length - 1] = CRC8.Compute8(_writeFrameBuffer, 0, _writeFrameBuffer.Length - 1);
            _spi.Write(_writeFrameBuffer);

            // now, wait for irq to be asserted
            bool responseReceived = false;
            int  numRetries       = 36; //4
            int  iRetry           = 0;

            while (true)
            {
                responseReceived = _irqPortInterruptEvent.WaitOne(10, false);

                if (responseReceived || (iRetry >= numRetries - 1))
                {
                    // parse and return the response
                    _writeFrameBuffer[0] = 0x00; // get data from module
                    _writeFrameBuffer[1] = 0x00;
                    _writeFrameBuffer[2] = 0x00;
                    _writeFrameBuffer[3] = 0x00;
                    _writeFrameBuffer[_writeFrameBuffer.Length - 1] = CRC8.Compute8(_writeFrameBuffer, 0, _writeFrameBuffer.Length - 1);
                    _spi.WriteRead(_writeFrameBuffer, _readFrameBuffer);

                    if (_readFrameBuffer[2] == 2)
                    {
                        // Received two byte ADC value
                        double adcValue = ((short)((_readFrameBuffer[3] << 8) | _readFrameBuffer[4])) / (double)1023;
                        _lastAdcValue = adcValue;
                        return(adcValue);
                    }
                    else if (iRetry >= numRetries - 1)
                    {
                        return(_lastAdcValue);
                    }
                    else
                    {
                        // failed to receive response; retry
                        responseReceived = false;
                    }
                }
                else
                {
                    // TODO: limit our retries to a handful of retries (or maybe a few dozen -- quickly)
                    // retry infinitely
                    _writeFrameBuffer[0] = 0x80;
                    _writeFrameBuffer[1] = 0x01;  // Module command 'Get ADC value'
                    _writeFrameBuffer[_writeFrameBuffer.Length - 1] = CRC8.Compute8(_writeFrameBuffer, 0, _writeFrameBuffer.Length - 1);
                    _spi.Write(_writeFrameBuffer);
                }

                iRetry++;
            }
        }
Ejemplo n.º 3
0
        public void SetFrequency(double frequency)
        {
            byte frequencyHighByte;
            byte frequencyLowByte;

            if (frequency <= 0)
            {
                frequencyHighByte = 0;
                frequencyLowByte  = 0;
            }
            else
            {
                // The Piezo Buzzer module time base is 1000 kHz
                int divider = (int)(1000000F / frequency + 0.5);

                // The data sent to module is direct value for the TIM2 ARRH, ARRL
                // registers, to save expensive division on STM8S.
                frequencyHighByte = (byte)(divider >> 8);  // ARRH
                frequencyLowByte  = (byte)(divider);       // ARRL
            }

            int iRetry = 0;

            while (iRetry < 36)
            {
                _writeFrameBuffer[0] = 0x80;
                _writeFrameBuffer[1] = 0x02;  // Module command 'SetColor'
                _writeFrameBuffer[2] = frequencyHighByte;
                _writeFrameBuffer[3] = frequencyLowByte;
                _writeFrameBuffer[_writeFrameBuffer.Length - 1] = CRC8.Compute8(_writeFrameBuffer, 0, _writeFrameBuffer.Length - 1);
                _spi.Write(_writeFrameBuffer);

                double verifyFrequency;
                GetFrequency(out verifyFrequency);

                if (frequency - verifyFrequency <= 100)
                {
                    return;
                }

                iRetry++;
            }
        }
Ejemplo n.º 4
0
        private void GetFrequency(out double frequency)
        {
            _writeFrameBuffer[0] = 0x80;
            _writeFrameBuffer[1] = 0x01;  // Module command 'Get frequency'
            for (int i = 2; i < _writeFrameBuffer.Length - 1; i++)
            {
                _writeFrameBuffer[i] = 0x00;
            }
            _writeFrameBuffer[_writeFrameBuffer.Length - 1] = CRC8.Compute8(_writeFrameBuffer, 0, _writeFrameBuffer.Length - 1);
            _spi.Write(_writeFrameBuffer);

            // now, wait for irq to be asserted
            bool responseReceived = false;
            int  numRetries       = 4;
            int  iRetry           = 0;

            while (true)
            {
                responseReceived = _irqPortInterruptEvent.WaitOne(10, false);

                if (responseReceived || (iRetry >= numRetries - 1))
                {
                    // parse and return the response
                    _writeFrameBuffer[0] = 0x00; // get data from module
                    _writeFrameBuffer[1] = 0x00;
                    _writeFrameBuffer[2] = 0x00;
                    _writeFrameBuffer[3] = 0x00;
                    _writeFrameBuffer[_writeFrameBuffer.Length - 1] = CRC8.Compute8(_writeFrameBuffer, 0, _writeFrameBuffer.Length - 1);
                    _spi.WriteRead(_writeFrameBuffer, _readFrameBuffer);

                    if (_readFrameBuffer[2] == 2)
                    {
                        // Received three byte RGB value
                        byte frequencyHighByte = _readFrameBuffer[3];
                        byte frequencyLowByte  = _readFrameBuffer[4];
                        int  divider           = (int)((frequencyHighByte << 8) | frequencyLowByte);
                        frequency = (divider > 0) ? 1000000F / divider : 0F;
                        return;
                    }
                    else if (iRetry >= numRetries - 1)
                    {
                        frequency = 0F;
                        return;
                    }
                    else
                    {
                        // failed to receive response; retry
                        responseReceived = false;
                    }
                }
                else
                {
                    // TODO: limit our retries to a handful of retries (or maybe a few dozen -- quickly)
                    // retry infinitely
                    _writeFrameBuffer[0] = 0x80;
                    _writeFrameBuffer[1] = 0x01;  // Module command 'Get frequency'
                    _writeFrameBuffer[_writeFrameBuffer.Length - 1] = CRC8.Compute8(_writeFrameBuffer, 0, _writeFrameBuffer.Length - 1);
                    _spi.Write(_writeFrameBuffer);
                }

                iRetry++;
            }
        }
Ejemplo n.º 5
0
        internal Guid GetModuleUniqueId(GoSocket socket)
        {
            int frameLength = 1 + 16 + 1;

            byte[] writeFrameBuffer = new byte[frameLength];
            byte[] readFrameBuffer  = new byte[frameLength];

            // get socket's physical pins and SPI bus
            Cpu.Pin        socketGpioPin;
            SPI.SPI_module socketSpiModule;
            Cpu.Pin        socketSpiSlaveSelectPin;
            //
            socket.GetPhysicalResources(out socketGpioPin, out socketSpiModule, out socketSpiSlaveSelectPin);

            SPI.Configuration spiConfig;
            SPI spi;

            try
            {
                spiConfig = new SPI.Configuration(socketSpiSlaveSelectPin, false, 0, 0, false, false, 500, socketSpiModule);
                spi       = new SPI(spiConfig);
            }
            catch
            {
                return(Guid.Empty);
            }

            // TODO: move the socket4ChipSelectDeassert logic to native code (this suppresses the MCO)
            OutputPort socket4ChipSelectDeassert = null;

            if (Port.ReservePin((Cpu.Pin) 0x08, true))
            {
                socket4ChipSelectDeassert = new OutputPort((Cpu.Pin) 0x08, true);
            }

            int iEnumAttempt    = 0;
            int emptyFrameCount = 0;

            byte basicDeviceType = 0x00;

            try
            {
                while (iEnumAttempt < 72)       // NOTE: 72 attempts allow our frame to rotate four full times in case of frame mis-alignment; this should be unnecessary in time.
                {
                    writeFrameBuffer[0] = 0xFE; // 'Enumerate' command
                    for (int i = 1; i < writeFrameBuffer.Length - 1; i++)
                    {
                        writeFrameBuffer[i] = 0xFF; // filler -- so that module sends ID
                    }
                    writeFrameBuffer[writeFrameBuffer.Length - 1] = CRC8.Compute8(writeFrameBuffer, 0, writeFrameBuffer.Length - 1);
                    spi.WriteRead(writeFrameBuffer, readFrameBuffer);

                    // validate the response...
                    bool replyIsBlank = true;
                    for (int i = 1; i < readFrameBuffer.Length - 1; i++)
                    {
                        if (readFrameBuffer[i] != 0)
                        {
                            replyIsBlank = false;
                        }
                    }

                    if (replyIsBlank)
                    {
                        // no response; try again (up to 4 times total)
                        emptyFrameCount++;
                        if (emptyFrameCount > 4)
                        {
                            return(Guid.Empty);
                        }
                    }
                    else if (CRC8.Compute8(readFrameBuffer) == 0)
                    {
                        return(new Guid(Microsoft.SPOT.Hardware.Utility.ExtractRangeFromArray(readFrameBuffer, 1, readFrameBuffer.Length - 2)));
                    }
                    else if (readFrameBuffer[1] != 0)
                    {
                        bool replyIsBasicDevice = true;
                        // did not pass CRC; see if it's a basic device type (first byte is id, then all other bytes including CRC will be zeros)
                        for (int i = 2; i < readFrameBuffer.Length; i++)
                        {
                            if (readFrameBuffer[i] != 0)
                            {
                                replyIsBasicDevice = false;
                            }
                        }

                        if (replyIsBasicDevice)
                        {
                            if (basicDeviceType == 0)
                            {
                                // first successful query; store this id and we'll verify by second enum
                                basicDeviceType = readFrameBuffer[1];
                            }
                            else
                            {
                                if (basicDeviceType == readFrameBuffer[1])
                                {
                                    return(new Guid(Microsoft.SPOT.Hardware.Utility.ExtractRangeFromArray(readFrameBuffer, 1, readFrameBuffer.Length - 2)));
                                }
                                else
                                {
                                    // mismatch; could not enumerate successfully
                                    return(Guid.Empty);
                                }
                            }
                        }
                    }
                    else
                    {
                        // corrupt message; try again
                    }

                    iEnumAttempt++;
                }
            }
            finally
            {
                if (socket4ChipSelectDeassert != null)
                {
                    socket4ChipSelectDeassert.Dispose();
                    Port.ReservePin((Cpu.Pin) 0x08, false);
                }
            }

            // if we reach here, we could not retrieve a GUID.
            return(Guid.Empty);
        }
Ejemplo n.º 6
0
        private void GetColor(out byte red, out byte green, out byte blue)
        {
            _writeFrameBuffer[0] = 0x80;
            _writeFrameBuffer[1] = 0x01;  // Module command 'Get RGB LED color values'
            for (int i = 2; i < _writeFrameBuffer.Length - 1; i++)
            {
                _writeFrameBuffer[i] = 0x00;
            }
            _writeFrameBuffer[_writeFrameBuffer.Length - 1] = CRC8.Compute8(_writeFrameBuffer, 0, _writeFrameBuffer.Length - 1);
            _spi.Write(_writeFrameBuffer);

            // now, wait for irq to be asserted
            bool responseReceived = false;
            int  numRetries       = 4;
            int  iRetry           = 0;

            while (true)
            {
                responseReceived = _irqPortInterruptEvent.WaitOne(3, false);

                if (responseReceived || (iRetry >= numRetries - 1))
                {
                    // parse and return the response
                    _writeFrameBuffer[0] = 0x00; // get data from module
                    _writeFrameBuffer[1] = 0x00;
                    _writeFrameBuffer[2] = 0x00;
                    _writeFrameBuffer[3] = 0x00;
                    _writeFrameBuffer[_writeFrameBuffer.Length - 1] = CRC8.Compute8(_writeFrameBuffer, 0, _writeFrameBuffer.Length - 1);
                    _spi.WriteRead(_writeFrameBuffer, _readFrameBuffer);

                    if (_readFrameBuffer[2] == 3)
                    {
                        // Received three byte RGB value
                        red   = _readFrameBuffer[3];
                        green = _readFrameBuffer[4];
                        blue  = _readFrameBuffer[5];
                        return;
                    }
                    else if (iRetry >= numRetries - 1)
                    {
                        red   = 0;
                        blue  = 0;
                        green = 0;
                        return;
                    }
                    else
                    {
                        // failed to receive response; retry
                        responseReceived = false;
                    }
                }
                else
                {
                    // TODO: limit our retries to a handful of retries (or maybe a few dozen -- quickly)
                    // retry infinitely
                    _writeFrameBuffer[0] = 0x80;
                    _writeFrameBuffer[1] = 0x01;  // Module command 'Get RGB LED color values'
                    _writeFrameBuffer[_writeFrameBuffer.Length - 1] = CRC8.Compute8(_writeFrameBuffer, 0, _writeFrameBuffer.Length - 1);
                    _spi.Write(_writeFrameBuffer);
                }

                iRetry++;
            }
        }