響ちゃんスイッチのメニューデータの管理について
先日投稿した、響ちゃんスイッチですが、今日はそのメニューデータの管理方法について、自分のメモとして記事にしておきます。
わかりやすいようにとか、機能説明とか特にしないので、見る意味は皆無です。
また、後でメモリ管理に関しては仕様を変更する予定で、その前に旧仕様を忘れかけなので思い出すついでに書きます。
まず、メニューファイルのデータ構造に関して
データ名 | データ型 | データ長(byte長) | 値 | 備考 |
---|---|---|---|---|
FileType | char[4] | 4 | "men2" | Ver2なので末尾が2 |
Offset | uint16_t | 2 | 6 | 有効データまでのオフセット |
MenuNum | uint16_t | 2 | n | メニューの数 |
DataPtrs | uint32_t | 4*n | 50 | Pathの長さ |
個別データ | 後述 | n * x | 個別のメニュー情報 | |
また、個別データは以下の形式
データ名 | データ型 | データ長(byte長) | 値 | 備考 |
---|---|---|---|---|
DataLength | uint32_t | 4 | 自身を含まない個別データの長さ | |
PathLength | uint16_t | 2 | 現在は50固定 | メニュー先のファイルパスの長さ |
Path | char[PathLength] | PathLength | メニュー先のファイルパス | |
FontBitHeight | uint8_t | 1 | ビット単位でのフォントの高さ | |
FontByteHeight | uint8_t | 1 | バイト単位でのフォントの高さ | |
FontWidth | uint16_t | 2 | フォント情報の幅 | |
FontData | byte[] | フォントデータ |
ここで、フォントデータは各文字の個別の情報ではなく、画面に表示するためのメニューの表記文字列を一まとめに持ってます(伝われ
このデータをメモリに配置するためのプログラムがこれ
int offset = 6; _dataFile.seek(offset); _dataFile.read(_dataReadTempBuf, 2); uint32_t dataPtrDataOffset = _dataFile.position(); uint16_t menuContextCount = *(uint16_t*)(_dataReadTempBuf); uint16_t dataPtrDataLength = menuContextCount * 4; byte* fontDataBuf = _dataReadTempBuf + dataPtrDataLength; uint16_t writePos = SramManageWrapperClass::GetNestDataLastAddless() + 2 * (menuContextCount + 1); _dataFile.read(_dataReadTempBuf, dataPtrDataLength); for (uint16_t i = 0; i < menuContextCount; i++) { _dataFile.read(fontDataBuf, 4);//個別データのデータ長の読み取り uint32_t dataLen =*(uint32_t*)(fontDataBuf + 0); _dataFile.read(fontDataBuf, dataLen); uint32_t fontPosInLocal = 2 + *(uint16_t*)(fontDataBuf) + 1 + 1;//フォントの幅とフォントデータのみを記録する; uint32_t writeLength = dataLen - fontPosInLocal; if (writePos + writeLength >= SRAM_ADDRESS_NUM) break; SramWriteBytes(writePos, fontDataBuf + fontPosInLocal, writeLength); SramWriteBytes(SramManageWrapperClass::GetNestDataLastAddless() + 2 * i, (uint8_t*)(&writePos), 2); writePos += writeLength; } SramWriteBytes(SramManageWrapperClass::GetNestDataLastAddless() + 2 * menuContextCount, (uint8_t*)(&writePos), 2); _dataFile.close();
ってわけで、内部メモリ的にはこう配置してるはず…はず…
データ名 | データ型 | データ長(byte長) | 値 | 備考 |
---|---|---|---|---|
MenuNum | uint16_t | 2 | n | メニューの数 |
FontDataPtr | uint32_t | 4*(n+1) | フォントデータが入っているポインタ | |
*FontWidth | uint8_t | 1? | フォントの幅 | |
*FontData | byte | フォントデータ |
これ以上は眠いのでここで終わり…