10# include "hardware/outputs/Serial.h"
12# include "common/specializations.h"
13# include "common/crc32.h"
19 constexpr uint8_t
const kDefaultDatabasePathLength = 32;
20 extern uint32_t
const PROGMEM kDatabaseFileHeader;
21 extern uint16_t
const PROGMEM kVersion;
22 extern uint32_t
const PROGMEM kDatestampMinimum;
23 extern char const PROGMEM PATH_TEMPLATE[];
24 extern char const PROGMEM PATH_TEMPLATE_FS[];
26 enum class CRDBType : uint8_t
33 using OSCR::Storage::sd;
34 using OSCR::Storage::Shared::sharedFile;
35 using OSCR::Storage::Shared::sharedFileName;
47 extern void dbName(
char const * databaseName,
char databasePath[], uint8_t maxLength = kDefaultDatabasePathLength);
48 extern void dbName_P(__FlashStringHelper
const * databaseName,
char databasePath[], uint8_t maxLength = kDefaultDatabasePathLength);
61 template<
typename RecordType>
65 uint32_t getCRC32()
const
76 RecordType _data = RecordType();
79 template<
typename RecordType>
89 RecordType _data = RecordType();
95 CRDBBase(
char const * crdb_filename, uint_fast32_t crdb_recordsize);
96 CRDBBase(__FlashStringHelper
const * crdb_filename, uint_fast32_t crdb_recordsize);
99 virtual void nextRecord() = 0;
101 void error(ERRORS code);
102 ERRORS getError()
const;
103 bool hasError()
const;
106 void databaseError();
108 int16_t readBytes(
void * dest, uint8_t bytes);
109 uint8_t readNum8(uint8_t * dest);
110 uint8_t readNum16(uint16_t * dest);
111 uint8_t readNum32(uint32_t * dest);
112 uint8_t readNum32(
crc32_t & dest);
114 uint32_t numRecords()
const;
116 bool loadRecordIndex(uint16_t index);
117 bool gotoRecordIndex(uint16_t index);
119#if defined(NEEDS_CRDB_ISQUIET)
121 void quiet(
bool shouldBeQuiet =
true);
126 uint_fast16_t
const recordSize;
127 uint_fast16_t recordCount;
128 uint_fast16_t recordNum = 0;
129#if defined(NEEDS_CRDB_ISQUIET)
130 bool beQuiet =
false;
132 ERRORS errorCode = E_NONE;
134 void openDatabase(
char const * crdb_filename);
137 class CRDBByIDBase :
public CRDBBase
140 CRDBByIDBase(
char const * crdb_filename, uint_fast32_t crdb_recordsize)
141 : CRDBBase(crdb_filename, crdb_recordsize)
146 CRDBByIDBase(__FlashStringHelper
const * crdb_filename, uint_fast32_t crdb_recordsize)
147 : CRDBBase(crdb_filename, crdb_recordsize)
152 bool findRecord(uint16_t
const idSearch, uint16_t
const offset = 0);
155 template <
typename RecordType>
156 class CRDBByID :
public CRDBByIDBase
159 CRDBByID(
char const * crdb_filename, uint_fast32_t crdb_recordsize)
160 : CRDBByIDBase(crdb_filename, crdb_recordsize)
165 CRDBByID(__FlashStringHelper
const * crdb_filename, uint_fast32_t crdb_recordsize)
166 : CRDBByIDBase(crdb_filename, crdb_recordsize)
172 RecordType * record()
174 return currentRecord;
178 RecordType * currentRecord =
new RecordType();
181 template <
typename RecordType>
182 class CRDBNamedByID :
public CRDBByIDBase
185 CRDBNamedByID(
char const * crdb_filename, uint_fast32_t crdb_recordsize)
186 : CRDBByIDBase(crdb_filename, crdb_recordsize)
191 CRDBNamedByID(__FlashStringHelper
const * crdb_filename, uint_fast32_t crdb_recordsize)
192 : CRDBByIDBase(crdb_filename, crdb_recordsize)
198 RecordType * record()
200 return currentRecord;
204 char * getRecordName()
const
206 return currentRecord->data()->name;
210 RecordType * currentRecord =
new RecordType();
213 class CRDBNamedByCRC32Base :
public CRDBBase
216 CRDBNamedByCRC32Base(
char const * crdb_filename, uint_fast32_t crdb_recordsize)
217 : CRDBBase(crdb_filename, crdb_recordsize)
222 CRDBNamedByCRC32Base(__FlashStringHelper
const * crdb_filename, uint_fast32_t crdb_recordsize)
223 : CRDBBase(crdb_filename, crdb_recordsize)
228 bool findRecord(uint32_t
const crc32, uint16_t
const offset = 0);
229 bool findRecord(
crc32_t const & crc32search, uint16_t
const offset = 0);
230 bool findEitherRecord(
crc32_t crc32search1,
crc32_t crc32search2, uint16_t offset = 0);
232 bool matchCRC(uint32_t crc32,
int dbOffset = 0);
233 bool matchCRC(
crc32_t & crc32,
int dbOffset = 0);
234 bool matchCRC(
crc32_t * crc32ptr =
nullptr,
int dbOffset = 0);
237#if defined(NEEDS_CRDB_EVENTS) || defined(NEEDS_CRDB_EVENT_POSTMATCHCRC)
238 virtual bool postMatchCRC() = 0;
240#if defined(NEEDS_CRDB_EVENTS) || defined(NEEDS_CRDB_EVENT_CRCMATCHFAIL)
241 virtual bool crcMatchFail() = 0;
243#if defined(NEEDS_CRDB_EVENTS) || defined(NEEDS_CRDB_EVENT_CRCMATCHSUCCESS)
244 virtual bool crcMatchSuccess() = 0;
247 virtual char * getRecordName()
const = 0;
250 virtual bool cmprCRC32(
crc32_t * crc32ptr =
nullptr)
const = 0;
254 template <
typename RecordType>
255 class CRDBNamedByCRC32 :
public CRDBNamedByCRC32Base
258 CRDBNamedByCRC32(
char const * crdb_filename, uint_fast32_t crdb_recordsize)
259 : CRDBNamedByCRC32Base(crdb_filename, crdb_recordsize)
264 CRDBNamedByCRC32(__FlashStringHelper
const * crdb_filename, uint_fast32_t crdb_recordsize)
265 : CRDBNamedByCRC32Base(crdb_filename, crdb_recordsize)
271 RecordType * record()
273 return currentRecord;
277 char * getRecordName()
const override
279 return currentRecord->data()->name;
283 RecordType * currentRecord =
new RecordType();
286 bool cmprCRC32(
crc32_t * crc32ptr =
nullptr)
const override
288 return (*crc32ptr == currentRecord->getCRC32());
292 template <
typename RecordType, CRDBType crdbType>
struct get_crdb_class {
typedef void type; };
308 template <
typename RecordType,
309 uint_fast32_t dbRecordSize,
310 CRDBType crdbType = CRDBType::NamedByCRC32,
311 typename CRDBParent =
typename get_crdb_class<RecordType, crdbType>::type>
312 class CRDB :
public CRDBParent
315 CRDB(
char const * crdb_filename)
316 : CRDBParent(crdb_filename, dbRecordSize)
321 CRDB(__FlashStringHelper
const * crdb_filename)
322 : CRDBParent(crdb_filename, dbRecordSize)
Main program.
Definition Storage.h:13
Interface for handling CRC32 values.
Definition crc32_t.h:14