「技術」カテゴリーアーカイブ

【C#】【ピクロス】【ALTSEED】実際にサイズを変更する

前回までの状況はこちら。

最新ソースはこちら。(gitHub)

https://github.com/takishita2nd/Picross

前回はサイズ変更ダイアログに数字を入力するところまでできましたので、今回は実際にその数字を反映させる処理を作成していきます。

まずは、ダイアログからROWとCOLを取得する処理を追加します。

class Dialog
{
        public int GetRowValue()
        {
            return int.Parse(_rowValue);
        }

        public int GetColValue()
        {
            return int.Parse(_colValue);
        }

これをダイアログを表示する側で使用します。

        dialog.SetAction(() =>
        {
            dialog.Hide();
            int row = dialog.GetRowValue();
            int col = dialog.GetColValue();
            while(row != drawSquares.Count)
            {
                if(drawSquares.Count > row)
                {
                    var rowList = drawSquares[drawSquares.Count - 1];
                    foreach(var c in rowList)
                    {
                        asd.Engine.RemoveObject2D(c.getBackTexture());
                    }
                    drawSquares.RemoveAt(drawSquares.Count - 1);
                }
                else
                {
                    List<DrawSquare> rowList = new List<DrawSquare>();
                    for (int c = 0; c < drawSquares[0].Count; c++)
                    {
                        var square = new DrawSquare(drawSquares.Count, c);
                        asd.Engine.AddObject2D(square.getBackTexture());
                        rowList.Add(square);
                    }
                    drawSquares.Add(rowList);
                }
            }
            while(col != drawSquares[0].Count)
            {
                if(drawSquares[0].Count > col)
                {
                    foreach(var r in drawSquares)
                    {
                        asd.Engine.RemoveObject2D(r[r.Count - 1].getBackTexture());
                        r.RemoveAt(r.Count - 1);
                    }
                }
                else
                {
                    int rowindex = 0;
                    int colindex = drawSquares[0].Count;
                    foreach (var r in drawSquares)
                    {
                        var square = new DrawSquare(rowindex, colindex);
                        asd.Engine.AddObject2D(square.getBackTexture());
                        r.Add(square);
                        rowindex++;
                    }
                }
            }
        });

SetAction()には、ダイアログでOKをクリックしたときに実行される処理をラムダ式で記述しています。

ダイアログを非表示にすると同時にROW、COLを取得し、その値に合わせて実際のピクロスのサイズを変更します。

ROWの値を変えると縦方向にマスが増えたり減ったり、COLの値を変えると横方向に、という感じです。

これはまずはROW、COLが増えたかどうかを判断し処理を変える必要があります。

ROWを変える場合は、マスのLISTオブジェクト

List<List<DrawSquare>> drawSquares

これの一番外のLISTを追加、削除します。

COLを変える場合は内側のLISTにオブジェクトを追加、削除します。

あと、実際に動かしてみて分かったのですが、エンジンにテクスチャなどのオブジェクトを追加する順番によって表示に影響が出る(後に追加した方が上に上書きされる)ので、

それを防ぐために、テクスチャの描画プライオリティを設定する必要がありました。

今回は

マスオブジェクト<<<<<ダイアログ<<パレット

の順番にプライオリティを設定しました。

動作結果はこうなりました。

ようやくここまで来たかって感じです。

次回はピクロス解析のカギとなる数字を入力する部分を作成していきます。

【ラズパイ】ネットワークでデータを送信する。

こんな感じで、ラズパイのデータをWindows PCへ送信させたいと思います。

ラズパイ側はPythonでHATのセンサーにアクセスしているので、Pythonで送信を行います。

Windows側は、言語は何でも良いのですが、今回はC#で書こうと思います。

とりあえず、今回は通信ができるところまでを確認します。

ラズパイ側のソースはこんな感じ。

import json
import urllib.request

url = 'http://192.168.1.3:8000'
data = {
    'foo': 123,
}
headers = {
    'Content-Type': 'application/json',
}

req = urllib.request.Request(url, json.dumps(data).encode(), headers)
with urllib.request.urlopen(req) as res:
    body = res.read()

こちらのソースコードを丸パクリです。

https://qiita.com/hoto17296/items/8fcf55cc6cd823a18217

Windows側のコードはこんな感じです。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace http_server
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                HttpListener listener = new HttpListener();
                listener.Prefixes.Add("http://192.168.1.3:8000/");
                listener.Start();
                while (true)
                {
                    HttpListenerContext context = listener.GetContext();
                    HttpListenerRequest req = context.Request;
                    StreamReader reader = new System.IO.StreamReader(req.InputStream, req.ContentEncoding);
                    string s = reader.ReadToEnd();
                    Console.WriteLine(s);
                    HttpListenerResponse res = context.Response;
                    res.StatusCode = 200;
                    byte[] content = Encoding.UTF8.GetBytes("HELLO");
                    res.OutputStream.Write(content, 0, content.Length);
                    res.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
        }
    }
}

ホントにデータを送受信するだけのコードで、エラーとかは全く考慮していません。

Windows側のプログラムを先に実行し、その後ラズパイのコードを実行すると、Windows側のコンソールにこんな感じで出力されます。

これをカスタマイズすればセンサーの情報もWindows PCに送信できそうです。

【C#】【ピクロス】【ALTSEED】パレットから数字を入力する

前回までの状況はこちら。

最新ソースはこちら。(gitHub)

https://github.com/takishita2nd/Picross

パレットの数字をクリックすることでダイアログの数字を入力する処理を作っていきます。

主にDialogクラスの実装です。

class Dialog
{
    private string _rowValue = "10";
    private string _colValue = "10";
    private TextBox _selectedTextBox = null;
    private string _selectedValue = string.Empty;

        public void OnClick(asd.Vector2DF pos)
        {
            if (_palette.IsShow() == false)
            {
                if (_rowText.isClick(pos))
                {
                    _selectedTextBox = _rowText;
                    _selectedValue = _rowValue;
                    _palette.Show(pos);
                }
                if (_colText.isClick(pos))
                {
                    _selectedTextBox = _colText;
                    _selectedValue = _colValue;
                    _palette.Show(pos);
                }
                if (_button.isClick(pos))
                {
                    _button.OnClick();
                }
            }
            else
            {
                if (_palette.IsClick(pos))
                {
                    string v = _palette.GetClickValue(pos);
                    _selectedValue = updateTextValue(_selectedTextBox, _selectedValue, v);
                    if (_selectedTextBox.Equals(_rowText))
                    {
                        _rowValue = _selectedValue;
                    }
                    else
                    {
                        _colValue = _selectedValue;
                    }
                }
                else
                {
                    _palette.Hide();
                    _selectedTextBox = null;
                    _selectedValue = string.Empty;
                }
            }
        }

        private string updateTextValue(TextBox textBox, string value, string v)
        {
            string text = string.Empty;
            switch (v)
            {
                case Palette.CODE.BS:
                    if(value.Length != 0)
                    {
                        text = value.Remove(value.Length - 1);
                    }
                    break;
                case Palette.CODE.CLR:
                    text = string.Empty;
                    break;
                default:
                    if(value.Length < 2)
                    {
                        text = value + v;
                    }
                    else
                    {
                        text = value;
                    }
                    break;
            }
            textBox.SetText(text);
            return text;
        }
    }

テキストボックスがROWとCOLの二つがあるので、テキストボックスをクリックしたときに、どちらをクリックしたかを記憶しておきます。

パレットがクリックされた場合、何がクリックされたかをパレットから取得します。

その値を確認し、その数字をテキストボックスの値に文字列追加していきます。

しかし、今のところ、数字は2桁までとしておきます。

なので、桁が2桁オーバーしたり、0桁以下にならないようにガードかけておきます。

あ、0を入力できないや。

次回までに修正しておきまーす。

【ラズパイ】気圧計

こちらの記事を翻訳してみました。

https://github.com/raspberrypilearning/astro-pi-guide/blob/master/sensors/pressure.md

高度8000mを越えると人体に危険ゾーンになるらしい。エベレストの山頂がこのエリアになる。

18900mを越えると、人体の血液が沸騰する(アームストロング線と言うらしい。)

上の記事を見てみると、ラズパイをバッテリーで稼働させて、ペットボトルの中に入れて、その中に息を入れたり出したりして気圧を変える、ということをやっているんですが、

そもそもラズパイ4の電源に対応出来るバッテリーが手元にありません。

3A必要なんですが、今手元にあるのは、iPhoneに対応する2.4Aが限界です。

いや、探せばあるんだろうけどさ。

お金が・・・

【ラズパイ】ジョイスティックを使ってみる。

こちらの記事を参考にしています。

https://github.com/raspberrypilearning/astro-pi-guide/blob/master/inputs-outputs/joystick.md

サンプルプログラムを少しアレンジしています。

from sense_hat import SenseHat
sense = SenseHat()
sense.clear()

x, y = 0, 0
clear = [0, 0, 0]
colours = [[255,0,0], [0,255,0], [0,0,255], [255,255,0], [255,0,255], [0,255,255]]
colour = 0
sense.set_pixel(x, y, colours[colour])

while True:
    for event in sense.stick.get_events():
        #print(event.direction, event.action)
        sense.set_pixel(x, y, colours[colour])
        if event.action == 'pressed' and event.direction == 'up':
            if y > 0:
                sense.set_pixel(x, y, clear)
                y -= 1
                sense.set_pixel(x, y, colours[colour])
        if event.action == 'pressed' and event.direction == 'down':
            if y < 7:
                sense.set_pixel(x, y, clear)
                y += 1
                sense.set_pixel(x, y, colours[colour])
        if event.action == 'pressed' and event.direction == 'right':
            if x < 7:
                sense.set_pixel(x, y, clear)
                x += 1
                sense.set_pixel(x, y, colours[colour])
        if event.action == 'pressed' and event.direction == 'left':
            if x > 0:
                sense.set_pixel(x, y, clear)
                x -= 1
                sense.set_pixel(x, y, colours[colour])
        if event.action == 'pressed' and event.direction == 'middle':
            colour += 1
            if colour == len(colours):
                colour = 0
            sense.set_pixel(x, y, colours[colour])

これを実行すると、8×8のLEDディスプレイに1ドットの点が現れ、スティックを倒した方向に点が移動し、ジョイスティックを押すと、色が変わります。

そろそろできることが限られてきたので、次回はちょっとIoTっぽいことをしましょうかね。

【C#】【ピクロス】【ALTSEED】数字入力パレットの作成

前回までの状況はこちら。

最新ソースはこちら。

https://github.com/takishita2nd/Picross

サイズ変更ダイアログのテキストボックスをクリックすると、数字を入力するパレットを表示させます。

パレット自体は数独のときのものを流用します。

デザインを少し変更しています。

数独では「×」を表示していた部分を「←」(1文字消す)、「C」(全部消す)に置き換えます。

class Palette
{
    public class CODE
    {
        public const string BS = "BS";
        public const string CLR = "CLR";
    }

    private asd.Vector2DF palettePosition;
    private const int width = 192;
    private const int height = 256;
    private asd.TextureObject2D _texture;
    SquareObject[,] paletteSquareObjects = new SquareObject[3, 3];
    SquareObject paletteBSSquareObject = new SquareObject(-1, 0, "←");
    SquareObject paletteCRSquareObject = new SquareObject(-1, 1, "C");
    private bool _isShow = false;

    public Palette()
    {
        _texture = new asd.TextureObject2D();
        int value = 1;
        for (int row = 0; row < 3; row++)
        {
            for (int col = 0; col < 3; col++)
            {
                paletteSquareObjects[row, col] = new SquareObject(row, col, value.ToString());
                value++;
            }
        }
        paletteBSSquareObject.SetFontOffset(14, 9);
        paletteCRSquareObject.SetFontOffset(10, 9);
    }

    public void SetEngine()
    {
        asd.Engine.AddObject2D(_texture);
        for (int row = 0; row < 3; row++)
        {
            for (int col = 0; col < 3; col++)
            {
                asd.Engine.AddObject2D(paletteSquareObjects[row, col].getBackTexture());
                asd.Engine.AddObject2D(paletteSquareObjects[row, col].getTextObject());
            }
        }
        asd.Engine.AddObject2D(paletteBSSquareObject.getBackTexture());
        asd.Engine.AddObject2D(paletteBSSquareObject.getTextObject());
        asd.Engine.AddObject2D(paletteCRSquareObject.getBackTexture());
        asd.Engine.AddObject2D(paletteCRSquareObject.getTextObject());
    }

    public void Show(asd.Vector2DF pos)
    {
        palettePosition = new asd.Vector2DF(pos.X, pos.Y - 64);
        _texture.Position = palettePosition;
        _texture.Texture = Resource.getPaletteTexture();
        for (int row = 0; row < 3; row++)
        {
            for (int col = 0; col < 3; col++)
            {
                paletteSquareObjects[row, col].SetPosition(pos);
                paletteSquareObjects[row, col].Show();
            }
        }
        paletteBSSquareObject.SetPosition(pos);
        paletteBSSquareObject.Show();
        paletteCRSquareObject.SetPosition(pos);
        paletteCRSquareObject.Show();
        _isShow = true;
    }

    public void Hide()
    {
        for (int row = 0; row < 3; row++)
        {
            for (int col = 0; col < 3; col++)
            {
                paletteSquareObjects[row, col].Hide();
            }
        }
        paletteBSSquareObject.Hide();
        paletteCRSquareObject.Hide();
        _texture.Texture = null;
        _isShow = false;
    }

    public bool IsShow()
    {
        return _isShow;
    }

    public bool IsClick(asd.Vector2DF pos)
    {
        if (pos.X > palettePosition.X && pos.X < palettePosition.X + width
            && pos.Y > palettePosition.Y && pos.Y < palettePosition.Y + height)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public void UpdateTexture(asd.Vector2DF pos)
    {
        for (int row = 0; row < 3; row++)
        {
            for (int col = 0; col < 3; col++)
            {
                paletteSquareObjects[row, col].UpdateTexture(pos);
            }
        }
        paletteBSSquareObject.UpdateTexture(pos);
        paletteCRSquareObject.UpdateTexture(pos);
    }

    public string GetClickValue(asd.Vector2DF pos)
    {
        for (int row = 0; row < 3; row++)
        {
            for (int col = 0; col < 3; col++)
            {
                if (paletteSquareObjects[row, col].isClick(pos) == true)
                {
                    return paletteSquareObjects[row, col].GetValue();
                }
            }
        }
        if (paletteBSSquareObject.isClick(pos))
        {
            return CODE.BS;
        }
        if (paletteBSSquareObject.isClick(pos))
        {
            return CODE.CLR;
        }

        return string.Empty;
    }
}
class SquareObject : ObjectBase
{
    public enum FontColor
    {
        Black,
        Red
    }

    protected int _row;
    protected int _col;
    private string _value;
    protected const int offsetX = 10;
    protected const int offsetY = 10;
    protected int fontOffsetX = 19;
    protected int fontOffsetY = 9;

    public SquareObject(int row, int col, string val)
    {
        width = 64;
        height = 64;
        _row = row;
        _col = col;
        _value = val;
        _x = col * width + offsetX;
        _y = row * height + offsetY;

        _backTexture = new asd.TextureObject2D();
        _backTexture.Position = new asd.Vector2DF(_x, _y);

        _valueText = new asd.TextObject2D();
        _valueText.Font = Resource.getPaletteFont();
        _valueText.Position = new asd.Vector2DF(_x + fontOffsetX, _y + fontOffsetY);

    }

    public void SetPosition(asd.Vector2DF pos)
    {
        _x = _col * width + (int)pos.X;
        _y = _row * height + (int)pos.Y;

        _backTexture.Position = new asd.Vector2DF(_x, _y);
        _valueText.Position = new asd.Vector2DF(_x + fontOffsetX, _y + fontOffsetY);
    }

    public void SetFontOffset(int x, int y)
    {
        fontOffsetX = x;
        fontOffsetY = y;
    }

    public void Show()
    {
        _valueText.Text = _value;
    }

    public void Hide()
    {
        _backTexture.Texture = null;
        _valueText.Text = "";
    }

    public void UpdateTexture(asd.Vector2DF pos)
    {
        if (pos.X > _x && pos.X < _x + width
            && pos.Y > _y && pos.Y < _y + height)
        {
            _backTexture.Texture = Resource.getPaletteSquareTexture();
        }
        else
        {
            _backTexture.Texture = null;
        }
    }

    public string GetValue()
    {
        return _value;
    }

    public void SetFontColor(FontColor color)
    {
        switch (color)
        {
            case FontColor.Black:
                _valueText.Font = Resource.getPaletteFont();
                break;
            case FontColor.Red:
                _valueText.Font = Resource.getFontRed();
                break;
            default:
                break;
        }
    }
}

あと、数字を表示するマスと数字以外を表示するマスとでクラスを分けていましたが、今回は同じクラスでやります。

class Dialog
{
    private Palette _palette = null;

    public Dialog()
    {
        _isShow = false;
        _palette = new Palette();
        _palette.Hide();

        // 確定ボタン
        _button = new Button(436, 400, "確定");
        _button.SetFontOffset(46, 4);
        _button.SetAction(() =>
        {
            if(_action != null)
            {
                _action.Invoke();
            }
        });
        // ラベル
        _label1 = new Label(320, 330, "↓");
        _label2 = new Label(490, 330, "→");
        // Row入力エリア
        _rowText = new TextBox(350, 330, "0");
        // Col入力エリア
        _colText = new TextBox(520, 330, "0");

        _texture = new asd.TextureObject2D();
        _texture.Position = new asd.Vector2DF(_x, _y);
    }

    public void SetEngine()
    {
        asd.Engine.AddObject2D(_texture);
        asd.Engine.AddObject2D(_label1.getTextObject());
        asd.Engine.AddObject2D(_label2.getTextObject());
        asd.Engine.AddObject2D(_rowText.getBackTexture());
        asd.Engine.AddObject2D(_rowText.getTextObject());
        asd.Engine.AddObject2D(_colText.getBackTexture());
        asd.Engine.AddObject2D(_colText.getTextObject());
        asd.Engine.AddObject2D(_button.getBackTexture());
        asd.Engine.AddObject2D(_button.getTextObject());
        _palette.SetEngine();
    }

    public void UpdateTexture(asd.Vector2DF pos)
    {
        if (_palette.IsShow())
        {
            _palette.UpdateTexture(pos);
        }
        else
        {
            _rowText.UpdateTexture(pos);
            _colText.UpdateTexture(pos);
            _button.UpdateTexture(pos);
        }
    }

    public void OnClick(asd.Vector2DF pos)
    {
        if (_palette.IsShow() == false)
        {
            if (_rowText.isClick(pos))
            {
                _palette.Show(pos);
            }
            if (_colText.isClick(pos))
            {
                _palette.Show(pos);
            }
            if (_button.isClick(pos))
            {
                _button.OnClick();
            }
        }
        else
        {
            if (_palette.IsClick(pos))
            {

            }
            else
            {
                _palette.Hide();
            }
        }
    }
}

動作はこんなかんじになりました。

【ラズパイ】湿度計を使ってみる。

この記事をもとに調べてみました。

https://github.com/raspberrypilearning/astro-pi-guide/blob/master/sensors/humidity.md

英語を翻訳してみると、

湿度には、絶対湿度と相対湿度がありまして、

絶対湿度は大気中に含まれる水分の総量。

相対湿度は、大気中に最大まで含むことができる水分量に対する、現在の水分量の割合を表します。

大気中に含むことができる水分量の最大値は温度によって変わりますので、相対湿度を図るには温度計も内蔵されています。

ちなみに、我々が一般的に湿度と呼んでいるのは相対湿度のほうで、単位は%です。

これはもうやっているからいいや。

【ラズパイ】LEDディスプレイで温度を表示する

どうせならLEDディスプレイを利用したいので、LEDディスプレイで温度を表したいと思います。

イメージとしては、左上から1℃上がることにLEDが一個点灯するような感じです。

コードはこうなりました。

import time
from sense_hat import SenseHat
sense = SenseHat()
sense.clear()

while True:
    temp = int(sense.get_temperature())
    print(temp)
    y = temp // 8
    x = temp % 8
    for dy in range(0, y + 1):
        if dy < y:
            for dx in range(0, 8):
                sense.set_pixel(dx, dy, 255, 0, 0)
        else:
            for dx in range(0, 8):
                sense.set_pixel(dx, dy, 0, 0, 0)
            for dx in range(0, x):
                sense.set_pixel(dx, dy, 255, 0, 0)
    #time.sleep(1)

最初は36℃ぐらいあった温度ですが、うちわで扇いで風を送ることにより、31℃ぐらいまで下げています。

しかし、ラズパイの温度上昇は仕方が無いとして、それに影響される温度計って、使いづらくない??

【C#】【ピクロス】【ALTSEED】サイズ変更ダイアログのUIを作成

前回までの状況はこちら。

最新ソースはこちら。

https://github.com/takishita2nd/Picross

サイズ変更ダイアログにラベルとテキストボックスを追加します。

これらは新規クラスですね。

なので、ラベルクラスとテキストボックスクラスを作成します。

class Label : ObjectBase
{
    private string _text;
    private int fontOffsetX = 9;
    private int fontOffsetY = 4;
    private bool _isShow = false;

    public Label(int x, int y, string text)
    {
        width = 128;
        height = 32;
        _x = x;
        _y = y;
        _text = text;

        _valueText = new asd.TextObject2D();
        _valueText.Text = _text;
        _valueText.Font = null;
        _valueText.Position = new asd.Vector2DF(_x + fontOffsetX, _y + fontOffsetY);
    }

    public void SetFontOffset(int x, int y)
    {
        fontOffsetX = x;
        fontOffsetY = y;
        _valueText.Position = new asd.Vector2DF(_x + fontOffsetX, _y + fontOffsetY);
    }

    public void Show()
    {
        _isShow = true;
        _valueText.Font = Resource.getFont();
    }

    public void Hide()
    {
        _isShow = false; ;
        _valueText.Font = null;
    }
}
class TextBox : ObjectBase
{
    private string _text;
    private int fontOffsetX = 9;
    private int fontOffsetY = 4;
    protected bool enable = true;
    private Action _action = null;
    private bool _isShow = false;

    public TextBox(int x, int y, string text)
    {
        width = 128;
        height = 32;
        _x = x;
        _y = y;
        _text = text;

        _backTexture = new asd.TextureObject2D();
        _backTexture.Position = new asd.Vector2DF(_x, _y);

        _valueText = new asd.TextObject2D();
        _valueText.Text = _text;
        _valueText.Font = null;
        _valueText.Position = new asd.Vector2DF(_x + fontOffsetX, _y + fontOffsetY);
    }

    public void SetFontOffset(int x, int y)
    {
        fontOffsetX = x;
        fontOffsetY = y;
        _valueText.Position = new asd.Vector2DF(_x + fontOffsetX, _y + fontOffsetY);
    }

    public void UpdateTexture(asd.Vector2DF pos)
    {
        if (pos.X > _x && pos.X < _x + width
            && pos.Y > _y && pos.Y < _y + height)
        {
            _backTexture.Texture = Resource.getSelectedTextTexture();
        }
        else
        {
            _backTexture.Texture = Resource.getTextTexture();
        }
    }

    public void Show()
    {
        _isShow = true;
        _backTexture.Texture = Resource.getTextTexture();
        _valueText.Font = Resource.getFont();
    }

    public void Hide()
    {
        _isShow = false; ;
        _backTexture.Texture = null;
        _valueText.Font = null;
    }

    public void SetAction(Action action)
    {
        _action = action;
    }

    public void SetEnable(bool enable)
    {
        this.enable = enable;
    }

    public virtual void OnClick()
    {
        if (enable)
        {
            if (_action != null)
            {
                _action.Invoke();
            }
        }
    }
}

OnClick処理は後々修正するかもしれない。

そして、ほとんどはButtonクラスのアレンジ。

これをDialogクラスで使用します。

class Dialog
{
    private asd.TextureObject2D _texture;
    private bool _isShow;
    private Button _button = null;
    private TextBox _rowText = null;
    private TextBox _colText = null;
    private Label _label1 = null;
    private Label _label2 = null;
    private int _x = 300;
    private int _y = 300;
    private int _width = 400;
    private int _height = 200;
    private Action _action = null;

    public Dialog()
    {
        _isShow = false;

        // 確定ボタン
        _button = new Button(436, 400, "確定");
        _button.SetFontOffset(46, 4);
        _button.SetAction(() =>
        {
            if(_action != null)
            {
                _action.Invoke();
            }
        });
        // ラベル
        _label1 = new Label(320, 330, "↓");
        _label2 = new Label(490, 330, "→");
        // Row入力エリア
        _rowText = new TextBox(350, 330, "0");
        // Col入力エリア
        _colText = new TextBox(520, 330, "0");

        _texture = new asd.TextureObject2D();
        _texture.Position = new asd.Vector2DF(_x, _y);
    }

    public void SetEngine()
    {
        asd.Engine.AddObject2D(_texture);
        asd.Engine.AddObject2D(_label1.getTextObject());
        asd.Engine.AddObject2D(_label2.getTextObject());
        asd.Engine.AddObject2D(_rowText.getBackTexture());
        asd.Engine.AddObject2D(_rowText.getTextObject());
        asd.Engine.AddObject2D(_colText.getBackTexture());
        asd.Engine.AddObject2D(_colText.getTextObject());
        asd.Engine.AddObject2D(_button.getBackTexture());
        asd.Engine.AddObject2D(_button.getTextObject());
    }

    public void SetAction(Action action)
    {
        _action = action;
    }

    public void Show()
    {
        _isShow = true;
        _texture.Texture = Resource.getDialogTexture();
        _label1.Show();
        _label2.Show();
        _rowText.Show();
        _colText.Show();
        _button.Show();
    }

    public void Hide()
    {
        _isShow = false;
        _texture.Texture = null;
        _label1.Hide();
        _label2.Hide();
        _rowText.Hide();
        _colText.Hide();
        _button.Hide();
    }

    public bool IsShow()
    {
        return _isShow;
    }

    public void UpdateTexture(asd.Vector2DF pos)
    {
        _rowText.UpdateTexture(pos);
        _colText.UpdateTexture(pos);
        _button.UpdateTexture(pos);
    }

UI自分で作るのってめんどくさいね。

こんなのもう二度とやらない。

【ラズパイ】温度計などを使用してみる

最新ソースを置きました(gitHub)。

https://github.com/takishita2nd/pi

下段の左から温度、気圧、湿度です。

温度が38℃と灼熱になっていますが、

うちわで扇いだら33℃下がりました。

ラズパイ本体が熱くなっているんでしょう。

温度計の説明はこちらにあります。

https://github.com/raspberrypilearning/astro-pi-guide/blob/master/sensors/temperature.md

英語だよ。

単位は℃で、-40℃~120℃まで計れるみたいです。

温度でLEDの色を変えるとかやってみようかな。