最近またサボっていますが・・・
ただ、このColorTool.exeへのリンクが変更になっているので備忘録としてアップしておきます。
なお、2019年11月22日時点なので、また変更になるかもしれません。
Lego Mindstorms NXT、Raspberry Pi、Edison、Arduinoといったガジェットを使ってプログラミング教育について日々考える研究所所長のつれづれなる独り言にお付き合いください。
Python で軽量サーバを作って Scratch 2 のHTTP拡張を待ち受けてみるこれで、拡張機能を作ってScratch(RAPIROとは別にRaspberry Pi 3で動かします)でシナリオ通りにRAPIROに喋らせるという魂胆です。確認の為にRaspberry PiでScratch2を立ち上げて、Shiftキーを押しながら「ファイル」を選ぶと「import experimental extension」と表示されるので、行けそうです。
The current 2.0 extensions available in the offline editor, like the PicoBoard extension, are Javascript extensions.とありました。
#! /bin/sh
export LD_LIBRARY_PATH=/usr/local/lib/mjpg-streamer
mjpg_streamer -o "output_http.so -w /usr/local/share/mjpg-streamer/www" -i "input_raspicam.so -fps 5 -x 480 -y 320"
次に、/usr/lib/systemd/system/streaming.serviceとして以下を作成します。[Unit]
Description=Mjpg-Streamer
[Service]
ExecStart =/home/pi/streaming/streaming.sh
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
以下のコマンドで作成したサービスをsystemdに登録します。
$ sudo systemctl enable streaming.service
$ cd ~
$ git clone https://github.com/KeiIchimaru/rapiroctl.git
$ cd rapiroctl
$ ln -s /usr/local/share/mjpg-streamer/www static
スケッチについてはRAPIROへの書き込みを行っておいてください。[Unit]
Description=RAPIRO Controller
[Service]
ExecStart =/home/pi/rapiroctl/rapiroctl.py
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
以下のコマンドで作成したサービスをsystemdに登録します。$ sudo systemctl enable rapiroctl.service
以上で、PiZeroのポート80でHTTPリクエストを待ち受けているので、ブラウザでアクセスするとサンプルの画面が表示されます。サンプルではカメラからのストリーミングも表示しているので、RAPIROに搭乗して操縦しているような感覚が得られると思います。(移動すると、画面が左右に大きく揺れるので酔いやすい方はご注意くださいw)[Unit]
Description=Shutdown by Button Daemon
[Service]
ExecStart =/home/pi/rapiroctl/shutdownd.py
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
以下のコマンドで作成したサービスをsystemdに登録します。$ sudo systemctl enable shutdownbuttond.service
adb shell am start -a com.android.internal.intent.action.REQUEST_SHUTDOWN
adb shell am start -n android/com.android.internal.app.ShutdownActivity
さらに、Android4.4以降はadb shell setprop sys.powerctl shutdown
でもシャットダウン可能です。package com.example.keiichimaru.shutdownpi.dialog
import android.app.Activity
import android.app.Dialog
import android.content.Context
import android.content.DialogInterface
import android.os.Bundle
import android.support.v4.app.DialogFragment
import android.support.v4.app.FragmentManager
import android.support.v7.app.AlertDialog
import android.util.Log
import com.example.keiichimaru.shutdownpi.R
class DlgShutdownConfirm(context: Context) {
private val mContext: Activity? = if (context is Activity) context else null
companion object {
const val TYPE_SHUTDOWN = "shutdown"
const val TYPE_REBOOT = "reboot"
}
fun show( manager: FragmentManager, tag: String?) {
val dialog = DlgShutdownConfirmDialog()
dialog.onRebootButtonClickListener = DialogInterface.OnClickListener { _, _ ->
finishActivity()
doShutdown(TYPE_REBOOT)
}
dialog.onShutdownButtonClickListener = DialogInterface.OnClickListener { _, _ ->
finishActivity()
doShutdown(TYPE_SHUTDOWN)
}
dialog.onCancelButtonClickListener = DialogInterface.OnClickListener { _, _ ->
finishActivity()
}
dialog.show(manager, tag)
}
private fun finishActivity() {
requireNotNull(mContext) {"DlgShutdownConfirm initialize error."}
mContext.finishAndRemoveTask()
}
private fun doShutdown(type: String) {
require((type == TYPE_SHUTDOWN) or (type == TYPE_REBOOT)) { "type required $TYPE_SHUTDOWN or $TYPE_REBOOT." }
val command = arrayOf(
"sh",
"-c", "setprop sys.powerctl $type"
)
val runtime = Runtime.getRuntime()
try {
Log.d(DlgShutdownConfirm::class.qualifiedName, command.reduce { s1, s2 -> "$s1 $s2" })
val process = runtime.exec(command)
val result = process.inputStream.bufferedReader().use { it.readText() }
Log.d(DlgShutdownConfirm::class.qualifiedName, result)
process.waitFor()
} catch (e: InterruptedException) {
e.printStackTrace()
}
}
class DlgShutdownConfirmDialog : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(activity!!)
builder
.setMessage(R.string.dlg_shutdown_msg)
.setNeutralButton(R.string.dlg_reboot, onRebootButtonClickListener)
.setNegativeButton(R.string.dlg_shutdown, onShutdownButtonClickListener)
.setPositiveButton(R.string.dlg_cancel, onCancelButtonClickListener)
return builder.create()
}
internal var onRebootButtonClickListener: DialogInterface.OnClickListener? = null
internal var onShutdownButtonClickListener: DialogInterface.OnClickListener? = null
internal var onCancelButtonClickListener: DialogInterface.OnClickListener? = null
}
}
package com.example.keiichimaru.shutdownpi.dialog
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import com.example.keiichimaru.shutdownpi.dialog.DlgShutdownConfirm
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// setContentView(R.layout.activity_main)
DlgShutdownConfirm(this).show(supportFragmentManager, MainActivity::class.qualifiedName)
}
}
su
rpi3-recovery.sh
を叩いて、再起動します。add connect [Raspberry PiのIPアドレス] ・・・adbで接続
adb shell wm size ・・・画面サイズの表示
adb shell input mouse tap [x] [y] ・・・マウスクリックのシミュレーション
で、概ねの座標からボタンをクリックさせると、問題なく動きました。でも、物理的なマウスでクリックしても動かないんですね。ERROR: Could not find com.android.tools.build:gradle:3.3.1.
Searched in the following locations:
- https://jcenter.bintray.com/com/android/tools/build/gradle/3.3.1/gradle-3.3.1.pom
- https://jcenter.bintray.com/com/android/tools/build/gradle/3.3.1/gradle-3.3.1.jar
Required by:
project :
Add Google Maven repository and sync project
Open File
Enable embedded Maven repository and sync project
色々と検索をして見ましたが、これはというサイトが見つかりませんでした。いずれにしろGradle関連の設定では無いかと検討をつけてこちらのサイトを参考に、プロジェクト全体のbuild.gradleにgoogle()を追加すれば良いことがわかりました。// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
google() ・・・・・この行を追加
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.1'
}
}
allprojects {
repositories {
jcenter()
google() ・・・・・この行を追加
}
}
新規にプロジェクトを作成する場合は、初めから追加されているようですがEclipceからインポートした場合には記述されなかったようです。アプリケーションモジュール
dependencies {
implementation project(':myLib')
}
myLibモジュール
dependencies {
api project(':lvl')
api 'com.android.support:appcompat-v7:28.0.0'
api 'com.android.support:preference-v7:28.0.0'
api 'com.android.support:recyclerview-v7:28.0.0'
}
lvlモジュール
dependenciesは無し
lvlモジュールのメソッドで一部アプリケーションモジュールで利用するものがありますが、myLibでapi宣言しているのでアプリケーションモジュールではlvlを指定する必要はありません。# DELL E2014H
#hdmi_group=2
#hdmi_mode=87
#hdmi_cvt=1600 900 60 6 0 0 0
#disable_overscan=1
# Panasonic TH-32LX70 4(720p),16(1080p)
#hdmi_group=1
#hdmi_mode=16
#disable_overscan=1
# Sharp LL-173C(OK=36,17,8)
hdmi_group=2
hdmi_mode=8
disable_overscan=1
<application ... android:theme="@android:style/Theme.NoTitleBar">
<activity ... android:theme="@android:style/Theme">
<declare-styleable name="Preference">
<attr name="icon" format="reference">
<attr name="title" format="reference">
<attr name="layout" format="reference">
さて、エラーがなくなって実行したところで、はたと気がついたのが設定を開くためのメニューが出ない。最近の人は知らないかの知れませんが、昔はメニューの表示は画面下部のホームボタンとか表示されているとこにあったんですね。どうやら最近は画面上部のツールバー?(タイトルバー改めアクションバーが改名してツールバー?なんて呼ぶのが正式なんでしょうか?)に表示されるようです。そうです、Theme.NoTitleBarでタイトルバーを消していたんですね。<style name="Theme.Light_actionBar" parent="@android:style/Theme.Light">
<item name="android:icon">@android:color/transparent</item>
<item name="android:windowNoTitle">false</item>
<item name="android:windowActionBar">true</item>
</style>
カスタムテーマを作って無事にメニューが表示されて、やっと設定画面を開くと、今度は実行時エラーが出ます。実はsupport v7 recyclerviewを使っていたんですね。と言うことで、こちらもインポートして無事に設定画面も動くようになりました。参考サイト:Preference(4)-Preferenceのカスタマイズ
Android6.0からApache HTTP クライアントが削除されたのが原因のようです。最新のソースがGithubにあったのでダウンロードして差し替えました。
<style name="Dialog_TextSmall" parent="TextAppearance.AppCompat.Caption">
<item name="android:textColor">?android:colorPrimary</item>
</style>
スタイルを定義して、レイアウトで指定します。
<TextView android:text="@string/about_copyright"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dip"
android:layout_marginRight="15dip"
style="@style/Dialog_TextSmall"
/>
この作業の中で、その2で修正したdeclare-styleableですが、今度は二重定義でエラーになりました。どうやらsupport v7 appcompat側のリソースで定義されているようです。support v7 appcompatは必須という位置付けなんでしょうかね。その2での修正を削除してクリアです。本体後部 |
最近またEdisonで遊んでいます。 教育用のデバイスとしてよく出来ているなと思っている Edison ですが、現在3台を所有しています。 最近このうちの1台が調子が悪くなってしましました。具体的にはBeep用のデバイスが壊れたようです。購入時にチェックをしたつもりですが今回久...