Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
ライブラリについて
パケット種別ごとの定義
サンプルコード
基本クラス、関数
ユーティリティ関数
パケット種別判定
E_PKT identify_packet_type(uint8_t* p, uint8_t u8len)
E_PKT identify_packet_type(SmplBuf_Byte& sbuff)
E_PKT identify_packet_type(spTwePacket& sp)ハードウェア接続
[M5Stack 15P]
GPIO03
GPIO01
GPIO16 --- TWELITE DIO6/UART0 TX (TWELITE DIP #10)
GPIO17 --- TWELITE DIO7/UART0 RX (TWELITE DIP #3)
GPIO02
GPIO05
GPIO25
GPIO26
GPIO35
GPIO36
RST
BAT
3V3 --- TWELITE VCC (TWELITE DIP #28)
5V
GND --- TWELITE GND (TWELITE DIP #1,14)ライブラリの使用
#include <mwm5.h>
#include <Arduino.h>
#include <M5Stack.h>パケット種別定義
パケット定義
PAL共通データ
フォントジェネレータ関数
書式パーサー
struct DataPal {
uint8_t u8lqi; // LQI値
uint32_t u32addr_rpt; // 中継器のアドレス
uint32_t u32addr_src; // 送信元のアドレス
uint8_t u8addr_src; // 送信元の論理アドレス
uint16_t u16seq; // シーケンス番号
E_PAL_PCB u8palpcb; // PAL基板の種別
uint8_t u8palpcb_rev; // PAL基板のレビジョン
uint8_t u8sensors; // データに含まれるセンサーデータの数 (MSB=1はエラー)
uint8_t u8snsdatalen; // センサーデータ長(バイト数), MSB=1は動的確保
uint8_t au8snsdata[32]; // センサーデータ(解釈前の生データ)
std::unique_ptr<uint8_t[]> uptr_snsdata; // センサーデータ(動的確保)
};FontDef& で、ライブラリ内のフォント管理配列内に格納されたオブジェクトへの参照です。const FontDef& queryFont(uint8_t id) [IParser]
↑
[AsciiParser]App_Twelite データ
struct DataTwelite {
//送信元のシリアル#
uint32_t u32addr_src;
// 送信元の論理ID
uint8_t u8addr_src;
// 宛先の論理ID
uint8_t u8addr_dst;
// 送信時のタイムスタンプ
uint16_t u16timestamp;
// 低レイテンシ送信時のフラグ
bool b_lowlatency_tx;
// リピート中継回数
uint16_t u8rpt_cnt;
// LQI値
uint16_t u8lqi;
// DIの状態 (true がアクティブ Lo,GND)
bool DI1, DI2, DI3, DI4;
// DIの状態ビットマップ (LSBから順にDI1,2,3,4)
uint8_t DI_mask;
// DIアクティブならtrue (過去にアクティブになったことがある)
bool DI1_active, DI2_active, DI3_active, DI4_active;
// DIのアクティブビットマップ(LSBから順にDI1,2,3,4)
uint8_t DI_active_mask;
// モジュールの電源電圧[mV]
uint16_t u16Volt;
// AD値 [mV]
uint16_t u16Adc1, u16Adc2, u16Adc3, u16Adc4;
// ADがアクティブ(有効)なら 1 になるビットマップ (LSBから順にAD1,2,3,4)
uint8_t Adc_active_mask;
};環境センサーパル(AMB)のセンサーデータ
struct PalAmb : public PalBase {
const uint8_t U8VARS_CT = 4; // センサー数
const uint32_t STORE_COMP_MASK = (1 << U8VARS_CT) - 1; // 全コンプマスク
int16_t i16Temp; // 温度 (x100)
uint16_t u16Humd; // 湿度 (x100 %)
uint32_t u32Lumi; // 照度 (lux相当)
};開閉センサーパル(MAG)のセンサーデータ
struct PalMag : public PalBase {
const uint8_t U8VARS_CT = 2; // センサー数
const uint32_t STORE_COMP_MASK = (1 << U8VARS_CT) - 1; // 全コンプのマスク
uint8_t u8MagStat; // 開閉状況 (0:磁石が遠い, 1/2:磁石検出)
uint8_t bRegularTransmit; // 定期送信の時に 1, 磁石検出では 0
};バイト配列
typedef SimpleBuffer<uint8_t> SmplBuf_Byte; [spTwePacket] ←(生成)- newTwePacket()
◆
|(shared_ptr)
|
[TwePacket] [DataPal]
↑ ↑
[TwePacketPal] -(生成)-> [PalAmb], [PalMot], ...u32Optは、フォントのオプションを指定します。オプションはU32_OPT_FONT_TATEBAIとU32_OPT_FONT_YOKOBAIがあり、論理和で指定します。const FontDef& createFontShinonome16(
uint8_t id,
uint8_t line_space = 0,
uint8_t char_space = 0,
uint32_t u32Opt = 0);if (createFontShinonome16(11).is_default()) {
// フォント作成のエラー
}struct _pkt_hist {
spTwePacket _pkt[16]; // パケットの履歴
int _i;
_pkt_hist() : _i(-1), _pkt{} {}
void add_entry(spTwePacket p) { _pkt[++_i & 0xF] = p; }
spTwePacket get_entry(int i) { return _pkt[(i + _i) & 0xF]; }
} pkt_hist;
void loop() {
spTwePacket pkt, pkt_last;
// 新たなパケットオブジェクト
pkt = newTwePacket(p, len);
pkt_hist.add_entry(pkt); // 履歴に保存する
// ひとつ前のパケットオブジェクト
pkt_last = pkt_hist.get_entry(-1);
}環境
spTwePacketオブジェクトの参照


(pkt && pkt->get_type() == E_PKT::PKT_TWELITE)と記述しても同じ判定が得られます。TwePacket& refTwePacket(spTwePacket& p)
//例
auto&& pkt = newTwePacket(p, len); // パケットの生成
if (refTwePacket(pkt).get_type() == E_PKT::PKT_TWELITE) {
// App_Twelite の処理
}AsciiParser(size_t maxbuffsiz)
AsciiParser(SmplBuf_Byte& bobj)uint8_t AsciiParser::_u8Parse(char_t u8byte)void AsciiParser::_vOutput(TWEUTILS::SmplBuf_Byte& bobj, TWE::IStreamOut& p)static void vPutByte(uint8_t u8byte, uint8_t* pu8lrc, TWE::IStreamOut& p)
static void s_vOutput(TWEUTILS::SmplBuf_Byte& bobj, TWE::IStreamOut& p)PAL基板種別
ターミナル(コンソール)クラスの利用例
標準アプリケーション
TWELITE DIP
-01:GND VCC:28-------M5 3V3
-02:D14 D3:27-
M5 GPIO16-------03:D7 D2:26-
-04:D5 D1:25-
-05:D18 A2:24-
-06:C D0:23-
-07:M A1:22-
-08:D19 RST:21-
-09:D4 D17:20-
M5 GPIO17-------10:D6 D15:19-
-11:D8 D16:18-
-12:D9 D11:17-
-13:D10 D13:16-
M5 GND----------14:GND D12:15-void loop() {
if (M5.BtnB.wasReleased()) {
static int idx = 0;
const char msg[3][16] = {
"ABCD1234", "あいうえ", "やあ世界" };
auto&& font = queryFont(10); // use font ID=10
drawChar(
font, // フォント指定
0, 240 - 30, // 左上座標 (X,Y)
msg[idx], // 文字列
RED, // 文字色
BLACK, // 背景色
0x01); // オプション 0x01:BOLD
idx++; if (idx >= 3) idx = 0;
}
}int16_t drawChar(const FontDef& font, int32_t x, int32_t y,
uint16_t c, uint32_t color, uint32_t bg, uint8_t opt);
int16_t drawChar(const FontDef& font, int32_t x, int32_t y,
const char *s, uint32_t color, uint32_t bg, uint8_t opt);
int16_t drawChar(const FontDef& font, int32_t x, int32_t y,
const uint16_t* s, uint32_t color, uint32_t bg, uint8_t opt);forece_refresh()にて初期描画を行います。// ターミナルオブジェクトの生成
TWETerm_M5_Console the_screen(
64, 20,
{ 0, 16, 320, 192 }, M5);void setup() {
...
// create font as #10 (東雲フォント16)
createFontShinonome16(10, 0, 0);printfmt(const char*fmt, ...)
ISteramOut& operator << (IStreamOut& strm, printfmt f)
//例
the_screen << printfmt("%04X", 0x12ab) << crlf;int fPrintf(TWE::IStreamOut& fp, const char* format, ...)int snPrintf(char* buffer, size_t count, const char* format, ...)#include <mwm5.h>
#include <Arduino.h>
#include <M5Stack.h>
// ターミナルオブジェクトの生成
TWETerm_M5_Console the_screen(
64, 20,
{ 0, 16, 320, 192 }, M5);
void setup() {
// begin M5
M5.begin(true, false, true, false); // LCD, SD, Serial, I2C
// create font as #10 (東雲フォント16)
createFontShinonome16(10, 0, 0);
the_screen.set_font(10); // set font #10
the_screen.set_color(ALMOST_WHITE, M5.Lcd.color565(90, 0, 50);
// set color (fg, bg)
the_screen.set_cursor(2); // 0: no 1: curosr 2: blink cursor
the_screen.force_refresh(); // repaint now.
// initial message
the_screen << "the_screen:" << crlf;
}
void loop() {
// refresh screen
static uint32_t t_last;
uint32_t t_now = millis();
if (t_now - t_last > 32) {
the_screen.refresh();
t_last = t_now;
}
// press A button
if (M5.BtnA.wasReleased()) {
the_screen << "hello world!" << crlf;
}
if (M5.BtnB.wasReleased()) {
// force clear with whole redraw.
the_screen.clear_screen();
}
if (M5.BtnC.wasReleased()) {
// clear screen and set cursor home.
the_screen << "\033[2J\[033H";
}
}void setup() {
...
the_screen.set_font(10); // set font #10
the_screen.set_color(ALMOST_WHITE, color565(90, 0, 50);
// set color (fg, bg)
the_screen.set_cursor(2); // 0: no 1: curosr 2: blink cursor
the_screen.force_refresh(); // repaint now.void loop() {
// refresh screen
static uint32_t t_last;
uint32_t t_now = millis();
if (t_now - t_last > 32) {
the_screen.refresh(); // 再描画!
t_last = t_now;
}void loop() {
...
// press A button
if (M5.BtnA.wasReleased()) {
the_screen << "hello world!" << crlf;
}
if (M5.BtnB.wasReleased()) {
// force clear with whole redraw.
the_screen.clear_screen();
}
if (M5.BtnC.wasReleased()) {
// clear screen and set cursor home.
the_screen << "\033[2J\[033H";
}ターミナル(コンソール)
TWELITE DIP
-01:GND VCC:28-------M5 3V3
-02:D14(SCL) (M3 ) D3:27-
M5 GPIO16-------03:D7 (RX ) (M2 ) D2:26-
-04:D5 (Pw1) (AI4) D1:25----VCC
-05:D18(DO1) (AI3) A2:24----VCC
-06:C (Pw2) (AI2) D0:23----VCC
-07:M (Pw3) (AI1) A1:22----VCC
-08:D19(DO2) RST:21-
-09:D4 (DO3) (BPS)D17:20-
M5 GPIO17-------10:D6 (TX ) (SDA)D15:19-
-11:D8 (Pw4) (DI4)D16:18-
-12:D9 (DO4) (DI3)D11:17-
GND----13:D10(M1 ) (DI2)D13:16-
M5 GND----------14:GND (DI1)D12:15-Serial2.setRxBufferSize(512);
Serial2.begin(115200, SERIAL_8N1, 16, 17);setup_screen();check_for_serial();process_input();check_for_refresh(); trm << "\033[H"; // カーソルホーム
...
if (b) trm << "\033[1;1H" // カーソルを1行目に移動
"\033[1;30;45mタイムCT\033[0m" " " // ボールド、文字色、背景色設定
"\033[1;30;45mId#\033[0m" " "
"\033[1;30;45mシリアル番号\033[0m";
if (b) trm << "\033[3;1H" // カーソルを3行目に移動
"\033[1;30;45m D1 \033[0m"
" \033[1;30;45m D2 \033[0m"
" \033[1;30;45m D3 \033[0m"
" \033[1;30;45m D4 \033[0m"; TwePacketTwelite& x = refTwePacketTwelite(spLastPacket);
if (c) trm << "\033[2;1H"
<< printfmt("%5d %3d %8X",
x.u16timestamp, x.u8addr_src, x.u32addr_src);
if (c) trm << "\033[4;1H "
<< (x.DI1 ? "\033[31m" "●" : "\033[35m" "〇") << "\033[0m "
<< (x.DI2 ? "\033[32m" "●" : "\033[35m" "〇") << "\033[0m "
<< (x.DI3 ? "\033[33m" "●" : "\033[35m" "〇") << "\033[0m "
<< (x.DI4 ? "\033[34m" "●" : "\033[35m" "〇") << "\033[0m";Serial2.setRxBufferSize(512);
Serial2.begin(115200, SERIAL_8N1, 16, 17);setup_screen();pkt_data.init_screen(fmt_title);check_for_serial();process_input();check_for_refresh();void init_screen(const char *fmt_status)
void reinit_screen()bool add_entry(spTwePacket spobj)void next_page()
void prev_page()
void set_page(int entry)void update_status()void update_term()
void update_term(spTwePacket pal_upd, bool update_all)template <class T>
class SimpleBuffer { ... };template<typename T>
class FixedQueue : public std::queue<T> { ... };SimpleBuffer()
SimpleBuffer(T* p, uint16_t u16len, uint16_t u16maxlen)
SimpleBuffer(uint16_t u16maxlen)SimpleBuffer(const SimpleBuffer<T>& ref)
SimpleBuffer<T>& operator = (const SimpleBuffer<T>& ref)void attach(T* p, uint16_t l, uint16_t lm)SimpleBuffer<uint8_t> buf(128), buf_sub;
buf_sub = buf;
buf_sub.attach(buf.begin() + 16, 0, buf.max_length() - 16);T* begin()
T* end()bool append(T c)
void push_back(T c) { append(c); }uint16_t length()
uint16_t size() { return length(); }
uint16_t length_max()
uint16_t capacity() { return length_max(); }bool redim(uint16_t len)
bool reserve(uint16_t len) { return redim(len); }inline T& operator [] (int i)#if __GNUC__
#define _GLIBCXX_DEQUE_BUF_SIZE 64
// smaller chunk for deque in GCC, the dafalt size
// 512bytes are too big for embedded systems.
#endif
#include <deque>
#include <queue>FixedQueue(std::size_t size)bool push(T value)void pop()T& std::queue<T>::front()bool std::queue<T>::empty()uint8_t get_width()
uint8_t get_width(uint16_t wc)uint8_t get_height()bool is_default()uint8_t get_font_code()int find_font_index(uint16_t c)// インデックス配列 M+10dotフォント
const uint16_t font_mplus_f10j_idx[FONT_MP10_DBL_CHARS] {
0x0391, // IDX=0 U+0391
0x0392, // IDX=1 U+0392
0x0393, // IDX=2 U+0392
...
0x5a2f, // IDX=892 U+5a2f (娯)
...
}
// データ配列
const uint8_t font_mplus_f10j_data[FONT_MP10_DBL_CHARS*FONT_MP10_DATA_ROWS*2] = {
...
0x00,0x00,0x47,0x80,0x54,0x80,0xf7,0x80,0x50,0x00,
0x5f,0x80,0xa0,0x80,0xff,0x80,0x45,0x00,0x58,0x80, // 3864/u5a2f idx=892
...
};
エスケープシーケンス
void putmsg(ITerm& trm, const char *msg) {
trm << TermAttr(TERM_COLOR_FG_RED | TERM_BOLD);
trm << msg;
trm << TermAttr(TERM_ATTR_OFF);
}TermAttr(GChar::tAttr attr = 0)inline ITerm& operator << (ITerm& t, char_t c)
{ *static_cast<TWE::IStreamOut*>(&t) << c; return t; } virtual inline IStreamOut& operator ()(char_t c) = 0
virtual inline IStreamOut& write_w(wchar_t c)class ITerm : public TWE::IStreamOut {
// ... 各種定義
ITerm& write(char_t c) {
// ... 1バイト入力を受け付ける処理
}
// StreamOut::operator () の実装
TWE::IStreamOut& operator ()(char_t c) {
write(c);
return *this;
}
};inline IStreamOut& operator << (char_t c)
inline IStreamOut& operator << (wchar_t c)
inline IStreamOut& operator << (IStreamSpecial& sc)class IStreamSpecial {
public:
virtual inline IStreamOut& operator ()(IStreamOut& of) = 0;
};class IStream_endl : public IStreamSpecial {
inline IStreamOut& operator ()(IStreamOut& of) {
// ... CR LF の出力
of ('\r');
of ('\n');
}
};
IStream_endl crlf;the_screen << "Hello World!" << crlf;
シリアル電文パーサー

// serial parser
AsciiParser parse_ascii(256);while (Serial.available()) {
int c = Serial.read();
parse_ascii << char_t(c);
if (parse_ascii) {
// completed!
}
}if (parse_ascii) {
auto&& p = parse_ascii.get_payload();
}auto&& p = parse_ascii.get_payload();
if (p[0] == 0x80) { ... } // 最初の要素
int len = p.length(); // 要素数
for (auto&& x : p) { // 各要素にアクセス
Serial.print(x, HEX);
Serial.print(" "); }auto&& pkt = newTwePacket(parse_ascii.get_payload());
E_PKT pkt_typ = identify_packet_type(pkt);
if (pkt_typ == E_PKT::PKT_PAL) {
// TWELITE PAL (App_PAL)
} else {
// unknown packet type
}if (pkt == E_PKT::PKT_PAL) {
auto&& pal = refTwePacketPal(pkt);
if (pal.u8palpcb == E_PAL_PCB::MAG) {
// for MAG
} else
if (pal.u8palpcb == E_PAL_PCB::AMB) {
// for AMB
}
}if (pal.u8palpcb == E_PAL_PCB::MAG) {
PalMag mag = pal.get_PalMag();
if (mag.u8MagStat == 0) {
// closed
} else {
// opened
}
}PALセンサー共通データ
ITerm(uint8_t u8c, uint8_t u8l)
ITerm(uint8_t u8c, uint8_t u8l, SimpBuf_GChar* pAryLines, GChar* pBuff)// 静的メモリ確保例
const uint8_t U8COL = 64;
const uint8_t U8LINE = 20;
static TWETERM::GChar screen_buf[U8COL * U8LINE]; // pBuff
static TWETERM::SimpBuf_GChar screen_lines[U8LINE]; // pAryLinesvirtual ~ITerm()void clear()
void home()
void clear_screen()virtual void refresh() = 0
void force_refresh()ITerm& write(wchar_t c)
ITerm& write(char_t c)uint8_t get_height() // 行数
uint8_t get_width() // カラム数ITerm& operator << (const char *s)
TWE::IStreamOut& operator << (TWE::IStreamSpecial& sc)
TWE::IStreamOut& operator << (ITerm& t, char_t c)
TWE::IStreamOut& operator << (ITerm& t, wchar_t c)
TWE::IStreamOut& operator << (ITerm& t, int i)
TWE::IStreamOut& operator << (ITerm& t, TermAttr a)
TWE::IStreamOut& operator << (TWE::IStreamOut& t, TermAttr a) struct PalBase {
uint32_t u32StoredMask;
uint16_t u16Volt;
};/* Copyright (C) 2020 Mono Wireless Inc. All Rights Reserved. *
* Released under MW-OSSLA-*J,*E (MONO WIRELESS OPEN SOURCE *
* SOFTWARE LICENSE AGREEMENT). */class TwePacket;
typedef std::shared_ptr<TwePacket> spTwePacket;TwePacket(E_PKT ptyp = E_PKT::PKT_ERROR)virtual ~TwePacket()E_PKT get_type()virtual E_PKT parse(uint8_t* p, uint8_t u8len)uint16_t c = color565(255, 127, 0); // R:255, G:127, B:0TWETerm_M5_Console(
uint8_t u8c, uint8_t u8l,
Rect drawArea, M5Stack& _M5)
TWETerm_M5_Console(
uint8_t u8c, uint8_t u8l,
TWETERM::SimpBuf_GChar* pAryLines, TWETERM::GChar* pBuff,
Rect drawArea, M5Stack& _M5)TWETerm_M5_Console the_screen(64, 20, { 0, 16, 320, 192 }, M5);void loop() {
static uint32_t u32mills;
uint32_t u32now = millis();
if (u32now - u32mills > 32) {
the_screen.refresh();
u32mills = u32now;
}
}void set_font(uint8_t u8id, uint8_t u8col_request = 0, uint8_t u8row_request = 0)uint8_t font_id()
uint8_t font_width()
uint8_t font_height()void set_color(uint16_t color, uint16_t bgcolor = 0)void set_color_table(const uint16_t* ptbl)static const uint16_t COLTBL_MAIN[8] = {
BLACK,
RED,
GREEN,
YELLOW,
color565(127, 127, 255), // BLUE,
color565(255, 0, 142), // MAGENTA,
CYAN,
ALMOST_WHITE
};
the_screen.set_color_table(COLTBL_MAIN);constexpr uint16_t color565(uint8_t r, uint8_t g, uint8_t b)動作センサーパル(MOT)のセンサーデータ
struct PalMot : public PalBase {
const uint8_t U8VARS_CT = 17; // センサー数
const uint32_t STORE_COMP_MASK = 3; // 電圧と加速度サンプル1あればコンプとする
uint8_t u8samples; // 格納サンプル数
int16_t i16X[16]; // X軸 (ミリG)
int16_t i16Y[16]; // Y軸
int16_t i16Z[16]; // Z軸
};IParser& Parse(uint8_t u8b)
IParser& operator << (char_t c)uint8_t state()operator bool()
bool is_complete()uint16_t length()uint8_t operator[](int i)SmplBuf_Byte& get_payload()virtual void reinit()IStreamOut& operator << (TWE::IStreamOut& lhs, IParser& rhs)
IStreamOut& operator << (TWETERM::ITerm& lhs, IParser& rhs)virtual uint8_t _u8Parse(char_t u8b) = 0virtual inline void _vOutput(SmplBuf_Byte& bobj, IStreamOut& p) = 0class TwePacketPal : public TwePacket, public DataPal { ... };TwePacketPal& refTwePacketPal(spTwePacket& p)if (parse_ascii) { // アスキー形式のパーサーの解釈完了
if (identify_packet_type(parse_ascii.get_payload()) == E_PKT::PKT_PAL) {
auto&& pkt = newTwePacket(parse_ascii.get_payload(), E_PKT::PKT_PAL);
if (pkt == E_PKT::PKT_PAL) { // パケット解釈成功時
auto&& pal = refTwePacketPal(pkt);
// 開閉センサーパル
if (pal.u8palpcb == E_PAL_PCB::MAG) {
PalMag mag = pal.get_PalMag();
if (mag.u8MagStat == 0) {
// OPEN
} else {
// CLOSE
}
}
}
}
}PalMag get_PalMag()PalAmb get_PalAmb()PalMot get_PalMot()ターミナル(コンソール)
[IStreamOut]
↑
[ITerm]
↑
[TWETerm_M5_Console]汎用クラス・関数
TWEFONT::createFontShinonome16(10, 0, 0,
TWEFONT::U32_OPT_FONT_TATEBAI | TWEFONT::U32_OPT_FONT_YOKOBAI);
TWEFONT::createFontShinonome16(11, 1, 0);●東雲フォントライセンス
2001
The Electronic Font Open Laboratory
http://openlab.ring.gr.jp/efont/
このアーカイブに含まれるすべてのフォントデータ、ドキュメント、スクリプ
ト類はすべて Public Domain で提供されています 。
但し、日本に於いては現時点で著作権を放棄することは法律上不可能であり、
AUTHORS に列挙されている作者がその権利を行使しないと宣言することで実質
的な Public Domain であるとします。
自由な改造、他フォーマットへの変換、組込み、再配布を行うことができます。
同時に、これらはすべて完全に無保証です。 M+ BITMAP FONTS Copyright 2002-2005 COZ <[email protected]>
-
LICENSE
These fonts are free softwares.
Unlimited permission is granted to use, copy, and distribute it, with
or without modification, either commercially and noncommercially.
THESE FONTS ARE PROVIDED "AS IS" WITHOUT WARRANTY.auto&& font = queryFont(10); // ID10のFontDefオブジェクトを参照
TWE::fPrintf(the_screen, "\nFont: %s\n ID=%d H:%d W:%d W_CHRs:%d",
font.font_name, // フォント名
font.get_font_code(), // フォントID (=10)
font.height, // フォントデータの高さ(行間は含まれない)
font.width, // フォントデータの幅(シングル幅、文字間スペースは含まれない)
font.font_wide_count // ダブル幅の登録文字数
);// ターミナル the_screen の宣言
TWETerm_M5_Console the_screen(64, 20, { 0, 16, 320, 192 }, M5);
void setup() {
// ... M5の初期化など
M5.begin(true, false, true, false);
// フォントの生成と登録
createFontMP12(13, 0, 0);
the_screen.set_font(13); // フォントIDの指定
the_screen.force_refresh(); // 再描画
}the_screen.set_font(11); // フォントの指定
the_screen.clear_screen(); // ターミナルを文字バッファをクリアする
the_screen.force_refresh(); // 完全再描画を行うif (parse_ascii) { // アスキー形式のパーサーの解釈完了
if (identify_packet_type(parse_ascii.get_payload()) == E_PKT::PKT_TWELITE) {
auto&& pkt = newTwePacket(parse_ascii.get_payload(), E_PKT::PKT_TWELITE);
if (pkt == E_PKT::PKT_TWELITE) { // パケット解釈成功時
auto&& x = refTwePacketTwelite(pkt);
the_screen // LCDスクリーン上のターミナルに情報を表示
<< printfmt(":Lq=%d:Ad=%08X", x.u8lqi, x.u32addr_src)
<< printfmt(":ID=%02X", x.u8addr_src)
<< printfmt(":DI=%04b", x.DI_mask)
;
}
}
}パケットデータの解釈とオブジェクト生成
spTwePacket newTwePacket(
uint8_t* p,
uint8_t u8len,
E_PKT eType = E_PKT::PKT_ERROR)
spTwePacket newTwePacket(
TWEUTILS::SmplBuf_Byte& sbuff,
E_PKT eType = E_PKT::PKT_ERROR)