// https://github.com/siara-cc/sqlite_micro_logger_arduino/issues/7
// ver o negocio do a+
#include "ulog_sqlite.h"
#include <SPI.h>
#include "SD.h"
#include "SdFat.h"
#include <stdio.h>
//SdFat SD;
// Set the CS Pin connected to the MicroSD
// 8 on most shields such as Sparkfun Micro SD Shield
// 4 on WeMos D1 Mini
#define SD_CS_PIN 10
#define DB_FILENAME "/sd/data/database.db"
//rewind DB_FILENAME "/sd/data/database.db"
//INÍCIO Sckech Debug
#define pinBotaoDebug 13
#define habilitaDebugSerial true //define se envia informações do funcionamento para o monitor serial. "true" envia e "false" não envia. Utilizado apenas para identificar problemas de funcionamento atraves do monitor serial do IDE Arduino. Em situações normais, definir este parametro como "false". Quando usar o monitor, ele deve ser configurado para a velocidade de 115200.
#if habilitaDebugSerial == true
void debug(int pontoParada, String nomeVariavel, String valorVariavel, int tempoParada = -1) { //TempoParada faz delay. Com -1, para até porta 13 mudar de nível
Serial.print("(");
Serial.print(pontoParada);
Serial.print(") ");
Serial.print(nomeVariavel);
Serial.print(":");
Serial.print(valorVariavel);
Serial.println();
if (tempoParada == -1) {
static bool estadoBotaoAnt = digitalRead(pinBotaoDebug);
static unsigned long delayDebounce;
bool estadoBotao;
bool aguarda = true;
while (aguarda) {
estadoBotao = digitalRead(pinBotaoDebug);
if ( (estadoBotao != estadoBotaoAnt) && !estadoBotao ) {
if ((millis() - delayDebounce) > 100) {
aguarda = false;
delayDebounce = millis();
}
} else if (estadoBotao != estadoBotaoAnt) {
delayDebounce = millis();
}
estadoBotaoAnt = estadoBotao;
}
} else if (tempoParada > 0) {
delay(tempoParada);
}
}
#endif
//FIM Sckech Debug
FILE *fp;
int32_t read_fn(struct dblog_write_context *ctx, void *buf, uint32_t pos, size_t len) {
if (fseek(fp, pos, SEEK_SET)) {
ctx->err_no = ferror(fp);
return DBLOG_RES_SEEK_ERR;
}
size_t ret = fread(buf, 1, len, fp);
if (ret != len) {
ctx->err_no = ferror(fp);
return DBLOG_RES_READ_ERR;
}
return ret;
}
int32_t read_fn_rctx(struct dblog_read_context *ctx, void *buf, uint32_t pos, size_t len) {
if (fseek(fp, pos, SEEK_SET))
return DBLOG_RES_SEEK_ERR;
size_t ret = fread(buf, 1, len, fp);
if (ret != len)
return DBLOG_RES_READ_ERR;
return ret;
}
int32_t write_fn(struct dblog_write_context *ctx, void *buf, uint32_t pos, size_t len) {
if (fseek(fp, pos, SEEK_SET)) {
ctx->err_no = ferror(fp);
return DBLOG_RES_SEEK_ERR;
}
size_t ret = fwrite(buf, 1, len, fp);
if (ret != len) {
ctx->err_no = ferror(fp);
return DBLOG_RES_WRITE_ERR;
}
return ret;
}
int flush_fn(struct dblog_write_context *ctx) {
int ret = fflush(fp);
if (ret) {
ctx->err_no = ferror(fp);
return DBLOG_RES_FLUSH_ERR;
}
return DBLOG_RES_OK;
}
void setup() {
// INÍCIO Sckech Debug
#if habilitaDebugSerial == true
Serial.begin(115200);
pinMode(pinBotaoDebug, INPUT_PULLUP);
#endif
// FIM Sckech Debug
SD.begin();
byte buf[4096];
struct dblog_write_context databaseContext;
int res;
bool append = false;
//fp = fopen(DB_FILENAME, "r");
fp = SD.open(DB_FILENAME, FILE_WRITE);
if SD.exists(DB_FILENAME); {
//file exists
//fclose(fp);
//open for appending
//fp = fopen(DB_FILENAME, "a+"); // no chat do endereço no começo Siara-CC disse para mudar a+ para r+b, e o autor disse que funcionou
//fp = fopen(DB_FILENAME, "r+b");
append = true;
}
else {
//file doesn't exist
//fp = fopen(DB_FILENAME, "w+b");
}
if (fp) {
Serial.print("database OPENED\n");
databaseContext.buf = buf;
databaseContext.col_count = 3;
databaseContext.page_resv_bytes = 0;
databaseContext.page_size_exp = 12;
databaseContext.max_pages_exp = 0;
databaseContext.read_fn = read_fn;
databaseContext.flush_fn = flush_fn;
databaseContext.write_fn = write_fn;
if(!append) res = dblog_write_init(&databaseContext);
else res = dblog_init_for_append(&databaseContext);
if (res == DBLOG_RES_OK) {
res = dblog_append_empty_row(&databaseContext);
for (int i = 0; i < 3; i++) {
res = dblog_set_col_val(&databaseContext, i, DBLOG_TYPE_INT, &i, sizeof(int));
}
res = dblog_finalize(&databaseContext);
}
else Serial.print("init failed\n");
int prev=ftell(fp);
fseek(fp, 0L, SEEK_END);
int sz=ftell(fp);
fseek(fp,prev,SEEK_SET);
Serial.print("file size: %i\n", sz);
fclose(fp);
}
else Serial.print("database NOT OPENED\n");
}
void loop() {
}