組み込みシステム向けにC言語で書かれた、超軽量・プラットフォーム非依存のノンブロッキング型モールス符号エンコーダーモジュールです。
- 決定論的な超省メモリ設計:動的確保を排除し静的メモリのみで動作。1文字16ビット(上位8bit: パターン、下位8bit: 長さ)のルックアップテーブルを採用。
- 完全ノンブロッキング・FSM駆動:
delay()を使用しないためリアルタイムタスクを阻害しません。 - プラットフォーム非依存:ハードウェア制御を抽象化し、多様なマイコンに移植可能。
- 国際モールス規格(ITU)準拠:正確なスペース生成と主要文字・記号に対応。
独自の16ビットビットフィールド形式でエンコードされています。
- 高位 8bit: ビットパターン(
0: 短点、1: 長点) - 低位 8bit: 符号長
ご使用の環境(通常のC言語環境、またはArduino環境)に合わせて、依存関数(BSP)を実装して組み込みます。
純粋なC言語環境(morse-encoder.c と同一のリンケージ)で動作させる場合の最小構成です。
#include "morse-encoder.h"
#include "your_mcu_hal.h" // ご使用のマイコンのヘッダー
/* 1. ハードウェアのシステムタイマー(ミリ秒)を返す関数 */
uint32_t morse_get_time_ms(void) {
return HAL_GetTick(); // 例: STM32CubeHALの場合
}
/* 2. 指定された状態(1:ON, 0:OFF)に応じてGPIOを制御する関数 */
void morse_set_signal(uint8_t state) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}#include "morse-encoder.h"
int main(void) {
// ハードウェアの初期化をここで行う
morse_init();
morse_start("SOS");
while (1) {
morse_update(); // 状態遷移マシンをノンブロッキングで更新
// 他のバックグラウンドタスクをここに記述可能
}
}Arduino環境の関数(millis() や digitalWrite())はC++としてコンパイルされるため、BSP側の拡張子を .cpp にして連携させます。CPUの種類(AVR、ESP32、RP2040、ARM等)を問わず完全に共通のコードで動作します。
#include <Arduino.h>
#include "morse-encoder.h"
/* 1. Arduinoのタイマーから現在時刻(ms)を取得 */
uint32_t morse_get_time_ms(void) {
return millis();
}
/* 2. 指定された状態に応じて内蔵LEDを制御 */
void morse_set_signal(uint8_t state) {
digitalWrite(LED_BUILTIN, state ? HIGH : LOW);
}delay() を使用しないため、loop() 内で他の処理を同時に実行してもモールス信号の点滅が途切れることはありません。
#include "morse-encoder.h"
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
morse_init();
morse_start("SOS CQ CQ");
}
void loop() {
morse_update(); // 毎ループ高速に呼び出します
}| 関数プロトタイプ | 説明 |
|---|---|
void morse_init(void) |
初期化と出力OFF |
void morse_start(const char *ascii_str) |
送信シーケンス開始 |
void morse_update(void) |
状態更新(ループ内で呼び出し) |
uint8_t morse_is_busy(void) |
ビジー状態判定 (1: 実行中, 0: 待機中) |
このプロジェクトはMIT-0ライセンスのもとで公開されています。詳細はLICENSEファイルをご覧ください。
- 商用利用・個人利用を問わず、完全自由に使用できます。
- 著作権表示やライセンス文言の保持・記載義務すらありません。
- ソースコードの改変、流用、再配布、自社製品への組み込み等、制限なくご活用いただけます。