Kamuycikap - SentenceDataBase

日々の勉強の記録を気分で書き綴るブログ

MX Linux 18のファイラ活用

MX Linux 18 標準の「Thunar 1.6.15」を試す

今まで、zshのfindコマンドなどで、ファイル操作を行っていた為、GUIに疎くなってしまった自分がいます。
しかし、昨今では便利にGUIを使う文化もLinuxでは当たり前になっているわけですし、そういうのも勉強しとかないと。
と、言うわけで、MX Linux 18に標準搭載されているファイラの中から、Thunar 1.6.15を取り上げます。

結論から書きますと、とても直感的でわかりやすいアプリです。
コマンドプロンプトとお上手に使い分けると良いですね。

ファイルの表示

起動は、MXメニューからです。
ファイルやフォルダの表示は、よくある一覧表示ですね。

f:id:kamuycikap:20190310223833p:plain
ファイル表示画面

画面左側のペインは、フォルダのツリー表示か、よく使うフォルダのショートカットかを選択できるようになっています。

f:id:kamuycikap:20190310224102p:plain
細かな表示設定

隠しファイルの表示や表示する項目の粒度なども選択できます。
このあたりは、Windowsのファイラーを触っている人であれば理解できる項目ではないでしょうか。
私は、ショートカット派です。

ファイル検索

Thunar 1.6.15のファイル検索ですが、別プログラムとの連携で実現しています。
検索を開始したいトップのフォルダを表示し、「ファイル」→「File find here」を選択すると、検索アプリが起動します。

f:id:kamuycikap:20190310225054p:plain
検索アプリの起動

すると、catfishというアプリが起動します。
catfishはMXメニューから単体で起動もできますが、Thunar 1.6.15と連携することでさらなる威力を発揮できます。

f:id:kamuycikap:20190310225322p:plain
catfishが起動したところ

上記画像では、拡張子「.el」のファイルを検索していますが、800ファイルをヒットさせるのに3秒もかかっていません。
もちろんマシンスペックにもよりますが、私のマシンはSSDをセットしているとはいえLenovoX220という型落ちのノートパソコンです。
catfishは思いのほか高速にファイルを検索してくれます。

検索結果に表示されたファイルのコピー

catfishでファイルを検索した後、検索したファイルをコピーしたいですよね?!
これも簡単で、catfishの検索結果に表示されているファイルを、Thunar 1.6.15にドラッグ・アンド・ドロップするだけです。

検索結果に表示されたファイルを複数コピー

予め、Thunar 1.6.15を操作し、catfishに表示されているファイルをコピーする、対象フォルダを表示しておきます。
catfishの検索結果をクリックし、SHIFTキー または Ctrlキーで、検索結果欄のファイルを複数選択します。
選択した後、ファイルのどれかを、Thunar 1.6.15の画面にドラッグ・アンド・ドロップするだけです。
ドラッグ・アンド・ドロップの最中は、マウス操作しているファイルひとつだけしか画面表示されませんが、ドロップ後に選択したすべてのファイルが表示されるはずです。

検索結果を全てコピー

これは少し悩みました。
操作の方法が少し特殊ですが、できないわけではありません。
CtrlキーとSHIFTキーによる複数選択コピーは、特に問題なくできたのですが、検索結果の全ファイルコピーはひと手間が必要です。

Ctrl+Aで、catfishの検索結果ファイルを全て選択できるのですが、それをドラッグ・アンド・ドロップしてもコピーされません。
このあたりは今後改善されると思いますが、何か手はなかろうかと試行錯誤し導き出したのがこちらの操作です。
  ↓↓↓
1.検索結果の先頭ファイルをクリック
2.検索結果の最後尾ファイルをSHIFTキーを押しながらクリック
  ※検索結果の全ファイル名が選択された状態になる
3.ドラッグ・アンド・ドロップで目的のフォルダへ

ファイルの圧縮解凍やアプリケーションの実行

Thunar 1.6.15の画面上に表示されているアプリケーションファイルなど、実行可能ファイルについてもマウス操作で可能です。

操作はWindowsと変わりません。
右クリックから「実行」です。
もちろん、アプリケーションを選択して開くことも可能です。

f:id:kamuycikap:20190310231328p:plain
ファイルの実行

ファイルの圧縮などもできますので、Windowsのファイラと何ら変わらない操作感覚で作業をすすめることができます。

必要最低限の機能とLinuxならではの連携

Thunar 1.6.15を使ってみて感じたことは、Linuxならではのシンプルな考え方がとても心地よいファイラーだと言うことです。
必要最低限の機能でわかりやすく設計されており、機能を付け足したい場合は、その機能に特化したアプリケーションと連携させます。

Windowsアプリのように、一つのアプリケーションの中に多くの機能を内包する設計も間違ってはないと思いますが、必要な機能を自分の好みでつけたり外したりできるのは、Unix文化の中から生まれてきたLinuxならではの良いところではないでしょうか。
具体的には、検索機能はcatfishとの連携で実現しているわけですが、catfish以外のお気に入りの検索アプリと連携させることもできるのです。

動作も軽快ですし、ネットワーク越しのPCドライブやNASにも接続できます。
コマンドプロンプトになれない時は、Thunar 1.6.15を試してみても良いのではないでしょうか。

MX Linux 18 にVMWare Workstation Player 15 をインストール

MX Linux 18上で動作しました!

話題のMX Linux 18ネタです。
今回はVMWare Workstation Player 15をインストールしてみます。

結果、解決できない問題があるものの、VMWare上でWindows7が起動しています。
どなたか同じ問題に遭遇し、解決している方がいらっしゃいましたら、情報共有して頂けるとありがたいです。

マシンスペック

私のマシンスペックはこちら。
PC → Lenovo X220
メモリ → 8GB
HDD → 120GBのSSDに換装済み

1.VMWareのダウンロード

こちらURLにアクセスし、Linux版をダウンロード。
VMware Workstation Player のダウンロード | VMware
特に問題なくダウンロードできます。

2.インストール

Linuxバージョンの場合、ダウンロードしたファイルに実行権限を与えてあげなければなりません。

$ sudo chmod 755 ./VMware-Player-15.0.2-10952284.x86_64.bundle

その後、root権限でダウンロードしたファイルを実行します。

$ sudo chmod 755 ./VMware-Player-15.0.2-10952284.x86_64.bundle

ここからはGUIの画面でウィザード形式によるインストール作業になります。
何か特別に注意することはなく、次へ次へで進んでいきます。
※画面は・・・割愛w

インストールが無事に完了したか否かを、インストール後に確認

$ sudo ./VMware-Player-15.0.2-10952284.x86_64.bundle -l
Extracting VMware Installer...done.
[AppLoader] Use shipped Linux kernel AIO access library.
An up-to-date "libaio" or "libaio1" package from your system is preferred.
Product Name         Product Version     
==================== ====================
vmware-player        15.0.2.10952284 

3.VMWare Workstation Player 15の起動

起動はMXメニューから行います。

f:id:kamuycikap:20190308072832p:plain
下部にある検索欄にvmと入力するとすぐに出現

 

4.バーチャルマシンの作成

バーチャルマシンを作成するには、「Create New Virtual Machine」をクリックします。
このあたりの操作については、他のサイトにたくさん実例があるので・・・省略w

f:id:kamuycikap:20190308073353p:plain
バーチャルマシン作成

5.VMWareサービスの再起動

ここが、解決できていない問題点になります。
通常、バーチャルマシンを作成し、OSのインストールが完了すれば、問題なく起動できるはずなんですが、なぜかエラーが表示されます。

f:id:kamuycikap:20190308073602p:plain
バーチャルマシン起動時のエラー

この問題を解決するため、ターミナルで下記のコマンドを実行する必要があります。

$ sudo service vmware restart 

バーチャルマシンのPowerON前に実行すれば問題解決です。

もしもアンインストールしたいときは?

アンインストールしたいときはどうすればいいのか、調べるのにちょっと時間かかりました。
アンインストールは、ターミナル上のコマンドで行います。
ダウンロードしたインストーラーで行うようですね。

$ sudo ./VMware-Player-15.0.2-10952284.x86_64.bundle --uninstall-component=vmware-player

MX Linux 18をカスタマイズ

先人の知恵を拝借しながらカスタマイズです。

ターミナルの背景を透明に

ターミナルの設定を変えようとすると、現在のウィンドウマネージャでは対応していないと怒られた。
Google先生に聞きながらカスタマイズ。
どうも、ウィンドウマネージャの設定を触らなければ、ウィンドウの背景を半透明にする効果が有効にならないらしい。

「MX メニュー」→「MX ツール」→「MX Tweak」→「Compositorタブ」→「xfwm」を選択
さらに
「xfm Setting」をクリックし、下記の画像のようにチェック。
ちなみに、「show shadows under dock window」にチェックを入れると、後でインストールするランチャーのPlankに、妙な線が入ってしまうので外しています。

f:id:kamuycikap:20190220221731p:plain
MX Tweak
f:id:kamuycikap:20190220221804p:plain
xfm Setting

ランチャー(Plank)を入れる

Mintでも使っていた軽量ランチャーの「Plank」
非常にシンプルで使いやすい。
シェルスクリプトを登録できないのがたまにキズだけれど、特に問題なし。

「MX メニュー」→「MX パッケージインストーラー」でパッケージンストーラーを起動。
パッケージインストーラーの右上あたりにある検索窓に「plank」と入力すると、中央の白い部分に、Plankが表示される。
Plankにチェックを入れて、インストール。

f:id:kamuycikap:20190220223435p:plain
Plank Install

GUI操作で設定画面を出すには、Plankの左端か右端までマウスポインターを動かし、右クリックしなければならないのですが、
設定画面の出し方がちょっと面倒なので、ターミナルから設定画面を出すのが案外楽ちんです。

$ plank --preferences

このコマンドで設定画面が出てきます。

ウィンドウマネージャをカスタマイズ

ウィンドウの外観など、自分の好みにしてみる。

「MX メニュー」→「設定」→「ウィンドウマネージャー」

f:id:kamuycikap:20190220235423p:plain
Window Manager

Conkyでシステムモニタを表示

 百聞は一見にしかず。
 

f:id:kamuycikap:20190223102436p:plain
画面右端にシステムモニタを表示

 CPUの負荷状況やメモリの使用量、ネットワーク通信料などなどの情報を画面上に表示してくれます。
 近未来的な感じが好きです。

 「MX メニュー」→「MX ツール」→「SetupグループにあるMX Conky」→ 「Conky Manager」
 この手順で表示されるウィンドウの「Widget」タブに、たくさんの種類が登録されています。
 お好みのConkyで気分をワクワクさせて楽しめそうです。

触っていて楽しい

 カスタマイズを楽しめるのもLinuxの特徴ではないでしょうか。
 星の数ほどディストリビュージョンがあるLinuxならではの楽しみだと思っています。

 中量級のディストリビュージョンとの事ですが、あれこれとウィンドウを操作していてもかなり軽快です。
 この記事では、基本的なことだけを記載しましたが、パネルの設定やショートカットの設定など、他にもたくさんのカスタムポイントがあります。
 まだまだ楽しめそうです。
 

MX Linux 18 をインストールしてみた(日本語表示と日本語入力を可能に!)

DistroWatch.com: Put the fun back into computing. Use Linux, BSD.
時々、このサイトで人気のLinuxディストリビューションをチェックしているんですが、ここ最近で人気急上昇のディストリビュージョンが「MX Linux」。

数年間、不動の1位をキープしていたMintが3位に陥落。
半年間のチェックですと「Manjaro」が1位なんですが、3ヶ月間での順位は「MX Linux」が1位。

暫く、情報量の多いUbuntuやMintを安定して使っていたものの、これは試してみなければ!
噂によると、Googleの音声入力が問題なく動作するのが理由らしいですが、まずはインストールして使用感を試してみる事にしました。

ダウンロード

 ここからダウンロード。
 今回はThinkpad X220へのインストールを実施するので、64bit版を選択する。
 ISO download mirrors – MX Linux

インストール

 いつもならUnetBootinを使ってやるんですが、今回はEtcherを利用。
 balenaEtcher - Home
 USBメモリ(4GB)へisoを焼き込み。

 焼き込み完了後、USBメモリから起動。
 ※X220は、起動時にF12キーを押すことで、起動メディアを選択できる。

 無事に起動画面が表示される。
 この時にとても大切な事が!
 MX Linuxを起動する前に、F2キーで日本語を選択する事と、F3キーでタイムゾーンを東京にしておく事。
 
 F2キーとF3キーで、日本語と東京を選択後に起動。
 インストールの下りは、UbuntuやMintと同じで、USBメモリーから起動するとデスクトップに「Install」のアイコンがあります。

 MX Linuxのインストール情報をGoogleで調べながら行いましたが、紹介されている方法ではインストールできませんでした。
 引っかかったのは、ハードディスクのパーティション作成のくだり。
 きちんとパーティションを作らなければインストールが進みませんでした。
 ※120GBのSSDにインストールする為、10GB程度をswap領域として、残りの110GBをext4で「/」に。
 

日本語フォルダを英語に

 ターミナルを開き、下記のコマンドを入力すると、日本語のフォルダは残ったままになりますが、新たに英語のフォルダが作成されます。
 残った日本語のフォルダは、後で消しても大丈夫。

 LANG=C xdg-user-dirs-update --force

日本語表示情報のインストール

 左下にあるメニュー「MXツール」から「MXパッケージインストーラー」を起動。
 「Poplar Application」タブの一番下にある「Language」を開く。
  
 f:id:kamuycikap:20190217094558p:plain

 Mintを使っていた時に利用していたfcitxを選択。ibusは使いませんでした。
 ibus以外のすべてをチェックして、Installボタンをクリック

日本語入力システムのインストール

 表示の次は入力です。
 日本語入力もMXパッケージインストーラーからインストールします。
 

f:id:kamuycikap:20190217102133p:plain
fcitxの選択
 ※画像はすでにインストールした後にキャプチャしたのでグレーになっています。
 インストール後に再起動すると、日本語入力ができる状態になっています。
 
f:id:kamuycikap:20190217102504p:plain
画面左側にキーボードのアイコンが出現します。

Mozc辞書ツールのインストール

 ここまでで、日本語の入力はできるようになっているものの、単語登録などの機能が不足しています。
 これもMXパッケージインストーラーで簡単に導入可能です。

 

f:id:kamuycikap:20190406132300p:plain
Mozcの設定関連ツールをインストール

 ※画像はすでにインストールした後にキャプチャしたのでグレーになっています。

CapsLockキーをCtrlキーに

 これも、Linux使うならお約束!?でしょうか。
 Emacsを使う人には必須ですね。
 わかってみれば簡単なのですが、結構悩みました。

 まずは、お馴染みのコマンドをラップしたシェルスクリプトを作ります。
 場所は任意です。
 スクリプトの内容はこちら。
  ↓↓↓

 #!/bin/sh

 /usr/bin/setxkbmap -option "ctrl:nocaps"

 その後、MXメニューから「設定」→「セッションと起動」をクリック。
 表示されるウィンドウにて、「自動開始アプリケーション(タブ)」→「+追加」→「名前の入力(好きな名前)」→「説明の入力(適当)」→「コマンド(作成したシェルスクリプトを指定)」と進めます。

 コマンドの登録が無事に終了すると、自動開始アプリケーションの一覧に、登録したシェルスクリプトがあるはずです。
 パソコンをシャットダウンし、再び起動すると、CapslockキーがCtrlキーとして機能しています。

使用感

 ほんのちょっと使ってみただけではありますが、動作はキビキビ。
 個人的には標準ファイラーはMX Linuxの方が使いやすいと感じます。
 MXパッケージインストーラーも直感的で使いやすい。
 ちょっと試す感じでインストールしてみたんですが、暫く使ってみようかと思えるディストリビュージョンです。

Raspbery Pi3 起動時に任意のプログラムを実行

Raspberry Pi 3(RASPBIAN JESSIE)起動時にプログラム実行

jessie起動時に、自分が作ったプログラムを実行する方法。
jessie以前の方法と違っていた。

以下は、自分で作成した実行ファイルを設定しているけれど、シェルスクリプト等の実行ファイルなら何でもOK。

serviceファイルの作成

/etc/systemd/system
ここに、自動実行するための設定ファイルを作成する。
スーパーユーザーで作成。

以下は、実行ファイル「myexec」を実行するための設定ファイル。
実行ファイルは、/home/pi/systemdの中に作成していると仮定。
設定ファイル名は、仮にmyexec.serviceとする。

myexec.service
[Unit]
Description = myexec Service

[Service]
ExecStart=/home/pi/systemd/myexec
Type=simple

[Install]
WantedBy=multi-user.target

Serviceの再起動

$ sudo systemctl daemon-reload

Serviceの状態確認

サービスの起動状態を確認。
サービス名は、作成したサービスファイルから拡張子を外したものになる。

myexec.service → myexec

$ sudo systemctl status myexec

Serviceの開始確認

$ sudo systemctl start myexec

Serviceの停止確認

$ sudo systemctl stop myexec

Serviceの自動起動を設定

$ sudo systemctl enable myexec

Serviceの自動起動を無効化したい時

$ sudo systemctl disable myexec

Raspberry Pi3でCommon LispによるI2C通信

WiringPiライブラリをCommonLispから実行する

こう言うのをバインディングと呼ぶらしいです。
CommonLispにはCFFIと呼ばれる共通の仕組みが用意されていて、C言語で作成されたライブラリを利用できる仕組みが実現されています。

作成した回路

I2Cデバイスとして採用したのは、AdafruitのHT16K33を利用したLEDマトリクスです。
f:id:kamuycikap:20181028012659p:plain

WiringPiのCommonLisp

以下のkpri2c.lispとkmylogo.lispを作成し、kmylogo.lispを実行します。
実行環境は、ClozureCLで検証済み。

無事に実行が完了すると、実行ファイル「kmylogo」ができます。

kmylogo.lispのソースコメントにもありますが、ccl:save-application関数を全てコメントアウトすると、実行ファイルを作りません。
ccl:save-application関数直前にあるmain関数を実行することで、REPL上での実行となります。

kpri2c.lisp
;;;; I2C SPI Lib
(ql:quickload "cffi")


;; パッケージの作成
(defpackage :kpr-i2c
  (:use :common-lisp
        :common-lisp-user
        :cffi)
  (:export :wiring-pi-i2c-setup-interface
           :wiring-pi-i2c-setup
           :wiring-pi-i2c-read
           :wiring-pi-i2c-read8
           :wiring-pi-i2c-read16
           :wiring-pi-i2c-write
           :wiring-pi-i2c-write8
           :wiring-pi-i2c-write16))

(in-package :kpr-i2c)

;; wiringPiのバインディング
(define-foreign-library libwiringPi
  (:unix "libwiringPi.so"))

(use-foreign-library libwiringPi)

;;; C言語ヘッダファイル定義
;; #ifdef __cplusplus
;; extern "C" {
;; #endif

;; extern int wiringPiI2CSetupInterface (const char *device, int devId) ;
;; extern int wiringPiI2CSetup          (const int devId) ;

;; extern int wiringPiI2CRead           (int fd) ;
;; extern int wiringPiI2CReadReg8       (int fd, int reg) ;
;; extern int wiringPiI2CReadReg16      (int fd, int reg) ;

;; extern int wiringPiI2CWrite          (int fd, int data) ;
;; extern int wiringPiI2CWriteReg8      (int fd, int reg, int data) ;
;; extern int wiringPiI2CWriteReg16     (int fd, int reg, int data) ;


;; #ifdef __cplusplus
;; }
;; #endif


;; Core wiringPi functions I2C
(defcfun ("wiringPiI2CSetupInterface" wiring-pi-i2c-setup-interface) :int (device :pointer) (devId :int))
(defcfun ("wiringPiI2CSetup" wiring-pi-i2c-setup) :int (devId :int))

(defcfun ("wiringPiI2CRead" wiring-pi-i2c-read) :int (fd :int))
(defcfun ("wiringPiI2CReadReg8" wiring-pi-i2c-read8) :int (fd :int) (reg :int))
(defcfun ("wiringPiI2CReadReg16" wiring-pi-i2c-read16) :int (fd :int) (reg :int))

(defcfun ("wiringPiI2CWrite" wiring-pi-i2c-write) :int (fd :int) (data :int))
(defcfun ("wiringPiI2CWriteReg8" wiring-pi-i2c-write8) :int (fd :int) (reg :int) (data :int))
(defcfun ("wiringPiI2CWriteReg16" wiring-pi-i2c-write16) :int (fd :int) (reg :int) (data :int))
kmylogo.lisp
;;;;; I2C TEST (HT16K33)

;; ■HT16K33 DataSheet
;; |------------------------------+---------+------------------+---------------------+-------------------------------------------------------------|
;; | Name                         | Address | Command(b0 ~ b7) | Option              | Description                                                 |
;; |------------------------------+---------+------------------+---------------------+-------------------------------------------------------------|
;; | Display data Address pointer |    0x00 | A3 A2 A1 A0      | {A0~A3} R/W         | Five bits of immediate data, bits A0 to A3,                 |
;; |                              |         |                  |                     | are transferred to the data pointer to define               |
;; |                              |         |                  |                     | one of sixteen display RAM addresses.                       |
;; |                              |         |                  |                     |                                                             |
;; |                              |         |                  |                     | If the Display data register address (An)                   |
;; |                              |         |                  |                     | is 0X00h ~ 0X0Fh, after reaching the                        |
;; |                              |         |                  |                     | memory location 0X0Fh, the pointer will                     |
;; |                              |         |                  |                     | reset to 0X00h                                              |
;; |------------------------------+---------+------------------+---------------------+-------------------------------------------------------------|
;; | System setup                 |    0x20 | X  X  X  S       | {S} Write           | Defines internal system oscillator on/off                   |
;; |                              |         |                  |                     | {0}:Turn off System oscillator (standby mode)               |
;; |                              |         |                  |                     | {1}:Turn on System oscillator (normaloperation mode)        |
;; |------------------------------+---------+------------------+---------------------+-------------------------------------------------------------|
;; | Key data Address pointer     |    0x40 | 0 K2 K1 K0       | {K0~K2} Read        | Three bits of immediate data, bits K0 to                    |
;; |                              |         |                  |                     | K2, are transferred to the data pointer to                  |
;; |                              |         |                  |                     | define one of six key data RAM addresses.                   |
;; |                              |         |                  |                     | It is strongly recommended that the key                     |
;; |                              |         |                  |                     | data RAM of address 0x40H~0x45H                             |
;; |                              |         |                  |                     | should be read continuously and in one                      |
;; |                              |         |                  |                     | operation, so the key data RAM of address                   |
;; |                              |         |                  |                     | should be started at 0x40H only.                            |
;; |                              |         |                  |                     |                                                             |
;; |                              |         |                  |                     | If the Key data register address (An) is                    |
;; |                              |         |                  |                     | 0X40h ~ 0X45h, after reaching the memory                    |
;; |                              |         |                  |                     | location 0X45h, the pointer will reset to                   |
;; |                              |         |                  |                     | 0X40h                                                       |
;; |------------------------------+---------+------------------+---------------------+-------------------------------------------------------------|
;; | INT flag Address pointer     |    0x60 | X X X X          | Read Only           | Defines the INT flag address, Read INT flag                 |
;; |                              |         |                  |                     | status.                                                     |
;; |                              |         |                  |                     | Interrupt flag signal output. When any key                  |
;; |                              |         |                  |                     |                                                             |
;; |                              |         |                  |                     | matrix key is pressed, after the completion of              |
;; |                              |         |                  |                     | two key scan cycles, this int flag bit goes to a            |
;; |                              |         |                  |                     | high level and remains at a high level until all            |
;; |                              |         |                  |                     | key data has been read                                      |
;; |------------------------------+---------+------------------+---------------------+-------------------------------------------------------------|
;; | Display setup                |    0x80 | X B1 B0 D        | {D} Write           | {D} -> Defines Display on/off status                        |
;; |                              |         |                  |                     | 0: Display off                                              |
;; |                              |         |                  |                     | 1: Display on                                               |
;; |                              |         |                  |                     |                                                             |
;; |                              |         |                  | {B0~B1} Write       | Defines the blinking frequency                              |
;; |                              |         |                  |                     | {B1,B0} <- bit pattern                                      |
;; |                              |         |                  |                     | {0,0} -> Blinking OFF                                       |
;; |                              |         |                  |                     | {0,1} -> 2Hz                                                |
;; |                              |         |                  |                     | {1,1} -> 1Hz                                                |
;; |                              |         |                  |                     | {1,1} -> 0.5Hz                                              |
;; |------------------------------+---------+------------------+---------------------+-------------------------------------------------------------|
;; | ROW/INT set                  |    0xA0 | X X Act Row/Int  | {Act Row/Int} Write | Defines INT/ROW output pin select and INT                   |
;; |                              |         |                  |                     | pin output active level status.                             |
;; |                              |         |                  |                     | {X 0}: INT/ROW output pin is set to ROW driver output       |
;; |                              |         |                  |                     | {0, 1}: INT/ROW output pin is set to INT output, activelow  |
;; |                              |         |                  |                     | {1, 1}: INT/ROW output pin is set to INT output, activehigh |
;; |------------------------------+---------+------------------+---------------------+-------------------------------------------------------------|
;; | Dimming set                  |    0xE0 | P3 P2 P1 P0      | {P0~P3} Write       | Defines the pulse width of ROW.                             |
;; |                              |         |                  |                     | {P0~P3}: 0x00~0x0F                                          |
;; |------------------------------+---------+------------------+---------------------+-------------------------------------------------------------|
;; | Test mode                    |    0xD9 | 1 0 0 1          | Write               | HOLTEK Use Only                                             |
;; |------------------------------+---------+------------------+---------------------+-------------------------------------------------------------|

(ql:quickload :cl-wiringpi2)
(load "kpri2c.lisp")

;; パッケージの作成
(defpackage :kpr-matrix
  (:use :common-lisp
        :common-lisp-user
        :cffi
        :kpr-i2c
        :wpi2)
;;  (:export :main))
  )

(in-package :kpr-matrix)

;; HT16K33 Command
(defconstant +i2c-address+ #x70)                  ; 対象のI2Cデバイスを選択
(defconstant +i2c-cms-data+ #x00)
(defconstant +i2c-cmd-sysset+ #x20)
(defconstant +i2c-cmd-blink+ #x80)
(defconstant +i2c-cmd-dimming+ #xE0)
(defconstant +i2c-cmd-outputsel+ #xA0)

;; HT16K33 RegSetup
(defconstant +i2c-sysset-osc-on+ #x01)

;; Display setup
(defconstant +i2c-blink-off+ #x00)
(defconstant +i2c-blink-display-on+ #x01)
(defconstant +i2c-blink-2hz+ #x02)
(defconstant +i2c-blink-1hz+ #x04)
(defconstant +i2c-blink-05hz+ #x06)

;; LED Data
(defparameter *char-pattern* nil)


(defparameter *toufu* '((#x00 #b11111111)                  ; 四角い枠。右上角から左下角に斜めの斜線
                        (#x02 #b10000011)
                        (#x04 #b10000101)
                        (#x06 #b10001001)
                        (#x08 #b10010001)
                        (#x0A #b10100001)
                        (#x0C #b11000001)
                        (#x0E #b11111111)
                        ))

(defparameter *invader1* '((#x00 #b00100100)                  ; インベーダーパターン1
                           (#x02 #b10100101)
                           (#x04 #b11111111)
                           (#x06 #b11011011)
                           (#x08 #b11111111)
                           (#x0A #b01111110)
                           (#x0C #b00100100)
                           (#x0E #b01000010)
                           ))


(defparameter *invader2* '((#x00 #b00100100)                  ; インベーダーパターン2
                           (#x02 #b00100100)
                           (#x04 #b01111110)
                           (#x06 #b11011011)
                           (#x08 #b11111111)
                           (#x0A #b11111111)
                           (#x0C #b10100101)
                           (#x0E #b00100100)
                           ))


(defparameter *squid1* '((#x00 #b00011000)                  ; 烏賊パターン1
                         (#x02 #b00111100)
                         (#x04 #b01111110)
                         (#x06 #b11011011)
                         (#x08 #b11111111)
                         (#x0A #b00100100)
                         (#x0C #b01011010)
                         (#x0E #b01000010)
                         ))


(defparameter *squid2* '((#x00 #b00011000)                  ; 烏賊パターン1
                         (#x02 #b00111100)
                         (#x04 #b01111110)
                         (#x06 #b11011011)
                         (#x08 #b11111111)
                         (#x0A #b00100100)
                         (#x0C #b01011010)
                         (#x0E #b10100101)
                         ))




(defun ht-cmd(fd cmd data)
    (wiring-pi-i2c-write fd (logior cmd data)))


;; HT16K33 Setup
(defun ht_init(fd)
  
  ;; HT16K33 初期値
  (ht-cmd fd +i2c-cmd-sysset+ #x01)              ; システムオシレータON
  (ht-cmd fd +i2c-cmd-blink+ #x01)               ; 点滅周期の設定
  (ht-cmd fd +i2c-cmd-dimming+ #x01)             ; LEDの明るさ設定
  )

;; LED Clear
(defun ht_clear(fd)
    (wiring-pi-i2c-write8 fd #x00 #x00)
    (wiring-pi-i2c-write8 fd #x02 #x00)
    (wiring-pi-i2c-write8 fd #x04 #x00)
    (wiring-pi-i2c-write8 fd #x06 #x00)
    (wiring-pi-i2c-write8 fd #x08 #x00)
    (wiring-pi-i2c-write8 fd #x0A #x00)
    (wiring-pi-i2c-write8 fd #x0C #x00)
    (wiring-pi-i2c-write8 fd #x0E #x00)
)

;; ビット反転(ネットから取ってきた)
(defun bit-reverse (n &optional (nbits (integer-length n)))
  (dotimes (i (ash nbits -1))
     (rotatef (ldb (byte 1 i) n)
              (ldb (byte 1 (- nbits i 1)) n)))
  n)

;; データをまとめて送信(list)
(defun ht_dataset_matrix(fd data-list)
    (mapcar #'(lambda(send-data)
                (ht_dataset fd (car send-data) (car (cdr send-data)))
                )
            data-list)
    )

;; HT16K33データ送信
    ;; A:1010 B:1011 C:1100 D:1101
    ;; Adafruitの8x8LEDマトリクスmini基板は、サイズを小さくするため配線が特殊になっている。
    ;; b0〜b7ビットのうち、b0〜b7を反転させなければならない。
    ;1111 1111 -> 1111 1111
    ;1011 1111 -> 1111 1110 : #xBF -> #xFE
    ;1101 1111 -> 1111 1101 : #xDF -> #xFD
(defun ht_dataset(fd line-add set-data)
  (let (
        b7                              ; 最上位ビット
        b0-b6                           ; b0〜b6
        )
    
;    (format t "INデータ:~8,b" set-data)
;    (princ #\Newline)
;    (format t "INデータHEX:~4,'0x" set-data)
;    (princ #\Newline)

    ;; 最上位ビットの取得
    (setf b7 (logand set-data #x80))    ; #b1000 0000 でマスクする。

    ;; b0〜b6ビットの取得
    (setf b0-b6 (logand set-data #x7F)) ; #b0111 1111 でマスクする。
    
;    (format t "最上位ビット:~b" b7)
;    (princ #\Newline)
;    (format t "リバース前:~8,'0b" b0-b6)
;    (princ #\Newline)

    ;; b0〜b6ビットの反転
;    (format t "リバース後:~8,'0b" (bit-reverse b0-b6 7))
;    (princ #\Newline)

;    (format t "書き込みデータ:~b" (logior b7 (bit-reverse b0-b6 7)))
;    (princ #\Newline)
;    (format t "HEX:~2,'0x" (logior b7 (bit-reverse b0-b6 7)))
;    (princ #\Newline)

    ;; HT16K33へデータ書き込み
    (wiring-pi-i2c-write8 fd line-add (logior b7 (bit-reverse b0-b6 7)))
  ))

(defparameter *dbg-fd* nil)                ; Debug用
(defparameter *fd* nil)
(defparameter *dbg* nil)

(defun main()
  (let (
        (fd)
        )

    ;; I2Cシステムの初期化
    (setf fd (wiring-pi-i2c-setup +i2c-address+))
    (setf *fd* fd)
    
    ;; HT16K33 Setup
    (ht_init fd)

    ;; LED All OFF
    (ht_clear fd)

    ;; Send Data
    (setf *char-pattern* (cons *invader2* *char-pattern*))
    (setf *char-pattern* (cons *invader1* *char-pattern*))
    (setf *char-pattern* (cons *invader2* *char-pattern*))
    (setf *char-pattern* (cons *invader1* *char-pattern*))
    (setf *char-pattern* (cons *squid2* *char-pattern*))
    (setf *char-pattern* (cons *squid1* *char-pattern*))
    (setf *char-pattern* (cons *squid2* *char-pattern*))
    (setf *char-pattern* (cons *squid1* *char-pattern*))


    (loop
    (mapcar #'(lambda(led-char)
                (ht_dataset_matrix fd led-char)
                (delay 700)
                )
            *char-pattern*)
       )



    ))

;; このコメントを外せばREPL上で実行
;;(main)

;; main関数を起点として実行ファイルを作成
(ccl:save-application "kmylogo"
                      :toplevel-function #'main        ; トップレベルをmainに
                      :prepend-kernel t)

STM32のStandard Peripheral Libraryヘルプ

ARMコアでよく使われるようになったと言われているSTマイクロ社のSTM32シリーズ。
先日、Coretex-4と呼ばれるタイプのCPUが搭載されているテストボード「STM32F401RE」を手に入れました。

自身の勉強のために、用意されたmbedではなく、CPUの内部構造をある程度理解しながらレジスタを操作したいなーと思い、STマイクロが提供してくれているC言語用のライブラリ「Standard Peripheral Library」を使って遊んでいるのですが、まとまった情報がなく、先人たちのブログを右往左往しておりました。
※現在、STマイクロはHALと呼ばれるライブラリの利用を推奨しているとの事ですが、SPLとHALで宗教戦争のようなものもあるらしく・・・
 とりあえず、SPLから学んでみようかと。

右往左往していたところ、STマイクロの本家サイトにヘルプファイルが準備されていました!
なかなか気付かずに、結構な時間を費やしてしまった。
購入した基板のCPUに対応したSPLもあるみたいなので、早速ダウンロード。
今後発表されるCPUに対応するSPLは開発しないとかなんとか・・・そんな情報もありますが、実際の所どうなるかはわからないので、両方勉強しても害は無いでしょう。

1.STマイクロにある、マニュアルダウンロードページを表示
https://my.st.com/content/my_st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-libraries/stsw-stm32065.license=1535645305946.html

2.ページの一番下にあるリンクをクリックしてファイルをダウンロード
「STSW-STM32065」のDownloadボタンをクリック。
※ダウンロードしたzipファイルには、沢山のサンプルも含まれており、メジャーな開発環境(IDE)へのインポート方法も記載されています。(すばらしい!)



優良アダルトサイト紹介の最終形態!!MaxInfo