そのため、Arduino (8 ビット AVR) で FastLED ライブラリを使用しており、LED を通常の 2D グリッド (蛇行パターン) に配置しています。ビットマップ テキストとイメージを生成するには、2D デカルト座標を物理 LED (配列インデックス) アドレス (最初の LED の場合は 0、2 番目の LED の場合は 1...) に変換する方法が必要です。私は自分が望むことを行う関数display_addr_getを作成しましたが、頻繁に使用しているため、最適かどうか疑問に思っていました。つまり、より速く/より簡単にすることはできますか? 現在、行/列インデックスがバイトの範囲内にあるかどうかを確認するためのエラー チェックがないことを知っているので、飽和演算 (合計を 255 に制限する qadd8() など) を使用するソリューションがあれば理想的です。
私の SRAM は実質的にいっぱいなので、(2D 座標を配列アドレスにマッピングするための) そこにルックアップ テーブルを実装することはできません。また、PROGMEM にルックアップ テーブルを格納するためにどれだけ速度が犠牲になるかわかりません。そこから常にデータを読み込んでいます。
以下のコードは、有効な行と列の値ごとに配列インデックス値を左上から右下に出力することによって達成しようとしていることを示しています。
#include <stdio.h>
#define MATRIX_WIDTH 10
#define MATRIX_HEIGHT 8
typedef unsigned char uint8_t;
uint8_t display_addr_get(uint8_t row, uint8_t col);
uint8_t display_addr_get2(uint8_t row, uint8_t col);
int main()
{
printf("Starting Test:\n");
uint8_t col = 0;
uint8_t row = 0;
for (row = MATRIX_HEIGHT; row > 0; row--) {
for (col = 1; col <= MATRIX_WIDTH; col++) {
printf("|Index: %-3d|", display_addr_get(row, col));
}
printf("\n");
}
return 0;
}
// My custom function
uint8_t display_addr_get(uint8_t row, uint8_t col) {
uint8_t AddrLED = 0; // var size limits the strip length to 256 LEDs
if (row & 1) { // y (row) index is odd
AddrLED = -col + MATRIX_WIDTH * (MATRIX_HEIGHT - row + 1);
}
else { // y (row) index is even
AddrLED = col - 1 + MATRIX_WIDTH * (MATRIX_HEIGHT - row);
}
return AddrLED;
}
// Snippet from the FastLED lib (uses a different origin reference point)
uint8_t display_addr_get2(uint8_t y, uint8_t x) {
uint8_t i = 0;
if( y & 0x01) {
// Odd rows run backwards
uint8_t reverseX = (MATRIX_WIDTH - 1) - x;
i = (y * MATRIX_WIDTH) + reverseX;
} else {
// Even rows run forwards
i = (y * MATRIX_WIDTH) + x;
}
return i;
}
プログラム出力 (曲がりくねったパターンはインデックスが奇数行で逆になっていることに注意してください。これは LED の物理的な接続によるもので、変更することはできません):
Starting Test:
|Index: 0 ||Index: 1 ||Index: 2 ||Index: 3 ||Index: 4 ||Index: 5 ||Index: 6 ||Index: 7 ||Index: 8 ||Index: 9 |
|Index: 19 ||Index: 18 ||Index: 17 ||Index: 16 ||Index: 15 ||Index: 14 ||Index: 13 ||Index: 12 ||Index: 11 ||Index: 10 |
|Index: 20 ||Index: 21 ||Index: 22 ||Index: 23 ||Index: 24 ||Index: 25 ||Index: 26 ||Index: 27 ||Index: 28 ||Index: 29 |
|Index: 39 ||Index: 38 ||Index: 37 ||Index: 36 ||Index: 35 ||Index: 34 ||Index: 33 ||Index: 32 ||Index: 31 ||Index: 30 |
|Index: 40 ||Index: 41 ||Index: 42 ||Index: 43 ||Index: 44 ||Index: 45 ||Index: 46 ||Index: 47 ||Index: 48 ||Index: 49 |
|Index: 59 ||Index: 58 ||Index: 57 ||Index: 56 ||Index: 55 ||Index: 54 ||Index: 53 ||Index: 52 ||Index: 51 ||Index: 50 |
|Index: 60 ||Index: 61 ||Index: 62 ||Index: 63 ||Index: 64 ||Index: 65 ||Index: 66 ||Index: 67 ||Index: 68 ||Index: 69 |
|Index: 79 ||Index: 78 ||Index: 77 ||Index: 76 ||Index: 75 ||Index: 74 ||Index: 73 ||Index: 72 ||Index: 71 ||Index: 70 |