Closed Enchan1207 closed 1 year ago
avr/io.h
に直接依存するのは event.cpp
とconfigure.cpp
で
UDR0
: データレジスタUCSR0A
: 制御レジスタAUCSR0B
: 制御レジスタBUBRR0
: ボーレートレジスタの4つのレジスタと
TXEN0
: 送信許可RXEN0
: 受信許可UDRIE0
: 送信割り込み許可RXCIE0
: 受信割り込み許可の4つの識別子が必要.
データレジスタ(UDR
)だけは共通化できそう(UDR
, UDR[0-3]
)だから、event.cpp
内のデータ取得処理だけメンバ呼ぶようにして、あとはvirtualの方がいいかもしれない
とりあえずUDRだけインジェクションされた方を参照するように変更。これで avr/io.h
に依存するのは configure.cpp
だけになったわけですが…
あとはグローバル変数をどうやめるかなんですよね… Singletonにするにしても、そもそも複数のUSARTインタフェースを持たれると話が終わってしまう
というか多分tiny85とかUSARTI/Fを持たないMCUをターゲットにするとまともに動作しないんじゃないだろうか?
USARTを抽象基底クラスにしてしまって、対応するレジスタが存在する場合のみUSART0, 1, 2, 3を実体化させるとかどうでしょうか
AVR-GCCで仮想関数を使うのに必要な事前準備が多すぎる
USART[0-3]
を BaseUSART
を継承したシングルトンクラスとして定義, Serial
および Serial[0-3]
をエイリアスとして設定
これによりこんな感じの書き方ができるようになりました:
int main(){
Serial.begin(115200);
Serial.println((unsigned char)22);
Serial.println(123);
Serial.println((unsigned int)456);
Serial.println(3.14);
Serial.println(123456L);
Serial.println(1234567890UL);
}
これでArduinoのSerialを使ったコードを(ほぼ)そのまま流用できそう.
PROGMEM文字列の対応をやってないですが、それはこのissueでやることではないので一旦閉じますか
これのせいでwarning出る
ターゲットMCUによってレジスタ名の定義が違ってたりするので、Arduinoにならって 必要なレジスタをコンストラクタで渡せるようにしたいなという
ただ流石に
HardwareSerial[0-3]
みたいなネーミングは避けたい