#pragma onece
#ifndef MYLIB_HPP__
#define MYLIB_HPP__
#include <Arduino.h>
#include <STM32FreeRTOS.h>

/// Blockly用の名前空間
namespace user__ {

/// Blocklyが生成する関数
void __createTasks__();

} // namespace user__

/// Blocklyで各ブロックが呼び出す関数群
namespace mylib__ {
void init();
// ----- ブザーでならす音のHz定義 -------------
/// ド
constexpr uint32_t C4 = 261;
/// ド#
constexpr uint32_t CS4 = 277;
/// レ
constexpr uint32_t D4 = 294;
/// レ#
constexpr uint32_t DS4 = 311;
/// ミ
constexpr uint32_t E4 = 330;
/// ファ
constexpr uint32_t F4 = 349;
/// ファ#
constexpr uint32_t FS4 = 370;
/// ソ
constexpr uint32_t G4 = 392;
/// ソ#
constexpr uint32_t GS4 = 415;
/// ラ
constexpr uint32_t A4 = 440;
/// ラ#
constexpr uint32_t AS4 = 466;
/// シ
constexpr uint32_t B4 = 494;
/// ド
constexpr uint32_t C5 = 523;
/// ドレミファソラシド
constexpr uint32_t DoReMi[] = {C4, CS4, D4, DS4, E4, F4, FS4,
                               G4, GS4, A4, AS4, B4, C5};

/// センサーデータ
struct SensorData
{
  /// 温度 (1/100) dig
  int32_t temperatuer;
  /// 気圧 (1/100) hPa
  uint32_t pressure;
  /// 湿度 (1/1024) %
  uint32_t humidity;
};

/// タスクを作る
void createTask(const char *name, TaskFunction_t func);

/// ミリ秒遅延
void delay(TickType_t millisec);

/// カメラ画像を出力
void printJPEG();

/// モーターを動かす
void moveMoter(int dig);

/// 音を鳴らす
void soundBuzzer(uint32_t hz);

/// 音を止める
void stopBuzzer();

/// センサ取得
SensorData getSensorData();
/// センサを出力して取得
SensorData printSensorData();

/// メッセージを出力
void println(const char *text);

/// 実行ブロックの通知
#ifdef DISABLE_BLOCK
#  define highlightBlock(x)
#else
void highlightBlock(const char *id);
#endif

} // namespace mylib__
#endif
