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);
        }
Ejemplo n.º 2
0
        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);
        }