Enchan1207 / avr-serial

Asynchronous serial communication interface (UART) library for AVR microcontroller
0 stars 0 forks source link

USARTのグローバル変数化やめたい #13

Closed Enchan1207 closed 1 year ago

Enchan1207 commented 1 year ago

これのせいでwarning出る

ターゲットMCUによってレジスタ名の定義が違ってたりするので、Arduinoにならって 必要なレジスタをコンストラクタで渡せるようにしたいなという

ただ流石に HardwareSerial[0-3] みたいなネーミングは避けたい

Enchan1207 commented 1 year ago

avr/io.hに直接依存するのは event.cppconfigure.cpp

の4つのレジスタと

の4つの識別子が必要.

Enchan1207 commented 1 year ago

データレジスタ(UDR)だけは共通化できそう(UDR, UDR[0-3])だから、event.cpp内のデータ取得処理だけメンバ呼ぶようにして、あとはvirtualの方がいいかもしれない

Enchan1207 commented 1 year ago

とりあえずUDRだけインジェクションされた方を参照するように変更。これで avr/io.h に依存するのは configure.cpp だけになったわけですが…

Enchan1207 commented 1 year ago

あとはグローバル変数をどうやめるかなんですよね… Singletonにするにしても、そもそも複数のUSARTインタフェースを持たれると話が終わってしまう

というか多分tiny85とかUSARTI/Fを持たないMCUをターゲットにするとまともに動作しないんじゃないだろうか?

Enchan1207 commented 1 year ago

USARTを抽象基底クラスにしてしまって、対応するレジスタが存在する場合のみUSART0, 1, 2, 3を実体化させるとかどうでしょうか

Enchan1207 commented 1 year ago

AVR-GCCで仮想関数を使うのに必要な事前準備が多すぎる

Enchan1207 commented 1 year ago

USART[0-3]BaseUSARTを継承したシングルトンクラスとして定義, Serial および Serial[0-3] をエイリアスとして設定

Enchan1207 commented 1 year ago

これによりこんな感じの書き方ができるようになりました:

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を使ったコードを(ほぼ)そのまま流用できそう.

Enchan1207 commented 1 year ago

PROGMEM文字列の対応をやってないですが、それはこのissueでやることではないので一旦閉じますか