print.h
Print.cpp
- Committer:
- kurobikari
- Date:
- 2020-04-06
- Revision:
- 0:8164d2af3edf
File content as of revision 0:8164d2af3edf:
#include "mbed.h" #include "print.h" #include "Serial.h" #include <stdarg.h> uint8_t st[100]={0}; int size=0; Print::Print(PinName Tx, PinName Rx) { print_f = new Serial(Tx,Rx); print_f -> baud(19200); } void Print::ISR_Serial_Tx() { static int position=0,TxPosition=0; switch(TxPosition){ case 0: print_f->putc('T'); TxPosition++; break; case 1: print_f->putc(st[position++]); if(position>size) TxPosition++; break; case 2: /* UART送信の割り込みイベント解除 */ print_f -> attach(NULL,Serial::TxIrq); position=0; TxPosition=0; size=0; break; } } void Print::printf(const char* Format, ...) { static uint16_t string_size = 0; va_list ArgList; va_start(ArgList, Format); print_f -> attach(this,&Print::ISR_Serial_Tx,Serial::TxIrq); while (*Format != '\0') { if (*Format == '%') { /* 0表示のフラグ */ uint8_t zero_flag = 0; /* 符号表示フラグ */ uint8_t sign_flag = 0; /* 左詰め表示フラグ*/ uint8_t left_flag = 0; /* 全体幅 */ int16_t o_width = 0; /* 小数点以下の幅 */ int16_t dp_width = -1; /* 引数のデータ幅 */ int16_t arg_width = 1; Format++; /* 0埋め,+表示,左詰め処理 */ while (1) { /* 半角スペースは例外処理 */ if (*Format == ' '); else if (*Format == '0') { zero_flag = 1; } else if (*Format == '+') { sign_flag = 1; } else if (*Format == '-') { left_flag = 1; } /* 処理は存在しない */ else { break; } /* 処理が存在した */ /* 調査する文字を次へ */ Format++; } /* 全体幅処理 */ while (1) { /* 半角スペースは例外処理 */ if (*Format == ' '); else if ((*Format >= '0' && *Format <= '9')) { /* 既に入っている数値の桁数を上げる */ o_width *= 10; /* 文字を整数値に直して加算 */ o_width += (*Format - '0'); } /* 処理は存在しない */ else { break; } /* 処理が存在した */ /* 調査する文字を次へ */ Format++; } /* ピリオドを打っていた場合 */ if (*Format == '.') { /*調査する文字を次へ*/ Format++; /* ピリオド打ちによる操作有効 */ dp_width = 0; /* 最大幅または小数点以下幅処理 */ while (1) { /* 半角スペースは例外処理 */ if (*Format == ' '); else if ((*Format >= '0' && *Format <= '9')) { /* 既に入っている数値の桁数を上げる */ dp_width *= 10; /* 文字を整数値に直して加算 */ dp_width += (*Format - '0'); } /* 処理は存在しない */ else { break; } /* 処理が存在した */ /* 調査する文字を次へ */ Format++; } } /* 指定子による出力 */ /* 整数型数値 */ if (*Format == 'd') { /* 引数読み込み */ int val = va_arg(ArgList, int); int work = val; /* 桁数を調べる */ while (work <= -10 || work >= 10) { work /= 10; arg_width++; } /* 負の数なら符号表示フラグセット */ if (val < 0) { sign_flag = 1; } /* 指定子にピリオド打ちがあった場合は0埋め有効 */ if (dp_width != -1) { zero_flag = 1; } /* スペース入力処理 */ /* 左詰め処理が無ければ数字入力の前に処理 */ if (left_flag == 0) { /* スペース幅(全体幅-数値幅,符号も考慮)が存在 かつ */ /* (0埋め処理なし または 0埋め制限がある場合に限り,0埋めしないスペース幅が存在したら ) */ /* 以上の場合スペース入力処理ループ */ while (o_width - arg_width - sign_flag > 0 && (zero_flag == 0 || (dp_width != -1 && o_width - dp_width - sign_flag > 0))) { /* スペース入力 */ st[string_size++] = ' '; /* 全体幅を減らす */ o_width--; } } /* 符号入力,処理 */ if (sign_flag) { if (val < 0) { /* -入力 */ st[string_size++] = '-'; /* 数値を絶対値にする */ val = -val; } else { /* +入力 */ st[string_size++] = '+'; } } /* 0入力処理 */ /* 0入力幅(全体幅-数値幅,符号も考慮)が存在する場合0入力処理ループ */ while (dp_width - arg_width > 0) { /* 0入力 */ st[string_size++] = '0'; /* 0入力制限値を減らす */ dp_width--; /* 全体幅を減らす */ o_width--; } /* 引数データ幅分文字列データ幅加算 */ string_size += arg_width; /* 下位桁から順に文字列に代入 */ for (int16_t width_cnt = 0; width_cnt < arg_width; width_cnt++) { st[string_size - width_cnt - 1] = '0' + (val % 10); val /= 10; } /* スペース処理 */ /* 左詰め処理がある場合 */ if (left_flag == 1) { /* スペース幅(全体幅-数値幅,符号も考慮)が存在すれば処理 */ while (o_width - arg_width - sign_flag > 0) { /* スペース入力 */ st[string_size++] = ' '; o_width--; } } } /* 実数型数値 */ else if (*Format == 'f') { double val; /* 10の倍数 */ int ten_multi = 1; /* 小数点以下の幅指定が無ければ6桁にする */ if (dp_width == -1) { dp_width = 6; } /* 小数部分の表示する部分を整数にするために10の倍数を作る */ for (int width_cnt = 0; width_cnt < dp_width; width_cnt++) { ten_multi *= 10; } /* 必要小数部分が整数部分に出るようにして引数読み込み*/ val = va_arg(ArgList, double) * ten_multi; double work = val / ten_multi; /* 引数データの元々の整数部分のデータ幅を調べる */ while (work <= -10 || work >= 10) { work /= 10; arg_width++; } /* 負の数なら符号表示フラグセット */ if (val < 0) { sign_flag = 1; } /* スペース入力処理 */ /* 左詰め処理が無ければ数字入力の前に処理 */ if (left_flag == 0) { /* スペース入力幅(全体幅-ピリオド-小数部分幅-整数部分幅,符号も考慮)が存在 かつ */ /* 0埋め処理なし */ /* 以上の場合スペース入力処理ループ */ while (o_width - 1 - dp_width - arg_width - sign_flag > 0 && zero_flag == 0 ) { /* スペース入力 */ st[string_size++] = ' '; /* 全体幅を減らす */ o_width--; } } /* 符号入力,処理 */ if (sign_flag) { if (val < 0) { /* -入力 */ st[string_size++] = '-'; /* 数値を絶対値にする */ val = -val; } else { /* +入力 */ st[string_size++] = '+'; } } /* 0入力処理 */ /* 左詰め処理が無ければ処理 */ if (left_flag == 0) { /* 0入力幅(全体幅-ピリオド-小数部分幅-整数部分幅,符号も考慮)が存在する場合0入力処理ループ */ while (o_width - 1 - dp_width - arg_width - sign_flag > 0) { /* 0入力 */ st[string_size++] = '0'; /* 全体幅を減らす */ o_width--; } } /* (引数データ整数部分幅 + ピリオド + 小数部分幅)分文字列データ幅加算 */ string_size += (arg_width + 1 + dp_width); /* 下位桁から順に文字列に代入 */ /* 小数部分 */ for (int width_cnt = 0; width_cnt < dp_width; width_cnt++) { st[string_size - width_cnt - 1] = '0' + ((int)val % 10); val /= 10; } /* ピリオド */ st[string_size - dp_width - 1] = '.'; /* 整数部分 */ for (int16_t width_cnt = 0; width_cnt < arg_width; width_cnt++) { st[string_size - dp_width - 1 - width_cnt - 1] = '0' + ((int)val % 10); val /= 10; } /* スペース処理 */ /* 左詰め処理がある場合 */ if (left_flag == 1) { /* スペース入力幅(全体幅-ピリオド-小数部分幅-整数部分幅,符号も考慮)が存在処理 */ while (o_width - 1 - dp_width - arg_width - sign_flag > 0) { /* スペース入力 */ st[string_size++] = ' '; o_width--; } } } /* 文字 */ else if (*Format == 'c') { char chara = (char)va_arg(ArgList, int); /* 左詰め処理が無ければ数字入力の前に処理 */ if (left_flag == 0) { /* スペース入力処理 */ /* スペース入力幅(全体幅-1文字)が存在 かつ */ /* 0埋め処理なし */ /* 以上の場合スペース入力処理ループ */ while (o_width - 1 > 0 && zero_flag == 0) { /* スペース入力 */ st[string_size++] = ' '; /* 全体幅を減らす */ o_width--; } /* 0入力処理 */ /* 0入力幅(全体幅-1文字)が存在 する場合0入力処理ループ */ while (o_width - 1 > 0) { /* 0入力 */ st[string_size++] = '0'; /* 全体幅を減らす */ o_width--; } } st[string_size++] = chara; /* スペース処理 */ /* 左詰め処理がある場合 */ if (left_flag == 1) { /* スペース幅(全体幅-1文字)が存在すれば処理 */ while (o_width - 1 > 0) { /* スペース入力 */ st[string_size++] = ' '; o_width--; } } } /* 文字列 */ else if (*Format == 's') { char *chara = va_arg(ArgList, char *); char *work = chara; arg_width = 0; while (*work != '\0') { work++; arg_width++; } /* 左詰め処理が無ければ数字入力の前に処理 */ if (left_flag == 0) { /* スペース入力処理 */ /* スペース入力幅(全体幅-文字幅)が存在 かつ */ /* 0埋め処理なし */ /* 以上の場合スペース入力処理ループ */ while (o_width - arg_width > 0 && zero_flag == 0) { /* スペース入力 */ st[string_size++] = ' '; /* 全体幅を減らす */ o_width--; } /* 0入力処理 */ /* 0入力幅(全体幅-文字幅)が存在 する場合0入力処理ループ */ while (o_width - arg_width > 0) { /* 0入力 */ st[string_size++] = '0'; /* 全体幅を減らす */ o_width--; } } for (int16_t width_cnt = 0; width_cnt < arg_width; width_cnt++) { st[string_size++] = chara[width_cnt]; } /* スペース処理 */ /* 左詰め処理がある場合 */ if (left_flag == 1) { /* スペース幅(全体幅-文字幅)が存在すれば処理 */ while (o_width - arg_width > 0) { /* スペース入力 */ st[string_size++] = ' '; o_width--; } } } else { st[string_size++] = *Format; } Format++; } else { st[string_size++] = *Format; Format++; } } va_end(ArgList); st[string_size]='q'; size=string_size; string_size = 0; }