Arduino Forum

International => Español => Proyectos => Topic started by: noter on Dec 23, 2014, 04:21 pm

Title: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Dec 23, 2014, 04:21 pm
Hola.
Pues dada la inquietud que surgió a raiz de la solución dada a un post sobre software (http://forum.arduino.cc/index.php?topic=285248.msg2012739#msg2012739), podemos intentar crear una librería para gestión de una tabla en SD con un número de registros considerable.
Establezco como punto de partida el último post de maxid para comenzar con las disertaciones previas:
llego tarde pero tengo varias ideas.

Primero encontré que la libreria SD.h hereda de Stream por lo que tiene un metodo Find (http://arduino.cc/en/Reference/StreamFind), probé en un ejemplo y compila, no tengo una sd para probar.


Con respecto al tamaño, de claves lo vengo pensando hace rato porque tengo un proyecto que lo usa y lo tengo en espera.
les comentos algunas opciones
  • Si lo accedes de una pc ya lo envias ordenado en el archivo.
  • Un metodo que usaba novell, era calcular un hash de la posicion aproximada, desde ahi para abajo seguia buscando secuencialmente, esto permite una busqueda muy rapida
  • Otra es tenerlos ordenados e ir comparando el primer caracter solo, si no coincide pasar a la siguiente linea, si coincide seguir con el segundo caracter. Mejora el rendimiento ya que no hay que leer la clave completa.
  • Tambien se puede armar una cache de claves mas usada y primero leer ahi despues en el resto, que puede estar en un array en la eprom o en ram misma


Propongo como punto de partida (creo que ya tiene implementadas cosas muy buenas) la librería ExtendedDatabaseLibrary (http://playground.arduino.cc/Code/ExtendedDatabaseLibrary). Si os parece, intentaremos modificarla para enfocarla totalmente a archivo SD, y ampliarla para dotarla de funciones de búsqueda e indexación.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Dec 23, 2014, 05:06 pm
PREMISAS A TENER EN CUENTA:

Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on Dec 23, 2014, 07:16 pm
Bien, Noter como siempre lo has planteado de las mil maravillas.
Creo que también debemos establecer un criterio que establezca cuando es necesario mantener el orden del archivo y cuando no.
La librería EDB (extended database Library) trabaja sobre EEPROM del AVR, EEPROM serial externa o SD.
No es lo mismo reescribir en un AVR 100k lecturas/escrituras posibles, una serial que creo tiene 1millon y una SD que no me importa porque la cambio si se daña, claro que a costa de perder la DB Data Base.

Creo que en algún momento este punto debería contemplarse.

Voy a transcribir un texto muy corto pero muy indicativo de lo que se va a hacer y es para quienes comiencen a leer este proyecto y sepan de que estamos hablando.

En programación, una estructura de datos (http://es.wikipedia.org/wiki/Estructura_de_datos) es una forma de organizar un conjunto de datos elementales con el objetivo de facilitar su manipulación. Un dato elemental es la mínima información que se tiene en un sistema.

Una estructura de datos define la organización e interrelación de estos y un conjunto de operaciones que se pueden realizar sobre ellos. Las operaciones básicas son:

    Alta, adicionar un nuevo valor a la estructura.

    Baja, borrar un valor de la estructura.

    Búsqueda, encontrar un determinado valor en la estructura para realizar una operación con este valor, en forma secuencial o binario (siempre y cuando los datos estén ordenados).

Otras operaciones que se pueden realizar son:

    Ordenamiento, de los elementos pertenecientes a la estructura.
    Apareo, dadas dos estructuras originar una nueva ordenada y que contenga a las apareadas.

Cada estructura ofrece ventajas y desventajas en relación a la simplicidad y eficiencia para la realización de cada operación. De esta forma, la elección de la estructura de datos apropiada para cada problema depende de factores como la frecuencia y el orden en que se realiza cada operación sobre los datos.

 
Todas las búsquedas se organizar alrededor de estos métodos de manera que conocer la teoría es un buen comienzo.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jan 23, 2015, 11:29 pm
Hola, surbyte.
De momento estoy con el esqueleto. Se trata de una librería con plantilla, ya que es la única forma que he encontrado para poder recibir de los sketch las dos piedras de toque en las que me voy a basar.
Para ir abriendo boca:
Básicamente, para crear un objeto, se deben definir una estructura de datos (con los datos que van a componer un registro) y una función que pueda comparar dos estructuras de ese tipo y devuelva si la primera es mayor, menor o igual que la segunda. La librería tomará esa estructura y esa función para realizar las búsquedas y ordenaciones.
La tabla contendrá un header, un índice (según la función que le vamos a enviar) y los datos en sí.
Espero poder poner en breve las primeras pinceladas, para ver qué se puede mejorar o agregar.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jan 26, 2015, 07:46 am
Menuda lata con la plantilla. Me estaba volviendo loco, porque me daba errores el compilador de cosas no encontradas. Finalmente, tras mucho buscar y devanarme los sesos di con el problema:

SI ALGUNA VEZ TRATÁIS CON PLANTILLAS NO IMPLEMENTÉIS SUS MÉTODOS EN UN ARCHIVO .CPP.

Se puede ubicar todo el código en el propio archivo.h o se puede realizar un #include desde el propio archivo de cabecera (osea al revés) de otro archivo con extensión distinta a cpp. Es la forma por la que opté finalmente.

Bueno; pasada la primera en la frente, pongo el código del esqueleto en el primer post (no esperéis que funcione ni de broma :) ), y así comento mis primeros dilemas.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jan 26, 2015, 08:28 am
A TORTAS CON LA ESTRUCTURA



La verdad es que para la mayoría de las aplicaciones arduino que se suele utilizar un archivo de datos, bien no sería necesario utilizar un archivo indexado (si el número de registros no es elevado) o bien el propio archivo sería un índice en sí. Recuerdo, por ejemplo, un proyecto en el que había que cotejar un número de teléfono (remitente de SMS) para comprobar si estaba en la tabla. Tres opciones a priori:



Hasta aquí nos podríamos desenvolver para las situaciones más habituales, así que no sé si realmente tiene mucho sentido lo que he comenzado a desarrollar. No obstante, como ya metí las dos piernas en el barro, intentaremos llevarlo hasta el final.

Supongamos que queremos guardar una serie de datos con un campo clave, por ejemplo
DOCUMENTO (campo clave), NOMBRE, TELÉFONO, DIRECCIÓN. Evidentemente, podríamos guardarlos ordenadamente según su número de documento en la tabla pero, suponiendo que la longitud de registro sea de 100 bytes y tengamos almacenados 1000 registros y queremos insertar uno que (oh, cielos) le corresponde el principio de la tabla, tendremos que mover 100 k de datos para hacerle hueco al nuevo registro. ¿Alguien podría calcular o comprobar directamente (en estos momentos no tengo a mano mi arduino) con qué velocidad de escritura contamos? (Según mi cálculo con los dedos medio mega por segundo)
Lo digo por tomar esta vía o complicarlo un poco más (crear un índice separado de los datos.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on Jan 26, 2015, 09:45 pm
Bien lo que he visto Serafín que el tema de la base de datos se esta volviendo una pregunta muy frecuente asi que este post luego tendra que convertirse en un tutorial para estos casos. Un FAQ.

NO se si te entendí bien, pero aca hay un post que discute velocidades de escritura en SD. van de 25kb/seg como muy bueno.
Yo lei en otro post 3kb/seg
A 25k eso implica 4 segundos para reescribir los 100k
A digamos 4k para hacer fáciles las cuentas son 25 seg para mover misma cantidad de datos.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jan 26, 2015, 10:48 pm
Bien; entonces creo que merecerá la pena el jaleo que estoy montando, de integrar en el archivo un índice y datos separados doblemente enlazados.
¿Sabéis qué creo qué me vendría muy bien, y a buen seguro que a muchos también? Un tutorial, o más bien una discusión con un post inicial dinámico con las cosas que saquemos en común sobre recomendaciones de estilo, porque cada vez que retomo un programa me doy cuenta de que cambio totalmente la "ortografía y gramática de la programación" y me quedan ilegibles. Paso de crear , por ejemplo variables en estilo MiVariable a miVariable, mi_variable, ulMiVariable... y al final acabo mezclando todo, con lo que me quedan unas chapuzas visuales... A buen seguro que a esta librería va a necesitar de una buena capa de maquillaje cuando la acabe para poder ser legible.
Bueno. Voy a seguir con ella. Creo que voy estando cerca de finalizar (seguro que con muchos fallos) la primera versión. Cuando la suba intentaré explicar cómo la estoy intentando desarrollar, a ver qué ideas podemos recabar para mejorarla.
Saludos.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jan 31, 2015, 01:45 am
Hola de nuevo.
Llevo un par de días pegándome con el código y sin hacer una sola prueba con mi arduino, y ahora que parece que tengo algo con lo que empezar a hacer pruebas, no tengo el arduino a mano hasta el miércoles. La verdad es que tampoco me llevo muy bien con los módulos SD (no tengo shields) pues hasta ahora, no sé si por cableado, alimentación o qué, no consigo trabajar con la tarjeta con la librería SD, a no ser que baje la velocidad SPI.
Actualizo el proyecto al estado actual. He cambiado algunos conceptos de enfoque y nombres de métodos para intentar hacerlos un poco intuitivos. Para un primer vistazo a la librería, lo mejor es echar un vistazo al archivo FDB.h, y sobre todo a los métodos públicos de la clase (a ver si los entendéis, y si creéis que habría que cambiar algo).
Code: [Select]

template <class ESTRUCTURA>
class FDB {
public:
     // Constructor. Hay que pasarle una función que compare dos estructuras del tipo que vamos a registrar en BBDD
     // y devuelva si el índice del primero es mayor, menor o igual que el segundo.
     FDB( CompResult (*fcomparadora) (const ESTRUCTURA&, const ESTRUCTURA&) ):  _Compara(fcomparadora) { };

     // Devuelve número de registros en el índice (no borrados)
     IdReg count() {return(_head.filledRecords);};

     // Apertura de base de datos.
     Status open(char *nombreArchivo);

     // Si su index ya está en base, devuelve error; si no, lo da de alta.
     Status NuevoRegistro(const ESTRUCTURA&);

     // Lee el registro actual, y lo carga en la estructura registro espacio
     Status LeeRegistro(ESTRUCTURA &espacio);
     
     // Actualiza el registro actual con los datos dados. Si cambian datos de index, no debe permitir un índice existente.
     Status ActualizaRegistro(const ESTRUCTURA &espacio);

     // Elimina el registro actual
     Status BorraRegistro();

     // Busca el índice en una determinada posición. Si pedimos una posición fuera de rango ubica en EOF y devuelve ERR.
     Status IrRegistro(const IdReg &);
     
     // Busca el índice dado en una estructura y lo guarda en un IdReg dado. Si se localiza, la coincidencia devuelve ok.
     // Si no, guarda posición del primer registro mayor (posición de inserción) y devuelve ERR.
     Status EncuentraIndex(const ESTRUCTURA &, IdReg &);
     


Pienso que tal vez estoy abusando de parámetros por referencia. Claramente los datos de registro sí deben pasarse por referencia o puntero, pero los de índice (unsigned long) tal vez sea más práctico pasarlos por valor. No obstante, de momento me interesa saber si hace algo, aunque seguro que habrá errores. Si alguno probáis cosas (el archivo .ino es muy básico, pero si por casualidad funciona, se puede inentar probar modificaciones o borrados) me contáis.
Saludos.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 01, 2015, 12:17 am
He modificado un poco el método NuevoRegistro, para que si existe previamente un index de registro eliminado, aproveche tanto el propio index como el espacio que ocupaba el viejo registro. Básicamente

Code: [Select]
  // Si existen registros borrados, aprovecharemos la posición de datos que apuntaba el índice anterior.
  if ( _head.deletedRecords > 0 ) {
    _LeerIndex(_registroActual, posDataInsertar);
    _head.deletedRecords--;
  } else {
    // Si no aprovechamos un borrado, los datos irán al final del archivo
    posDataInsertar = _dbFile.size();
    _EscribirIndex(_registroActual, posDataInsertar);
  }


Subo las modificaciones al primer post.

Sigo dirimiendo si utilizar paso y retorno de valores por valor, en lugar de mediante referencias, para los IdReg y FilePointer (ambos son tipo unsigned long). Tal vez resulte más intuitivo y menos propenso a posibles errores (se podrían pasar valores inmediatos).
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on Feb 02, 2015, 03:24 pm
Noter: voy a hacer una simulación en Proteus 8.1 con un Arduino UNO y un Shield o una aproximación que permita leer un microSD.

Este es el mejor ejemplo que veo por ahora Esquema SparkFun microSD Shield (https://cdn.sparkfun.com/datasheets/Dev/Arduino/Shields/microSD_Shield_v14.pdf).

Quote
/** SD card datalogger
 ** SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 */
Lo hice mas simple y esta como dice la lista de arriba.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 07, 2015, 12:55 pm
Hola.
Llevo un par de días intentando hacer funcionar un programa básico de SD en mi arduino (ReadWrite, y no hay forma. No sé si las dos lectoras están mal, o puede ser problema del IDE o la librería SD (estoy con el IDE 1.5.8 y la propia librería que ya trae el IDE). El caso es que consigo detectar SD y volumen (bajando a QUARTER_SPEED el SPI), pero no me lee ni escribe ningún archivo. Tal vez tenga que modificar la librería (igual en algún punto me vuelve a establecer la velocidad a HALF_SPEED).
¿Alguien podría decirme si para un slot de estos estilos (http://miniimg4.rightinthebox.com/images/384x384/201311/fsqqxx1385538040000.jpg)

conectado al arduino por cables de unos 10cm ¿sería necesario algún condensador o similar para poder trabajar a velocidad normal (SPI_HALF_SPEED) con la SD?

Por otro lado, surbyte, ¿has conseguido simular la jodida dichosa SD en proteus? Tampoco he sido capaz de hacer funcionar ni un ejemplo. No sé si probar a retroceder de IDE, anque me da pereza.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on Feb 07, 2015, 04:51 pm
Si claro que si. Funciona perfecto.
Enviame un email y lo conversamos.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on Feb 07, 2015, 06:47 pm
Noter dame un código para probar con el simulador.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 10, 2015, 11:17 pm
Bueno. Al menos ya puedo probar sobre la placa real aunque, como dije, he tenido que modificar mi librería para que en lugar de SPI_HALF_SPEED trabaje en SPI_QUARTER_SPEED. Así que he comenzado a depurar (de momento el código no rula). A ver si estos días consigo avanzar un poco, aunque el trancazo que he pillado no permite que mi mente funcione con mucha lucidez.
Lo que no he sido capaz de hacer funcionar ha sido la SD en proteus. Mismamente el ejemplo ReadWrite del IDE, asignando un fichero de imagen a la tarjeta (un txt vacío) y las conexiones creo que bien realizadas (si modifico alguna, no hay comunicación ni errores SPI) lo único que consigo es un montón de errores "mmc command unsupported".
¿A tí te funciona correctamente, surbyte? ¿Alguien sabe a qué puede ser debido ese tipo de error?
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on Feb 11, 2015, 04:26 am
Como te dije antes, dame algo para probarlo asi te respondo seriamente.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 11, 2015, 11:48 pm
Pues me conformaría con hacer funcionar este código de ejemplo:

Code: [Select]
/*
  SD card read/write

 This example shows how to read and write data to and from an SD card file
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4

 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe

 This example code is in the public domain.

 */

#include <SPI.h>
#include <SD.h>

File myFile;

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output
  // or the SD library functions will not work.
  pinMode(10, OUTPUT);

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
  // nothing happens after setup
}



Porque de momento no he conseguido que la MMC me devuelva nada salvo errores. De momento sólo puedo probar con "fuego real" (encima a medio gas, que es otra) y los avances son un poco penosos, pues cada modificación requiere volver a compilar y subir código a Arduino, pero pasito a pasito voy avanzando.
Espero en breve actualizar el post #1 con una versión que ya se pueda probar (de momento no hace nada útil).
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on Feb 12, 2015, 03:59 am
Bien, somos dos, tampoco puedo pasar de initialization failed!

Bueno no hay caso. No funciona en el simulador.
Intentando poner en práctica sugerencias de este link (http://forum.arduino.cc/index.php?topic=28763.0)


Posible Solución1: El archivo que tiene la tarjeta sd debe tener extención .mmc
Asi que editar .txt por .mmc.

No me funcionó.

Posible 2:

Quote
Con respecto lo que dice nuestro amigo yo hace tiempo use un truco, el proteus para la mmc necesita el fichero disk.bin lo puden encontrar en
Labcenter Electronics\Proteus 7 Professional\SAMPLES\VSM for USB\PICDEM FS USB\MSD

si lo cargas en tu mmc creo que re rulara, a mi me funciono.
No me funcionó tampoco.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: Hark0 on Feb 12, 2015, 06:32 pm
Buenas!

Mi primer post en este foro... aunque lleve años visitándolo...

Estoy con la idea de hacerme una "maquinita"... tengo algunos componentes comprados, pero me interesa mucho trabajar emulando antes de coger la protoboard o el soldador.

He probado todo lo probable en Proteus y no salgo del consabido "Command unsupported".

Leo en todas partes que no hay forma.

Estoy por probar otras librerías tipo SDFat.h a ver si ésta soluciona el problema.



¿alguna idea y/o pista de como solventar el uso de SD's con Proteus?

Y si no es posible con proteus... ¿Qué otro software me recomendais para emular un ATMEGA+display Nokia+SD


Gracias anticipadas ;-)
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 12, 2015, 11:32 pm
Tambièn he probado a crear un archivo de imagen con winimage (como he visto por ahí googleando que recomendaban) y nada. No he sido capaz de encontrar demasiada información del error. De todas formas el fallo (command unsupported) no parece que tenga que ver con el archivo de imagen, sino que sencillamente la tarjeta no entiende los comandos SD.
Con lo mío voy avanzando poquito a poco compilando/grabando, prueba/error. Espero no agotar los ciclos de borrado de mi mega  ;D
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on Feb 13, 2015, 04:02 am
Lo curioso es que hay un demo con un pic en Proteus y funciona perfecto. Tomé la imagen como sugirió alguien por Internet pero tampoco funcionó, asi que ya sospecho que algo malo tiene nuestra librería.
Es así?
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: Hark0 on Feb 13, 2015, 10:07 am
Lo curioso es que hay un demo con un pic en Proteus y funciona perfecto. Tomé la imagen como sugirió alguien por Internet pero tampoco funcionó, asi que ya sospecho que algo malo tiene nuestra librería.
Es así?
Exacto!  Con un PIC18F452.... lo encontré Youtube.... viene el HEX pero no el SRC.... :(
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on Feb 13, 2015, 12:12 pm
SI. correcto. Seguimos trabajando. Mucha, mucha gente habla de problemas para hacer funcionar la SD en Proteus.
Debe tener un truco simple porque Proteus anda muy bien en todos los frentes electrónicos.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 13, 2015, 03:42 pm
¿Y no será que hay alguna diferencia entre los comandos que maneja una MMC y una SD? Porque el dispositivo en principio es MMC
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on Feb 13, 2015, 03:59 pm
jajaja tengo problemas básicos con las librerías.

Esto es corriendo el demo Datalogger que esta en la librería que esta debidamente ubicado en ...\libraries\SPI\Examples\Datalogger
Curioso que diga que SPI no esta declarado.

Code: [Select]
[Stino - Start building "Datalogger"...]
[  3%] Creating C:\Users\Ricardo\AppData\Local\Temp\Stino_build\Datalogger\Datalogger.ino.cpp.o...
[  6%] Creating C:\Users\Ricardo\AppData\Local\Temp\Stino_build\Datalogger\lib_SD\src\File.cpp.o...
[  9%] Creating C:\Users\Ricardo\AppData\Local\Temp\Stino_build\Datalogger\lib_SD\src\SD.cpp.o...
[ 12%] Creating C:\Users\Ricardo\AppData\Local\Temp\Stino_build\Datalogger\lib_SD\src\utility\Sd2Card.cpp.o...
c:/program files (x86)/arduino/libraries/SD/src/utility/Sd2Card.cpp: In function 'void spiSend(uint8_t)':

c:/program files (x86)/arduino/libraries/SD/src/utility/Sd2Card.cpp:35: error: 'SPI' was not declared in this scope

c:/program files (x86)/arduino/libraries/SD/src/utility/Sd2Card.cpp: In function 'uint8_t spiRec()':

c:/program files (x86)/arduino/libraries/SD/src/utility/Sd2Card.cpp:44: error: 'SPI' was not declared in this scope

c:/program files (x86)/arduino/libraries/SD/src/utility/Sd2Card.cpp: In member function 'uint8_t Sd2Card::init(uint8_t, uint8_t)':

c:/program files (x86)/arduino/libraries/SD/src/utility/Sd2Card.cpp:251: error: 'SPI' was not declared in this scope

c:/program files (x86)/arduino/libraries/SD/src/utility/Sd2Card.cpp: In member function 'uint8_t Sd2Card::setSckRate(uint8_t)':

c:/program files (x86)/arduino/libraries/SD/src/utility/Sd2Card.cpp:507: error: 'SPI' was not declared in this scope

Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 13, 2015, 04:03 pm
Pues ¡te lo juro por Bill Gates que a mí sí me compila"  :smiley-mr-green:  :smiley-mr-green:  :smiley-mr-green:
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on Feb 13, 2015, 04:06 pm
Claro que te creo. Pero a ver.. como si fuera un novato.
SPI y SD vienen con el IDE o yo estoy equivocado?
Si tienes librerías diferentes agrega el link please.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 13, 2015, 04:17 pm
En el 1.5.8 sí. En anteriores no estoy tan seguro respecto SPI. Yo actualicé la versión del IDE precisamente porque me daba el mismo mensaje, pero también es cierto que tenía mi librería SD bastante toqueteada.
Si corres la versión 1.5.8, prueba a sobreescribir (si tienes el zip) las dos librerías.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 16, 2015, 11:45 pm
Bueno.
La cosa requiere bastante paciencia, pero al menos ya se pueden dar de alta registros. Las bajas serán el próximo paso a depurar.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 17, 2015, 01:48 pm
¡¡¡ EUREKA !!!
Creo que tengo la primera version operativa. Necesitaría ayuda para testear.
Si alguien tiene ganas, puede testear el sketch de ejemplo, o intentar adaptarlo a otro tipo de estructura personalizada. Cualquier duda, comentario o fallo detectado será bienvenido.
De momento creo que va un poco lenta la cosa. Tendré que mirar por dónde puedo ahorrarme escrituras en SD, porque actualmente hace muchas.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on Feb 17, 2015, 05:45 pm
Estoy armando mi Mega con la placa Ethernet para probar tu código Noter. También estoy con el problema de salvawis asi que mato dos pájaros de un tiro, ya que no puedo simularlo y me cansé de perder tiempo con el Proteus.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 20, 2015, 04:29 pm
Arreglado algún pequeño error y convertido ya en librería. ;D
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on Feb 20, 2015, 06:58 pm
Bueno, yo ya resolvi el error de compilación. Era la versión IDE 1.5.4, pase a la 1.6.0
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Feb 24, 2015, 01:46 pm
donde está la llibreria para probar? quiero ayudar.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 24, 2015, 05:47 pm
Adjunta al primer post. Así tiene cualquier duda o sugerencia, o detectas cualquier problema comenta aquí.
Gracias.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Feb 26, 2015, 07:17 pm
Leí durante el post que hubo modificaciones. ¿Estas estan actualizadas?
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 26, 2015, 07:29 pm
Sí. Cada vez que modifico, actualizo en el primer post y publico en el hilo que ha habido modificación, para que se vea la fecha de última actualización.

Ya hace una semana que no la toco, pero creo que con la última actualización ya se puede instalar como librería (que trae un ejemplo sencillo incluido).
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Feb 26, 2015, 08:23 pm
Bueno, te comento que si se instala y compila correctamente con la version 1.6.

Y si se puede quiero usarla para un lector de tarjetas rfid y probar si anda con almenos 100 usuarios.

Y de paso te pregunto algunas cosas.
¿como guarda los datos, como texto o binario?
¿Se podria implementar la no indexacion para usarla como almacen logs, o en ese caso es mejor usar el modo habitual con la SD?

Gracias por tan buen aporte
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Feb 26, 2015, 10:59 pm
Hola.
Gracias por la colaboración. Respecto de tus preguntas, te respondo.
La librería guarda los datos en formato binario. Hay que definir una estructura que representará los datos de un registro, pudiendo ésta contener cualquier tipo de dato numérico o array de datos de tamaño definido. Hay que tener en cuenta que no debes incluir en tu estructura punteros, pues sólo guardará el propio puntero y no los datos a los que apunta; es decir, que para cadenas por ejemplo deberás declararlas en formato char cadena[LONGITUD_FIJA] (guardará LONGITUD_FIJA caracteres) y no en formato char *cadena (sólo guardaría los dos bytes que apuntan a la cadena). Respetando esto, creo que tiene capacidad para guardar estructuras de datos complejas (subestructuras, arrays, etc...).
Está pensada (otra cosa es que cumpla lo esperado  :P ) para gran cantidad de registros y/o tamaño grande de registro; por lo que para cien usuarios (salvo que se guarden muchos datos por usuario) tal vez no notes beneficio con respecto al acceso secuencial, y sí notes retraso en la escritura de un nuevo registro (no es lo mismo escribir directamente al final del archivo que andar buscando, recolocando y escribiendo datos de un lugar a otro para mantener el orden. Todo es cuestión de probar en cada caso y usar lo que mejor convenga.
Respecto a lo de quitar la indexación, es precisamente la parte que me ha dado casi todo el trabajo. Para guardar estructuras sin indexar, te puede valer la Extended Database Library (http://playground.arduino.cc/Code/ExtendedDatabaseLibrary), aunque requiere una pequeña adaptación para utilizarla con SD (inicialmente estaba pensada para EEPROMs y demás). No obstante miraré si puedo sacar una versión "downgraded" (sin índices).
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Feb 27, 2015, 04:04 am
Entiendo lo que dices, en mi caso particular me interesa que sea rapido asi sean 3 registros.
Quiero guardar los codigos Alfanumericos de llaveros RFID y el nombre del usuario y eventualmente algun dato mas, pero como son 10 caracteres para hacerlo en una eeprom tardaria bastante entre cada registro.
La demora de escritura no importa porque se hace una sola vez salvo pierda o agregue un usuario nuevo, y despues seria replicar ese archivo en los demas equipos.

Y lo de hacer un log sin indexar se puede imprementar como parametro opcional, que solo escriba al final.
Y al ser binario es mas seguro, que plano muy facil de modificar.

Lo que preguntaste en un momento sobre la velocidad, cuando son divisores resistivos para adaptar la señal no andan a maxima velocidad, si si usas un CD4050 o 74hc4050


Tengo una semana para tener un modelo de prototipo, sigo probando y comento.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on May 27, 2015, 10:48 pm
anda muy bien incluso con divisor resistivo en vez de level converter.
Mi pregunta es si la busqueda siempre es por el int DNI o puede ser otro campo?
Quisiera poder buscar un array de 10 caracteres como clave.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on May 27, 2015, 11:41 pm
Pues me has impresionado, maxid; porque debo decir que prácticamente dejé olvidado el proyecto, dada la poca utilidad que parecía tener para otros usuarios. Por supuesto que para mí quedó almacenado en mi biblioteca de librerías, pues creo que me puede servir a más o menos corto plazo; pero sinceramente creía este hilo en el olvido.
Ahora paso a responderte. La búsqueda y comparación de registros se realiza sólo por el campo clave (más bien por el criterio clave, que podría abarcar varios campos incluso) que definas, así que si quieres utilizar un array alfanumérico de 10 caracteres como tal no hay problema. Lo único, que debes facilitar a la librería una función (como la ComparaRegistro del ejemplo) que tome dos registros como parámetros, y devuelva el resultado de la comparación según tu criterio clave(FDB_MAJOR, FDB_MINOR O FDB_EQUAL). Si no tienes cuidado en el diseño de esa función vas a tener problemas.
Si tienes definido tu modelo de registro y necesitas ayuda, ponlo por aquí y te ayudo a implementarlo en la librería.

PD. He actualizado el post #1 con la versión que tenía en mi ordenador de la librería, que creo que es básicamente la misma, sin los Serial.print de depuración.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on May 28, 2015, 04:33 am
Para nada Serafín. También forma parte de MI LIBRERIA. Esperando el momento de tener que usarlo y consultarte si surge la duda.
En su momento lo hiciste pensando en aquel forero que tenia un mes para un sistema biometrico (te acuerdas) y que pasó... que asi como vino y como no aportaba mas a su propio trabajo tampoco los demás lo hicimos pero tu proyecto fue un verdadero logro.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on May 28, 2015, 03:54 pm
Gracias Noter, realmente funciona de maravillas y ahora la entiendo mas a la libreria.
Voy a seguir probando y comento. Incluso el ejemplo de carga de datos es genial lograrlo en tan pocas lineas, jajaja.
Surbyte, estoy en el mismo baile que ese forero pero con varias cosas a la vez por eso hace meses que ni entro por aquí. Hice mi aporte poniendo en los proyectos un lector tagRFID completo que lleva 3 meses sin apagarse ni colgarse. Realmente como siempre decimos Filtros y mas filtros hacen que un prototipo funcione siempre.

Con respecto a la libreria, puedo cominar el uso con la libreria estandar sd para guardar un log en txt?
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on May 30, 2015, 12:45 am
Por supuesto que puedes declarar y utilizar normalmente un objeto File. De hecho en el ejemplo ha quedado un objeto dbFile, que no se usa en el programa, de pruebas anteriores que hice. No lo he probado en profundidad, pero no creo que interfiera en el funcionamiento normal de la librería, salvo que se te ocurra abrir el mismo archivo que el que vas a trabajar con FDB, claro  :). De todas formas, si necesitas trabajar con archivos a la vez que con FDB, comenta los resultados por aquí.
También podrías declarar más de un objeto FDB, pero no es cuestión de matar moscas a cañonazos. Para un log es más efectivo y sencillo un simple archivo de texto.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Jun 01, 2015, 05:45 am
Noter. Le estoy dando caña a la libreria y me pregunto que performance tiene en la busqueda.
Bueno hice una prueba en una base con 4 registros

buscar el registro numero:

3: 152 microsegundos
1: 440 microsegundos
4: 300 microsegundos
2: 296 microsegundos

nuevamente el 3: 152 microsegundos

Registros no encontrados: 440,296,210 depende de que numero intenta comparar

Lo mas importante estos valores se mantienen entre reseteos y reprogramaciones

Espero ayudar con esto

coloco la porcion para calcular el tiempo


Code: [Select]

    unsigned long t0;
    unsigned long t1;
.
.
.
.
.
   t0= micros();
    if (bbdd.EncuentraIndex(nuevo, numRegistro) == FDB_OK)
    {
      t1= micros();   
      Serial.print(F("Encontrado en pos "));
      Serial.println(numRegistro);
      }
      else
      {
        t1= micros();   
        Serial.print(F("No hay coincidencia. Posición registro actual: "));
        Serial.println(numRegistro);
      }
      Serial.print("Tiempo de busqueda: ");
      Serial.println(t1-t0); //imprimo cuanto tarda en encontrar

Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jun 01, 2015, 11:59 pm
Gracias, maxid; aunque con pocos registros no creo que el rendimiento sea superior a una lectura secuencial. Aún no la he puesto a prueba en serio, pero donde debería ser "rentable" es con gran número de registros, ya que con n comparaciones debería poder encontrar un registro indexado entre 2n registros, es decir, que con 16 comparaciones debería poder encontrar un registro entre más de 60000 registros. Ahí sí que debería ser más eficiente que ir leyendo todo.
Aún no he necesitado algo así, pero como dije, creo que puede ser una buena opción para tratar un volumen de datos importante sin necesidad de recurrir a conexión con una bbdd externa.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Jun 02, 2015, 06:35 pm
Si entiendo Noter, pasa que no me puse a cargar tantos datos.
Y me picaba la curiosidad de cuanto tarda en encontrarlo, mas que todo por la eficiencia de la memoria en modo spi.
En breve si funciona todo tendre funcionando una con cerca de 100 usuarios.

Lo que me interesa si me podes ayudar es a hacer el archivo desde una pc basado en la estructura, facilitaria las pruebas y carga de datos, redueciendo codigo, que ya voy medio ajustado.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: Marcial on Jun 02, 2015, 10:22 pm
En una SD es posible leer una dirección determinada, como si fuera una eeprom?
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jun 02, 2015, 11:49 pm
Efectivamente, Marcial, sí se puede leer una dirección determinada. En eso baso la indexación. El índice es una serie de datos unsigned long (4 bytes) ordenados según nuestro criterio. Cada uno de esos unsigned long apunta a la dirección donde está realmente el registro. De esta forma evito en lo posible mover los registros completos. Si, por ejemplo, quiero insertar un registro, el registro lo coloco directamente al final, en lugar de tener que insertar y mover todos los datos que hay por detrás. En su lugar sólo muevo los índices.
En cuanto a lo que dices tú, maxid, claro que te puedo ayudar, si me explicas qué quieres concretamente; pero en principio no debería ser complicado hacer una rutina que lea datos por serie y te los inserte en la tabla, o un archivo csv o similar y que inserte los registros; y viceversa.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: Marcial on Jun 03, 2015, 01:46 pm
Si el fichero no es muy grande, puedes hacer un fichero de acceso random, ocupara muco mas, pero no necesitaras mantener indices
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Jun 03, 2015, 05:16 pm
En cuanto a lo que dices tú, maxid, claro que te puedo ayudar, si me explicas qué quieres concretamente; pero en principio no debería ser complicado hacer una rutina que lea datos por serie y te los inserte en la tabla, o un archivo csv o similar y que inserte los registros; y viceversa.
Lo que decia es un lector de este archivo en pc. No lei el fuente completo para entender la estructura del fichero. Para leerlo o crearlo externamente al equipo arduino.
Pero voy a armar un pequeno programa que por serial le envie comandos de alta y baja.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jun 04, 2015, 12:18 am
Tal y como está ahora la librería, no es posible hacer un "lector de datos FDB" (habría que hacer uno específico para cada archivo), ya que no he incluido (sería posible, pero no sé si merecerá la pena embarcarse) en la cabecera datos que indiquen el nombre y tipo de campo. Ya puestos, lo lógico sería entonces estudiar y tratar de implementar algún tipo de archivo de datos estándar.
Marcial; no entiendo qué quieres decir exactamente con acceso random. Si te refieres simplemente a fichero sin índices, lo lógico es que ocupe menos y en la mayoría de los casos quizás sea lo más adecuado. Con sólo saber el tamaño de registro puedes desplazarte directamente a uno en una posición cualquiera. De hecho la floritura esta que me ha salido, aún no he necesitado utilizarla con fuego real.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Jun 04, 2015, 04:43 am
Si no tienen cabecera no hay problemas, en pascal puedo crear una estructura que coincida con la de los datos y asi leerla, por bloques. Solo queria saber hasta donde llega el indice y donde comienza los datos.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Jun 04, 2015, 04:50 am
Tal y como está ahora la librería, no es posible hacer un "lector de datos FDB" (habría que hacer uno específico para cada archivo), ya que no he incluido (sería posible, pero no sé si merecerá la pena embarcarse) en la cabecera datos que indiquen el nombre y tipo de campo. Ya puestos, lo lógico sería entonces estudiar y tratar de implementar algún tipo de archivo de datos estándar.
Marcial; no entiendo qué quieres decir exactamente con acceso random. Si te refieres simplemente a fichero sin índices, lo lógico es que ocupe menos y en la mayoría de los casos quizás sea lo más adecuado. Con sólo saber el tamaño de registro puedes desplazarte directamente a uno en una posición cualquiera. De hecho la floritura esta que me ha salido, aún no he necesitado utilizarla con fuego real.
eso que mencionas es un formato .dbf solo que en dbase se almacena como texto y la cabecera servia para saber como manejarlos, su sucesor fue paradox que manipulaba cada campo como su tipo nativo, haciendo mas eficiente el manejo y podian llegar hasta los 128mb el tamaño del archivo.

Tambien es posible hacrlo de esa manera con un indice externo, y un almacen secuencial. El indice se recrea en cualquier momento releyendo el almacen como hacian en dbf
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: Marcial on Jun 04, 2015, 09:37 am
Noter, long time ago, cuando yo estudie informática y franco era cabo, se llamaban ficheros de acceso random a un tipo de ficheros a los que se podía acceder directamente a cada registro, pero no eran indexados.

El fichero, en función del tamaño del registro y de la clave, reserva espacio suficiente para todos los registros posibles, y la clave servia para calcular la dirección del registro, pero ahora que ni Juan Carlos es rey, a saber como se llaman esos ficheros  :)
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jun 04, 2015, 11:09 pm
Jeje, Marcial. Cuando yo estudié informática franco aún era corneta. Efectivamente, entendí perfectamente a qué te referías. Aunque siendo tiquismiquis, el acceso aleatorio/secuencial no se refiere a cómo se trabaja con una base de datos, sino cómo se puede leer o escribir en un archivo; si puedes acceder a leer o escribir cualquier parte directamente o tienes que comerte la vaca entera... ¿te acuerdas de las cintas del zx81 o spectrum?. Por supuesto que sin acceso aleatorio una base de datos sería una pesadilla, pero con índices, sin índices, archivos de imagen o de cualquier tipo, todos los archivos en disco o SD se pueden acceder aleatoriamente.
Mañana te envío un esquema de cómo va organizado el archivo, aunque si miras la cabecera de la librería verás la estructura header que te puede dar alguna pista (agrego comentarios):

Code: [Select]
struct FDB_Header
{
     unsigned int rec_size; // Posición 0-1, indica qué tamaño va a tener nuestro registro.
     IdReg filledRecords;  // Posición 2-5, número de índices a registros no borrados (a continuación del header)
     IdReg deletedRecords; // Posición 6-9, número de índices a registros borrados (tras los índices no borrados)
     FilePointer dataStart; // Posición 10-13, dirección a partir de donde se encuentran los datos
};


Continuando con el archivo:
- Pos 14 hasta 14+4*filledRecords Índices ordenados de dirección(unsigned long). Cada index apunta a la posición en la que está el dato que indexa.
- Pos 14+4*filledRecords hasta 14+4*(filledRecords+deletedRecords), Índices borrados. El dato sigue en su posición, pero los índices "saltan" a esta zona. Un nuevo registro reutilizará en primer lugar estos índices y su espacio de datos si existen, en lugar de ampliar tamaño de archivo. También cabría la posibilidad de devolver el index a su sitio y deshacer borrados.
- Pos dataStart hasta final de archivo: bloques de datos. Aquí están los registros propiamente dichos. No están ordenados (los índices dicen qué registro va en qué posición). También encontraremos los datos de los registros eliminados, salvo que la escritura de otros los hayan machacado.

El proceso para obtener un registro en posición ordenada n, sería mover la "cabeza lectora" primero a la dirección 14+4*n, leer dirección (unsigned long), mover a la dirección leída, y cargar la estructura.

No sé si te he aclarado algo o te he liado más, pero cualquier cosa que te pueda aclarar, no dudes en consultar.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Jun 08, 2015, 07:34 pm
Ok, me pongo a ver de a poco como lo hago. Estoy medio apurado con hacer andar esto.
Por ahora lo voy a enviar por serial y depues veo como lo resuelvo.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jun 08, 2015, 10:30 pm
Lo dicho. Cualquier ayuda que necesites sólo tienes que pedirla.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Jun 12, 2015, 07:17 pm
Noter, la libreria viene andando de maravillas por ahora.
Le hice un cambio usando la libreria SdFat (https://github.com/greiman/SdFat) que es mejorada y tiene manejo de memorias mas grandes.
Y lo curioso que en el ejemplo de basededatos me bajo -2224 bytes de programa, pero si consume  +12 byte mas de ram.
Y es totalmente compatible, para tenerlo en cuenta.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jun 13, 2015, 11:36 am
Está interesante la librería. También permite el uso de nombres largos. Muy importante tener en cuenta los defines de SdFatConfig.h para optimizar recursos/desempeño.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Jun 13, 2015, 04:10 pm
de momento no escribe bien FDB. tengo que revisarla mejor
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Jun 18, 2015, 12:25 am
Avances del proyecto
viedo1 (https://youtu.be/YG3E094dF8U)
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Jul 29, 2015, 08:59 pm
Lo dicho. Cualquier ayuda que necesites sólo tienes que pedirla.
Sigo usando tu libreria y ahora viene lo bueno, porque le voy a dar caña.
Pero necesito poder buscar para eliminar por otro dato y en el constructor se le pasa la funcion de comparacion.
Puedo modificarla para que reciba otra funcion momentaneamente?
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jul 29, 2015, 11:33 pm
No puedes cambiar de función de comparación, porque esa función establece el indexado y las búsquedas se apoyan en el indexado (de forma similar a como nosotros buscamos algo en el diccionario). Si cambias la función de comparación, dado que los registros no están ordenados según ese nuevo criterio, no vas a encontrar los registros deseados (imagina si quieres buscar algo en un diccionario desordenado). La única opción que te quedaría sería de nuevo hacer una búsqueda secuencial, osea repasar todos los registros, con lo que se pierde la utilidad de la librería.
No sé si en tu caso se podría conseguir algo replanteando el indexado inicial o habría que intentar modificar la librería para que maneje más de un índice, lo que complicaría bastante la cosa; ya que opté por poner el índice en el mismo archivo que los datos, aunque sea un poco más lioso que usar un archivo índice externo, porque creo haber leído (aunque no estoy seguro) que la librería SD sólo puede mantener abierto un archivo al mismo tiempo. Necesitaría que me des más detalles de qué datos implican ambos indexados.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Jul 30, 2015, 07:31 pm
es cierto lo que dices, crei que cambiando la comparacion podias y viendo. Pero como está planteada no se puede.
Yo tengo la el archivo FDB abierto desde el principio y no lo cierro, y ante un evento abro/creo un nuevo archivo con otro objeto SD para el diario ddmmyyy.log.
Esto está bien?
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jul 31, 2015, 12:47 am
Pues precisamente ayer estuve mirando por ahí, pues pensaba que la librería SD sólo permitía un archivo abierto, y aunque no lo tengo seguro creo que la librería actual permite múltiples archivos, siempre que haya memoria para los objetos FILE, por lo que no debería haber problema en abrir o crear otros archivos mientras tienes abierto el FDB (aunque no es necesario crear otro SD ni otro volumen, sino otro objeto FILE). De todas formas, el movimiento se demuestra andando, así que si te está funcionando llevar ambas cosas será porque se puede ;)
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Jul 31, 2015, 08:12 pm


andar anda por ahora, hay que saber que debemos tener 512byte libres que usa para el buffer de la FAT, cuando estas justo empiezan los problemas, porque es dinamico, pide la memoria cuando se abre el archivo.

aunque no es necesario crear otro SD ni otro volumen, sino otro objeto FILE).


por lo que no debería haber problema en abrir o crear otros archivos mientras tienes abierto el FDB (aunque no es necesario crear otro SD ni otro volumen, sino otro objeto FILE)
No entendí de no crear otro volumen.
La rutina que uso es esta.
Code: [Select]

void LogThis(char logmessage[])
{
  char fechahora[18];
  char filename[13];


  //armo el archivo desde la fecha yyyymmdd.log
  dateTimeToString(fechahora,true,false);
  strcpy(filename,fechahora);
  strcat(filename,ext_log);


File LogsFile = SD.open(filename, FILE_WRITE);
if (LogsFile)
{
            digitalWriteFast(LEDBUSY, HIGH); //informar comienzo de escritura
            //formateo de hora 00:00:00
            dateTimeToString(fechahora,true,true);
      LogsFile.print(logmessage);
      LogsFile.print(F(" "));
      LogsFile.println(fechahora);
            LogsFile.flush();
            LogsFile.close();
    digitalWriteFast(LEDBUSY, LOW); //informar fin escritura
  }
  else
  {
    Error(ERR_NOSD);
  }
 
}
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Jul 31, 2015, 11:14 pm
Quote
Yo tengo la el archivo FDB abierto desde el principio y no lo cierro, y ante un evento abro/creo un nuevo archivo con otro objeto SD para el diario ddmmyyy.log
No te preocupes. Tu código está bien, lo que pasa es que a veces soy un poco tiquismiquis con los términos. Lo que creas es otro objeto de clase FILE "colgando", eso sí, del mismo objeto SD (que es un objeto de clase SDClass).
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: maxid on Oct 19, 2015, 08:56 pm
No te preocupes. Tu código está bien, lo que pasa es que a veces soy un poco tiquismiquis con los términos. Lo que creas es otro objeto de clase FILE "colgando", eso sí, del mismo objeto SD (que es un objeto de clase SDClass).
Actualizo.
Te comento Noter y grupo que la libreria es un exito.
Tengo funcionando desde Agosto el dispositivo sin fallas, con 100 usuarios cargados y con excelentes resultados.

Lo malo es que la libreria SD agota la ram de arduino y deja poco espacio para las rutinas de comunicaciones.
Pero para algo autonomo si es muy util.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on Oct 19, 2015, 11:25 pm
Muchas gracias por compartir tu experiencia, Maxid. Efectivamente, el escenario en el que podría ser muy útil es para algo autónomo, y supongo que igual que trabaja correctamente con 100 usuarios debería hacerlo con muchos más (si alguien lo prueba con alguna tabla de miles de registros, que comente por aquí), y es cuando realmente valdría mucho la pena. En cuanto a la RAM, efectivamente la librería SD ocupa bastante, y la librería mía supongo que también, dependiendo del tamaño de estructura que define el registro, aunque precisamente hago uso intensivo de referencias para evitar que se anden clonando estructuras en la pila.
Gracias de nuevo.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: gepd on Jan 26, 2016, 08:10 pm
Estaba revisando esta librería para usarla con un lector RFID y me pareció que el ejemplo que tiene, además que a mi no me funcionó al 100%, como primera impresión me parece poco explicativo, así es que decidí separar cada una de las funciones que se proponen, en un archivo diferente y agregarle un par de comentarios para entenderlo.

He tenido que agregar el código como archivos adjunto debido al límite de caracteres que hay por post.

Esto es solo un pequeño aporte, cualquier error en el código me avisan para corregirlo. Sería buena idea crear un repositorio en github y colocar esta librería allí
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: julio625 on May 13, 2016, 03:21 am
tengo una tabla de 13250 registro de una base de datos de un control de acceso que estoy realizando , me gustaría probar la librería y mirar en que puedo colaborar
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: noter on May 13, 2016, 10:56 am
Hola, julio 625.
Precisamente pensando en ese tipo de aplicaciones me embarqué en hacer la librería. La pensé para situaciones en las que no es posible o no queremos comunicar con una base de datos alojada en un servidor, y necesitamos sencillamente poder mantener una tabla con un número elevado de registros ordenados por un determinado criterio.
Si tienes alguna duda o necesitas alguna explicación, exponla por aquí a ver qué se puede hacer. De momento, sería interesante saber qué campos y ordenación va a tener tu base de datos. Basado en eso debes decidir la estructura que va a contener un registro, y la función de ordenación de ese tipo de registro.
Title: Re: Gestión e indexación de registros de una tabla en SD.
Post by: surbyte on May 13, 2016, 04:53 pm
Recuerda que el trabajo de noter funciona con la EEPROM (limitado a su tamaño), con EEPROMs externas que albergarán tu base de datos o SDs.
Usa EDB Extended Data Base que alcanza estos 3 grupos de sistemas de almacenamiento.
Usa el más cómodo para tu aplicación.

Nunca quedo satisfecho con una respuesta.
Amplío:
http://playground.arduino.cc/Code/ExtendedDatabaseLibrary (http://playground.arduino.cc/Code/ExtendedDatabaseLibrary)
Quote
Arduino Extended Database Library

   This Arduino Extended Database Library increases the maximum number of records allowed in a database from 256 records (byte) to a theoretical maximum of 4,294,967,295 records (unsigned long). The maximum record size was also increased from 256 bytes (byte) to 65,534 bytes (unsigned int).
You may use this library in conjunction with the standard Arduino EEPROM library, an external EEPROM such as the AT24C1024 EEPROM, or any other platform that supports byte level reading and writing such as an SD card.