public static bool send_16seg(SegChar[] array, bool padding, SerialPort sp) { // 送信する文字列 SegChar[] SendText = new SegChar[DISPLAY_DIGITS]; // 配列の現在位置 int pos = 0; // パディング文字数 int pad_cnt = 0; // 表示文字が DISPLAY_DIGITS 桁超えたらダメ if (DISPLAY_DIGITS < array.Length) { return(false); } //8文字以下の時にパディングを実施する if (padding) { if (array.Length <= DISPLAY_DIGITS) { // パディング分を計算 // 両端にパディングを付けるので /2している pad_cnt = (DISPLAY_DIGITS - array.Length) / 2; #if DEBUG Console.WriteLine("Padding: " + pos); #endif // 埋める for (int i = 0; i < pad_cnt; i++) { SendText[i] = new SegChar(' '); } } // 文字のスタートはパディング分から pos = pad_cnt; } //ドットは処理しつつ16セグ表示コマンドへ // foreachの部分で"."を" "に変換して、char[]に変化する // ToCharArray()はなくてもtexは暗黙的にcharになるが、明示的に変換を指示している for (int i = 0; i < array.Length; i++) { SendText[pos++] = array[i]; } //後ろも埋める for (int i = pos; i < DISPLAY_DIGITS; i++) { SendText[i] = new SegChar(' '); } // まとめて送信 send_16seg(SendText, sp); return(true); }
private void send_led(string text, bool replace = true) { //表示可能な文字列に整形する if (replace) { Regex re = new Regex(@"[^!%()*+-/<>A-Z0-9]"); text = (re.Replace(text.ToUpper(), " ")); } //フォームに反映 lbl_nowtext.Text = text; Refresh(); SerialOpen(); if (_tokenSource == null) { _tokenSource = new CancellationTokenSource(); } _task = Task.Factory.StartNew(() => { while (true) { Console.WriteLine("while loop"); // TaskのCancelを拾う // Cancelを拾うとOperationCanceledExceptionが発生する try { _tokenSource.Token.ThrowIfCancellationRequested(); } catch (OperationCanceledException) { Console.WriteLine("Cancel Interrupt"); return(true); } // パディングの作成 SegChar[] segPad = new SegChar[DISPLAY_DIGITS]; for (int i = 0; i < segPad.Length; i++) { segPad[i] = new SegChar(' '); } // 入力されたTextのPack var t = text.ToCharArray(); var segList = DisplayUtil.PackInputText(t); // DISPLAY_DIGITS 文字以下はそのまま出していく if (DISPLAY_DIGITS >= segList.ToArray().Length) { Console.WriteLine("send text: " + text); Invoke(new ProgressWriteDelegate(progress_write), text); DisplayUtil.send_16seg(segList.ToArray(), true, serialPort1); return(true); } // DISPLAY_DIGITS 文字以上の場合パディング+テキスト List <SegChar> buf = new List <SegChar>(); buf.AddRange(segPad); buf.AddRange(segList); for (int i = 0; i <= buf.ToArray().Length; i++) { bool isShowExist = false; // for文内でもTaskのCancelを拾う try { _tokenSource.Token.ThrowIfCancellationRequested(); } catch (OperationCanceledException) { Console.WriteLine("Cancel Interrupt"); return(true); } if (i + DISPLAY_DIGITS < buf.ToArray().Length) { // ConvertAllにてList<T>に入っているSegCharクラスのメンバ変数を取ってくる // List<string>で戻ってくるのでstring.join()で繋げる if (isShowExist == false) { string msg = DisplayUtil.ThreadLoop_Send16Seg(buf, i, DISPLAY_DIGITS, serialPort1); Invoke(new ProgressWriteDelegate(progress_write), msg); isShowExist = true; } else // TODO: 確認出来たらelse以下をカット { Console.WriteLine("Skip..."); } } else { string msg = DisplayUtil.ThreadLoop_Send16Seg(buf, i, buf.ToArray().Length - i, serialPort1); Invoke(new ProgressWriteDelegate(progress_write), msg); } Thread.Sleep(1000 - _scrollSpeed); } } }, _tokenSource.Token).ContinueWith(thread_releease); }