segunda-feira, 18 de junho de 2012

Escrevedo no Cartão SD - Parte 2

No primeiro artigo sobre a escrita no cartão SD foi visto um código básico para escrever no cartão SD na forma de arquivo sem preocupações adicionais com a segurança da escrita, que para uma solução mais robusta, é necessária. Por trata-se de um elemento móvel e intercambiável, o cartão SD pode ser removido indiscriminadamente, muito embora os leitores desse bolg jamais tenham feito isso, espero. Além disso, o cartão pode ser danificado.

Em todos os casos faz-se necessária uma validação de o cartão SD está realmente inserido no soquete. Pesquisando nas decentralizadas informações do site do Netduino consegui encontrar na wiki um artigo sobre isso: http://wiki.netduino.com/Detecting-the-presence-of-an-SD-Card.ashx


_________________________________________________________________________________________________using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.IO;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;

namespace SD_Card_Example_2
{
    public class Program
    {
        //Inicialização do código
       public static void Main()
        {
            //Inicializa o Led e o Botão da placa
            InputPort bord_button = new InputPort(Pins.ONBOARD_SW1, false,
                                        Port.ResistorMode.Disabled);
            //Cria a Data Atual
            DateTime CurrentDate = new DateTime(2012, 06, 17, 14, 08, 00);
            Int32 InterruptTime = 10000;

            //Criando o Evento periódico de tempo que chama a função LightCheckProcessEvents
            //para escrever no cartão a condição de luz e o tempo
            AutoResetEvent autoEvent = new AutoResetEvent(false);
            LightCheck LightCheckObject = new LightCheck(CurrentDate, InterruptTime);
            TimerCallback LightCheckCallBack = LightCheckObject.LightCheckProcessEvents;
            Timer LightCheckTimer = new System.Threading.Timer(LightCheckCallBack, autoEvent, InterruptTime, InterruptTime);

           //Inifinito!
           Thread.Sleep(Timeout.Infinite);
       }
    }

    public class LightCheck
    {
       
        private static System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
           
        //Cria o pino de interrução
        private static InterruptPort sdCardStatusPort = new InterruptPort((Cpu.Pin)57, false,
                                                                    Port.ResistorMode.PullUp,
                                                                    Port.InterruptMode.InterruptEdgeBoth);

        // Global
        Boolean SDCardIsOk = true;
        DateTime InternalDate;
        Int32 InternalInterruptTime;
        OutputPort bord_led = new OutputPort(Pins.ONBOARD_LED, false);
        InputPort bord_ldr = new InputPort(Pins.GPIO_PIN_D0, false, Port.ResistorMode.Disabled);

        ///


        /// Contrutor, passa a data corrente paa inicio dos registros
        ///

        /// Data Atual
        /// Tempo da Interrupção em milisegundos
        public LightCheck(DateTime date, Int32 InterruptTime)
        {
            InternalDate = date;
            InternalInterruptTime = InterruptTime;
               
            //Cria o chamado do pino de interrupção quando o Cartão SD é movido
            sdCardStatusPort.OnInterrupt += sdCardStatusPort_OnInterrupt;
        }

        ///


        /// Processa os eventos basenados na interrupção periódica
        ///

        /// Objeto que Chama
        public void LightCheckProcessEvents(object o)
        {
            //quando chama aumenta o tempo
            InternalDate = InternalDate.AddMilliseconds((double)InternalInterruptTime);

            //Se o cartão Sd está acessível então:
            if (sdCardStatusPort.Read() == false)
            {
                //Acessa o Cartão SD e cria/acessa (cria se não existir ainda) um arquivo
                //chamdo "fileTest.txt" onde os dados serão salvos
                FileStream log_file = new FileStream(@"\SD\light.txt", FileMode.Append);

                //Cria uma mensagem de teste que será escrita toda a vez que o botão for
                //precionado na placa do netduino
                string msg = InternalDate.ToString("G") + "\t" + bord_ldr.Read().ToString() + "\n";

                //Escreve o dado no arquivo
                log_file.Write(encoding.GetBytes(msg), 0, msg.Length);

                //Fecha o acesso ao cartão
                log_file.Flush();
                log_file.Close();
                log_file.Dispose();

                //Pisca o Led 10x para comprovar que o o dado foi escrito mesmo.
                Int16 i = 0;
                bord_led.Write(false);
                for (i = 0; i < 10; i++)
                {
                    bord_led.Write(!bord_led.Read());
                    Thread.Sleep(100);
                }
            }

        }

        ///


        /// Interrupção de Remoção do Cartão SD
        ///

        /// ?
        /// ?
        /// Momento em que o cartão foi removido
        public void sdCardStatusPort_OnInterrupt(uint data1, uint data2, DateTime time)
        {

            //Se o cartão foi removido
            if (sdCardStatusPort.Read() == true)
            {
                SDCardIsOk = false;
                //Pisca o Led Infinitamente enquanto o cartão estiver fora da placa
                while (sdCardStatusPort.Read() == true)
                {
                    bord_led.Write(!bord_led.Read());
                    Thread.Sleep(200);
                }


            }
            else
            {
                SDCardIsOk= true;
            }

            bord_led.Write(false);
        }
    }
}
_________________________________________________________________________________________________

Esse código ainda não possuí todos os melhoramentos que se deve, mas já é um inicio, em relação ao código final da primeira parte desse artigo sobre escrita no cartão SD; esse software faz o LED da placa piscar continuamente se o cartão SD for removido ajudando a identificar o problema, não fiz a opção por continuar a salvar os dados, tão somente deixei de aquistá-los.

Nenhum comentário:

Postar um comentário