mirror of
https://github.com/ocogeclub/ocoge.git
synced 2024-11-21 15:19:48 +00:00
] カラーピッカーをカスタマイズ
This commit is contained in:
parent
3a3b83a822
commit
84077850c0
76
index.html
76
index.html
@ -317,9 +317,10 @@
|
||||
</category>
|
||||
<sep></sep>
|
||||
<category name="GPIO" css-icon="customIcon fab fa-raspberry-pi" categorystyle="gpio_category">
|
||||
<label text="基本"></label>
|
||||
<label text="必須"></label>
|
||||
<block type="ugj_gpio_open"></block>
|
||||
<block type="ugj_gpio_close"></block>
|
||||
<label text="基本"></label>
|
||||
<block type="ugj_gpio_set_output">
|
||||
<value name="gpio">
|
||||
<shadow type="math_number">
|
||||
@ -474,7 +475,11 @@
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<label text="センサー" web-line="4.0" web-line-width="200"></label>
|
||||
<label text="Extra" web-line="4.0" web-line-width="200"></label>
|
||||
<label text="_" web-line="4.0" web-line-width="200"></label>
|
||||
</category>
|
||||
<category name="センサー" css-icon="customIcon fas fa-microchip" categorystyle="sensor_category">
|
||||
<label text="温湿度気圧センサー BME280" web-line="4.0" web-line-width="200"></label>
|
||||
<block type="ugj_bme280">
|
||||
<field name="temp" id="4iysIXd|f$Jj$9hZ(R_H">気温</field>
|
||||
<field name="hum" id="IT?JH;IRcsGP.8I%aEgw">湿度</field>
|
||||
@ -489,7 +494,67 @@
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<label text="Extra" web-line="4.0" web-line-width="200"></label>
|
||||
<label text="ジェスチャーセンサー PAJ7620" web-line="4.0" web-line-width="200"></label>
|
||||
<block type="ugj_gesture_init">
|
||||
<value name="i2c_addr">
|
||||
<shadow type="ugj_hextodec">
|
||||
<value name="hex">
|
||||
<shadow type="text">
|
||||
<field name="TEXT">73</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="ugj_gesture_read"></block>
|
||||
<block type="ugj_gesture_stop"></block>
|
||||
<label text="赤外線アレイセンサー(サーマルカメラ)AMG8833" web-line="4.0" web-line-width="200"></label>
|
||||
<block type="ugj_grideye_init">
|
||||
<field name="addr">0x69</field>
|
||||
</block>
|
||||
<block type="ugj_grideye_read"></block>
|
||||
<block type="ugj_grideye_stop"></block>
|
||||
<block type="ugj_create_sub_canvas">
|
||||
<field name="sub_canvas" id=",Xs[%dbxXS?[s]wV8Ye{">サブキャンバス</field>
|
||||
<value name="width">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">8</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="height">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">8</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="style_width">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">160</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="style_height">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">160</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="ugj_draw_grideyedata">
|
||||
<field name="color_high">#ff4500</field>
|
||||
<field name="color_low">#0000ff</field>
|
||||
<!-- <field name="colorize">TRUE</field> -->
|
||||
<!-- <value name="amg8833data">
|
||||
<shadow type="ugj_grideye_read"></shadow>
|
||||
</value> -->
|
||||
<value name="temp_high">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">28</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="temp_low">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">15</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<label text="_" web-line="4.0" web-line-width="200"></label>
|
||||
</category>
|
||||
<category name="マルチメディア" css-icon="customIcon fas fa-gamepad" categorystyle="multimedia_category">
|
||||
@ -582,6 +647,9 @@
|
||||
<field name="updown">keydown</field>
|
||||
</block>
|
||||
<label text="色" web-line="4.0" web-line-width="200"></label>
|
||||
<block type="colour_picker">
|
||||
<field name="COLOUR">#ff0000</field>
|
||||
</block>
|
||||
<block type="colour_random"></block>
|
||||
<block type="colour_rgb">
|
||||
<value name="RED">
|
||||
@ -813,7 +881,6 @@
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="ugj_child_gesture"></block>
|
||||
<block type="ugj_child_irrecord">
|
||||
<value name="gpio">
|
||||
<shadow type="math_number">
|
||||
@ -904,6 +971,7 @@
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="ugj_dev_run_js"></block>
|
||||
<label text="_" web-line="4.0" web-line-width="200"></label>
|
||||
</category>
|
||||
<category name="スニペット" css-icon="customIcon fas fa-egg" categorystyle="snippets_category">
|
||||
|
30
index.js
30
index.js
@ -11,10 +11,11 @@ const testfunc = () => {
|
||||
Blockly.HSV_SATURATION = 0.55;
|
||||
Blockly.HSV_VALUE = 0.75;
|
||||
var gpio_color = '0';
|
||||
var sonsor_color = '20';
|
||||
var multimedia_color = '240';
|
||||
var network_color = '340';
|
||||
var special_color = '20';
|
||||
var snippets_color = '90';
|
||||
var special_color = '40';
|
||||
var snippets_color = '180';
|
||||
// テーマ
|
||||
var theme = Blockly.Theme.defineTheme('ocoge', {
|
||||
'base': Blockly.Themes.Classic,
|
||||
@ -29,6 +30,9 @@ var theme = Blockly.Theme.defineTheme('ocoge', {
|
||||
'gpio_blocks': {
|
||||
"colourPrimary": gpio_color
|
||||
},
|
||||
'sensor_blocks': {
|
||||
"colourPrimary": sonsor_color
|
||||
},
|
||||
'multimedia_blocks': {
|
||||
"colourPrimary": multimedia_color
|
||||
},
|
||||
@ -46,6 +50,9 @@ var theme = Blockly.Theme.defineTheme('ocoge', {
|
||||
"gpio_category": {
|
||||
"colour": gpio_color
|
||||
},
|
||||
"sensor_category": {
|
||||
"colour": sonsor_color
|
||||
},
|
||||
"multimedia_category": {
|
||||
"colour": multimedia_color
|
||||
},
|
||||
@ -80,6 +87,13 @@ Blockly.Msg["UGJ_FOREACH_TITLE"] = "リスト %1 の各 %2 について %3 %4";
|
||||
Blockly.Msg["UGJ_FOREACH_ITEM"] = "項目";
|
||||
Blockly.Msg["UGJ_FOREACH_TOOLTIP"] = "リストの各項目について、その項目を変数「項目」としてステートメントを実行します。";
|
||||
|
||||
Blockly.Msg["UGJ_CREATE_SUBCANVAS_TITLE"] = "%1 %2 を、幅 %3 px、高さ %4 pxで作成 %5 、幅 %6 px、高さ %7 pxで表示";
|
||||
Blockly.Msg["UGJ_CREATE_SUBCANVAS_VAR"] = "サブキャンバス";
|
||||
Blockly.Msg["UGJ_CREATE_SUBCANVAS_TOOLTIP"] = "ディスプレイエリアに、右下寄せでキャンバスを作成します。";
|
||||
|
||||
Blockly.Msg["UGJ_DRAW_GRIDEYEDATA_TITLE"] = "赤外線アレイセンサ画像表示 %1 入力 %2 温度範囲上限 %3 %4 温度範囲下限 %5 %6 描画対象キャンバス %7";
|
||||
Blockly.Msg["UGJ_DRAW_GRIDEYEDATA_TOOLTIP"] = "AMG8833の温度データを、画像としてキャンバスに描画します。「着色」をチェックすると、温度範囲で設定されている色をつけて表示します。";
|
||||
|
||||
Blockly.Msg["GPIO_OPEN_TITLE"] = "GPIO を使えるようにする";
|
||||
Blockly.Msg["GPIO_OPEN_TOOLTIP"] = "GPIOを初期化して接続します。";
|
||||
Blockly.Msg["GPIO_CLOSE_TITLE"] = "GPIO の後片付けをする";
|
||||
@ -132,6 +146,18 @@ Blockly.Msg["UGJ_BME280_TOOLTIP"] = "環境センサーBME280で、気温(摂
|
||||
Blockly.Msg["UGJ_BME280_READ_TEMP"] = "気温";
|
||||
Blockly.Msg["UGJ_BME280_READ_HUM"] = "湿度";
|
||||
Blockly.Msg["UGJ_BME280_READ_PRES"] = "気圧";
|
||||
Blockly.Msg["UGJ_GESTURE_INIT_TITLE"] = "ジェスチャーセンサー(アドレス: %1 )を初期化";
|
||||
Blockly.Msg["UGJ_GESTURE_INIT_TOOLTIP"] = "PAJ7620 ジェスチャーセンサーを使用する準備をします。";
|
||||
Blockly.Msg["UGJ_GESTURE_READ_TITLE"] = "ジェスチャーの値";
|
||||
Blockly.Msg["UGJ_GESTURE_READ_TOOLTIP"] = "センサーから現在のジェスチャーの値(0〜9)を読み込みます";
|
||||
Blockly.Msg["UGJ_GESTURE_STOP_TITLE"] = "ジェスチャーセンサーから切断";
|
||||
Blockly.Msg["UGJ_GESTURE_STOP_TOOLTIP"] = "センサーとの接続を停止します。";
|
||||
Blockly.Msg["UGJ_GRIDEYE_INIT_TITLE"] = "赤外線アレイセンサ(アドレス: %1 )を初期化";
|
||||
Blockly.Msg["UGJ_GRIDEYE_INIT_TOOLTIP"] = "赤外線アレイセンサ AMG8833 の使用準備をします。";
|
||||
Blockly.Msg["UGJ_GRIDEYE_READ_TITLE"] = "赤外線アレイセンサの値";
|
||||
Blockly.Msg["UGJ_GRIDEYE_READ_TOOLTIP"] = "AMG8833から読み取った温度データを、8x8の配列で取得します。";
|
||||
Blockly.Msg["UGJ_GRIDEYE_STOP_TITLE"] = "赤外線アレイセンサから切断";
|
||||
Blockly.Msg["UGJ_GRIDEYE_STOP_TOOLTIP"] = "センサーとの接続を停止します。";
|
||||
|
||||
Blockly.Msg["UGJ_CODECHAR_TITLE"] = "コード %1 の文字";
|
||||
Blockly.Msg["UGJ_CODECHAR_TOOLTIP"] = "文字コードを文字に変換します。";
|
||||
|
@ -2,7 +2,7 @@
|
||||
/** ブラウザ動作時にもちょびっと対応 */
|
||||
'use strict'
|
||||
|
||||
// ファイル定数
|
||||
// 定数
|
||||
const ugj_const = {
|
||||
doc_root: '/home/pi/Documents/ocoge_docs/',
|
||||
app_name: 'ocoge',
|
||||
@ -14,7 +14,8 @@ const ugj_const = {
|
||||
error_ja_all: 'エラーが発生しました。\n『おこげ倶楽部』までお問い合わせください。',
|
||||
pig: 'pigpio',
|
||||
lg: 'lgpio', // lgpioがテストフェーズを終えてハードウェアPWMを実装したら切り替えを実装予定
|
||||
i2c_defbus: '6' // 文字列リテラルで指定
|
||||
i2c_defbus: '6', // 文字列リテラルで指定
|
||||
dev_hash: '4e9205f9b7e571bec1aa52ab7871f420684fcf96149672a4d550a95863d6b072'
|
||||
}
|
||||
|
||||
/** クラス elUtil ****************************************************************** */
|
||||
@ -197,6 +198,8 @@ class elUtil {
|
||||
// GPIO 関連:リロードでGPIOをロックしたままハンドルを失うのを防ぐ
|
||||
cleanupGPIO() {
|
||||
require('@ocogeclub/' + this.gpio_backend).close_all_handle();
|
||||
require('@ocogeclub/paj7620').stop();
|
||||
require('@ocogeclub/amg8833').stop();
|
||||
}
|
||||
|
||||
// 設定(保存ファイルパスと未保存フラグ)をローカルストレージに保存
|
||||
|
@ -1,7 +1,8 @@
|
||||
#!/bin/bash -x
|
||||
# Usage: bash install.sh
|
||||
|
||||
NODEVER=14.17.0
|
||||
NODEVER=16.5.0
|
||||
#14.17.0
|
||||
|
||||
# install some packages
|
||||
sudo apt update
|
||||
|
533
lib/gesture.py
533
lib/gesture.py
@ -1,533 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#
|
||||
# GrovePi Library for using the Grove - Gesture Sensor v1.0(http://www.seeedstudio.com/depot/Grove-Gesture-p-2463.html)
|
||||
#
|
||||
# The GrovePi connects the Raspberry Pi and Grove sensors. You can learn more about GrovePi here: http://www.dexterindustries.com/GrovePi
|
||||
#
|
||||
# Have a question about this library? Ask on the forums here: http://forum.dexterindustries.com/c/grovepi
|
||||
#
|
||||
# History
|
||||
# ------------------------------------------------
|
||||
# Author Date Comments
|
||||
# Karan 31 Dec 15 Initial Authoring
|
||||
#
|
||||
# Code derived from the basic Arduino library for the Gesture Sensor by Seeed: https://github.com/Seeed-Studio/Gesture_PAJ7620
|
||||
|
||||
# Released under the MIT license (http://choosealicense.com/licenses/mit/).
|
||||
# For more information see https://github.com/DexterInd/GrovePi/blob/master/LICENSE
|
||||
|
||||
import time,sys
|
||||
import RPi.GPIO as GPIO
|
||||
import smbus
|
||||
|
||||
# use the bus that matches your raspi version
|
||||
rev = GPIO.RPI_REVISION
|
||||
if rev == 2 or rev == 3:
|
||||
bus = smbus.SMBus(1)
|
||||
else:
|
||||
bus = smbus.SMBus(0)
|
||||
|
||||
class gesture:
|
||||
#Registers and variables for the gesture sensor
|
||||
GES_REACTION_TIME =.500 # You can adjust the reaction time according to the actual circumstance.
|
||||
GES_ENTRY_TIME =.800 # When you want to recognize the Forward/Backward gestures, your gestures' reaction time must less than GES_ENTRY_TIME(0.8s).
|
||||
GES_QUIT_TIME =1.000
|
||||
|
||||
BANK0 = 0
|
||||
BANK1 = 1
|
||||
|
||||
PAJ7620_ADDR_BASE =0x00
|
||||
|
||||
#REGISTER BANK SELECT
|
||||
PAJ7620_REGITER_BANK_SEL =(PAJ7620_ADDR_BASE + 0xEF) #W
|
||||
|
||||
#DEVICE ID
|
||||
PAJ7620_ID =0x73
|
||||
|
||||
#REGISTER BANK 0
|
||||
PAJ7620_ADDR_SUSPEND_CMD =(PAJ7620_ADDR_BASE + 0x3) #W
|
||||
PAJ7620_ADDR_GES_PS_DET_MASK_0 =(PAJ7620_ADDR_BASE + 0x41) #RW
|
||||
PAJ7620_ADDR_GES_PS_DET_MASK_1 =(PAJ7620_ADDR_BASE + 0x42) #RW
|
||||
PAJ7620_ADDR_GES_PS_DET_FLAG_0 =(PAJ7620_ADDR_BASE + 0x43) #R
|
||||
PAJ7620_ADDR_GES_PS_DET_FLAG_1 =(PAJ7620_ADDR_BASE + 0x44) #R
|
||||
PAJ7620_ADDR_STATE_INDICATOR =(PAJ7620_ADDR_BASE + 0x45) #R
|
||||
PAJ7620_ADDR_PS_HIGH_THRESHOLD =(PAJ7620_ADDR_BASE + 0x69) #RW
|
||||
PAJ7620_ADDR_PS_LOW_THRESHOLD =(PAJ7620_ADDR_BASE + 0x6A) #RW
|
||||
PAJ7620_ADDR_PS_APPROACH_STATE =(PAJ7620_ADDR_BASE + 0x6B) #R
|
||||
PAJ7620_ADDR_PS_RAW_DATA =(PAJ7620_ADDR_BASE + 0x6C) #R
|
||||
|
||||
#REGISTER BANK 1
|
||||
PAJ7620_ADDR_PS_GAIN =(PAJ7620_ADDR_BASE + 0x44) #RW
|
||||
PAJ7620_ADDR_IDLE_S1_STEP_0 =(PAJ7620_ADDR_BASE + 0x67) #RW
|
||||
PAJ7620_ADDR_IDLE_S1_STEP_1 =(PAJ7620_ADDR_BASE + 0x68) #RW
|
||||
PAJ7620_ADDR_IDLE_S2_STEP_0 =(PAJ7620_ADDR_BASE + 0x69) #RW
|
||||
PAJ7620_ADDR_IDLE_S2_STEP_1 =(PAJ7620_ADDR_BASE + 0x6A) #RW
|
||||
PAJ7620_ADDR_OP_TO_S1_STEP_0 =(PAJ7620_ADDR_BASE + 0x6B) #RW
|
||||
PAJ7620_ADDR_OP_TO_S1_STEP_1 =(PAJ7620_ADDR_BASE + 0x6C) #RW
|
||||
PAJ7620_ADDR_OP_TO_S2_STEP_0 =(PAJ7620_ADDR_BASE + 0x6D) #RW
|
||||
PAJ7620_ADDR_OP_TO_S2_STEP_1 =(PAJ7620_ADDR_BASE + 0x6E) #RW
|
||||
PAJ7620_ADDR_OPERATION_ENABLE =(PAJ7620_ADDR_BASE + 0x72) #RW
|
||||
|
||||
#PAJ7620_REGITER_BANK_SEL
|
||||
PAJ7620_BANK0=0
|
||||
PAJ7620_BANK1=1
|
||||
|
||||
#PAJ7620_ADDR_SUSPEND_CMD
|
||||
PAJ7620_I2C_WAKEUP =1
|
||||
PAJ7620_I2C_SUSPEND =0
|
||||
|
||||
#PAJ7620_ADDR_OPERATION_ENABLE
|
||||
PAJ7620_ENABLE=1
|
||||
PAJ7620_DISABLE=0
|
||||
|
||||
#ADC, delete
|
||||
REG_ADDR_RESULT = 0x00
|
||||
REG_ADDR_ALERT = 0x01
|
||||
REG_ADDR_CONFIG = 0x02
|
||||
REG_ADDR_LIMITL = 0x03
|
||||
REG_ADDR_LIMITH = 0x04
|
||||
REG_ADDR_HYST = 0x05
|
||||
REG_ADDR_CONVL = 0x06
|
||||
REG_ADDR_CONVH = 0x07
|
||||
|
||||
GES_RIGHT_FLAG =1<<0
|
||||
GES_LEFT_FLAG =1<<1
|
||||
GES_UP_FLAG =1<<2
|
||||
GES_DOWN_FLAG =1<<3
|
||||
GES_FORWARD_FLAG =1<<4
|
||||
GES_BACKWARD_FLAG =1<<5
|
||||
GES_CLOCKWISE_FLAG =1<<6
|
||||
GES_COUNT_CLOCKWISE_FLAG =1<<7
|
||||
GES_WAVE_FLAG =1<<0
|
||||
|
||||
#Gesture output
|
||||
FORWARD = 1
|
||||
BACKWARD = 2
|
||||
RIGHT = 3
|
||||
LEFT = 4
|
||||
UP = 5
|
||||
DOWN = 6
|
||||
CLOCKWISE = 7
|
||||
ANTI_CLOCKWISE = 8
|
||||
WAVE = 9
|
||||
|
||||
#Initial register state
|
||||
initRegisterArray=( [0xEF,0x00],
|
||||
[0x32,0x29],
|
||||
[0x33,0x01],
|
||||
[0x34,0x00],
|
||||
[0x35,0x01],
|
||||
[0x36,0x00],
|
||||
[0x37,0x07],
|
||||
[0x38,0x17],
|
||||
[0x39,0x06],
|
||||
[0x3A,0x12],
|
||||
[0x3F,0x00],
|
||||
[0x40,0x02],
|
||||
[0x41,0xFF],
|
||||
[0x42,0x01],
|
||||
[0x46,0x2D],
|
||||
[0x47,0x0F],
|
||||
[0x48,0x3C],
|
||||
[0x49,0x00],
|
||||
[0x4A,0x1E],
|
||||
[0x4B,0x00],
|
||||
[0x4C,0x20],
|
||||
[0x4D,0x00],
|
||||
[0x4E,0x1A],
|
||||
[0x4F,0x14],
|
||||
[0x50,0x00],
|
||||
[0x51,0x10],
|
||||
[0x52,0x00],
|
||||
[0x5C,0x02],
|
||||
[0x5D,0x00],
|
||||
[0x5E,0x10],
|
||||
[0x5F,0x3F],
|
||||
[0x60,0x27],
|
||||
[0x61,0x28],
|
||||
[0x62,0x00],
|
||||
[0x63,0x03],
|
||||
[0x64,0xF7],
|
||||
[0x65,0x03],
|
||||
[0x66,0xD9],
|
||||
[0x67,0x03],
|
||||
[0x68,0x01],
|
||||
[0x69,0xC8],
|
||||
[0x6A,0x40],
|
||||
[0x6D,0x04],
|
||||
[0x6E,0x00],
|
||||
[0x6F,0x00],
|
||||
[0x70,0x80],
|
||||
[0x71,0x00],
|
||||
[0x72,0x00],
|
||||
[0x73,0x00],
|
||||
[0x74,0xF0],
|
||||
[0x75,0x00],
|
||||
[0x80,0x42],
|
||||
[0x81,0x44],
|
||||
[0x82,0x04],
|
||||
[0x83,0x20],
|
||||
[0x84,0x20],
|
||||
[0x85,0x00],
|
||||
[0x86,0x10],
|
||||
[0x87,0x00],
|
||||
[0x88,0x05],
|
||||
[0x89,0x18],
|
||||
[0x8A,0x10],
|
||||
[0x8B,0x01],
|
||||
[0x8C,0x37],
|
||||
[0x8D,0x00],
|
||||
[0x8E,0xF0],
|
||||
[0x8F,0x81],
|
||||
[0x90,0x06],
|
||||
[0x91,0x06],
|
||||
[0x92,0x1E],
|
||||
[0x93,0x0D],
|
||||
[0x94,0x0A],
|
||||
[0x95,0x0A],
|
||||
[0x96,0x0C],
|
||||
[0x97,0x05],
|
||||
[0x98,0x0A],
|
||||
[0x99,0x41],
|
||||
[0x9A,0x14],
|
||||
[0x9B,0x0A],
|
||||
[0x9C,0x3F],
|
||||
[0x9D,0x33],
|
||||
[0x9E,0xAE],
|
||||
[0x9F,0xF9],
|
||||
[0xA0,0x48],
|
||||
[0xA1,0x13],
|
||||
[0xA2,0x10],
|
||||
[0xA3,0x08],
|
||||
[0xA4,0x30],
|
||||
[0xA5,0x19],
|
||||
[0xA6,0x10],
|
||||
[0xA7,0x08],
|
||||
[0xA8,0x24],
|
||||
[0xA9,0x04],
|
||||
[0xAA,0x1E],
|
||||
[0xAB,0x1E],
|
||||
[0xCC,0x19],
|
||||
[0xCD,0x0B],
|
||||
[0xCE,0x13],
|
||||
[0xCF,0x64],
|
||||
[0xD0,0x21],
|
||||
[0xD1,0x0F],
|
||||
[0xD2,0x88],
|
||||
[0xE0,0x01],
|
||||
[0xE1,0x04],
|
||||
[0xE2,0x41],
|
||||
[0xE3,0xD6],
|
||||
[0xE4,0x00],
|
||||
[0xE5,0x0C],
|
||||
[0xE6,0x0A],
|
||||
[0xE7,0x00],
|
||||
[0xE8,0x00],
|
||||
[0xE9,0x00],
|
||||
[0xEE,0x07],
|
||||
[0xEF,0x01],
|
||||
[0x00,0x1E],
|
||||
[0x01,0x1E],
|
||||
[0x02,0x0F],
|
||||
[0x03,0x10],
|
||||
[0x04,0x02],
|
||||
[0x05,0x00],
|
||||
[0x06,0xB0],
|
||||
[0x07,0x04],
|
||||
[0x08,0x0D],
|
||||
[0x09,0x0E],
|
||||
[0x0A,0x9C],
|
||||
[0x0B,0x04],
|
||||
[0x0C,0x05],
|
||||
[0x0D,0x0F],
|
||||
[0x0E,0x02],
|
||||
[0x0F,0x12],
|
||||
[0x10,0x02],
|
||||
[0x11,0x02],
|
||||
[0x12,0x00],
|
||||
[0x13,0x01],
|
||||
[0x14,0x05],
|
||||
[0x15,0x07],
|
||||
[0x16,0x05],
|
||||
[0x17,0x07],
|
||||
[0x18,0x01],
|
||||
[0x19,0x04],
|
||||
[0x1A,0x05],
|
||||
[0x1B,0x0C],
|
||||
[0x1C,0x2A],
|
||||
[0x1D,0x01],
|
||||
[0x1E,0x00],
|
||||
[0x21,0x00],
|
||||
[0x22,0x00],
|
||||
[0x23,0x00],
|
||||
[0x25,0x01],
|
||||
[0x26,0x00],
|
||||
[0x27,0x39],
|
||||
[0x28,0x7F],
|
||||
[0x29,0x08],
|
||||
[0x30,0x03],
|
||||
[0x31,0x00],
|
||||
[0x32,0x1A],
|
||||
[0x33,0x1A],
|
||||
[0x34,0x07],
|
||||
[0x35,0x07],
|
||||
[0x36,0x01],
|
||||
[0x37,0xFF],
|
||||
[0x38,0x36],
|
||||
[0x39,0x07],
|
||||
[0x3A,0x00],
|
||||
[0x3E,0xFF],
|
||||
[0x3F,0x00],
|
||||
[0x40,0x77],
|
||||
[0x41,0x40],
|
||||
[0x42,0x00],
|
||||
[0x43,0x30],
|
||||
[0x44,0xA0],
|
||||
[0x45,0x5C],
|
||||
[0x46,0x00],
|
||||
[0x47,0x00],
|
||||
[0x48,0x58],
|
||||
[0x4A,0x1E],
|
||||
[0x4B,0x1E],
|
||||
[0x4C,0x00],
|
||||
[0x4D,0x00],
|
||||
[0x4E,0xA0],
|
||||
[0x4F,0x80],
|
||||
[0x50,0x00],
|
||||
[0x51,0x00],
|
||||
[0x52,0x00],
|
||||
[0x53,0x00],
|
||||
[0x54,0x00],
|
||||
[0x57,0x80],
|
||||
[0x59,0x10],
|
||||
[0x5A,0x08],
|
||||
[0x5B,0x94],
|
||||
[0x5C,0xE8],
|
||||
[0x5D,0x08],
|
||||
[0x5E,0x3D],
|
||||
[0x5F,0x99],
|
||||
[0x60,0x45],
|
||||
[0x61,0x40],
|
||||
[0x63,0x2D],
|
||||
[0x64,0x02],
|
||||
[0x65,0x96],
|
||||
[0x66,0x00],
|
||||
[0x67,0x97],
|
||||
[0x68,0x01],
|
||||
[0x69,0xCD],
|
||||
[0x6A,0x01],
|
||||
[0x6B,0xB0],
|
||||
[0x6C,0x04],
|
||||
[0x6D,0x2C],
|
||||
[0x6E,0x01],
|
||||
[0x6F,0x32],
|
||||
[0x71,0x00],
|
||||
[0x72,0x01],
|
||||
[0x73,0x35],
|
||||
[0x74,0x00],
|
||||
[0x75,0x33],
|
||||
[0x76,0x31],
|
||||
[0x77,0x01],
|
||||
[0x7C,0x84],
|
||||
[0x7D,0x03],
|
||||
[0x7E,0x01])
|
||||
|
||||
#Enable debug message
|
||||
debug=0
|
||||
|
||||
#Initialize the sensors
|
||||
def init(self):
|
||||
time.sleep(.001)
|
||||
self.paj7620SelectBank(self.BANK0)
|
||||
self.paj7620SelectBank(self.BANK0)
|
||||
|
||||
data0 = self.paj7620ReadReg(0, 1)[0]
|
||||
data1 = self.paj7620ReadReg(1, 1)[0]
|
||||
if self.debug:
|
||||
print("data0:",data0,"data1:",data1, flush=True, end="")
|
||||
if data0 != 0x20 :#or data1 <> 0x76:
|
||||
print("Error with sensor", flush=True, end="")
|
||||
#return 0xff
|
||||
if data0 == 0x20:
|
||||
print("wake-up finish.", flush=True, end="")
|
||||
|
||||
for i in range(len(self.initRegisterArray)):
|
||||
self.paj7620WriteReg(self.initRegisterArray[i][0],self.initRegisterArray[i][1])
|
||||
|
||||
self.paj7620SelectBank(self.BANK0)
|
||||
|
||||
print("Paj7620 initialize register finished.", flush=True, end="")
|
||||
|
||||
#Write a byte to a register on the Gesture sensor
|
||||
def paj7620WriteReg(self,addr,cmd):
|
||||
bus.write_word_data(self.PAJ7620_ID, addr, cmd)
|
||||
|
||||
#Select a register bank on the Gesture Sensor
|
||||
def paj7620SelectBank(self,bank):
|
||||
if bank==self.BANK0:
|
||||
self.paj7620WriteReg(self.PAJ7620_REGITER_BANK_SEL, self.PAJ7620_BANK0)
|
||||
|
||||
#Read a block of bytes of length "qty" starting at address "addr" from the Gesture sensor
|
||||
def paj7620ReadReg(self,addr,qty):
|
||||
return bus.read_i2c_block_data(self.PAJ7620_ID, addr,qty)
|
||||
|
||||
#Print the values from the gesture sensor
|
||||
def print_gesture(self):
|
||||
data=self.paj7620ReadReg(0x43,1)[0]
|
||||
if data==self.GES_RIGHT_FLAG:
|
||||
time.sleep(self.GES_ENTRY_TIME)
|
||||
data=self.paj7620ReadReg(0x43, 1)[0]
|
||||
if data == self.GES_FORWARD_FLAG:
|
||||
print("1", flush=True, end="")
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
elif data == self.GES_BACKWARD_FLAG:
|
||||
print("2", flush=True, end="")
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
else:
|
||||
print("3", flush=True, end="")
|
||||
|
||||
elif data==self.GES_LEFT_FLAG:
|
||||
time.sleep(self.GES_ENTRY_TIME)
|
||||
data=self.paj7620ReadReg(0x43, 1)[0]
|
||||
if data == self.GES_FORWARD_FLAG:
|
||||
print("1", flush=True, end="")
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
elif data == self.GES_BACKWARD_FLAG:
|
||||
print("2", flush=True, end="")
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
else:
|
||||
print("4", flush=True, end="")
|
||||
|
||||
elif data==self.GES_UP_FLAG:
|
||||
time.sleep(self.GES_ENTRY_TIME)
|
||||
data=self.paj7620ReadReg(0x43, 1)[0]
|
||||
if data == self.GES_FORWARD_FLAG:
|
||||
print("1", flush=True, end="")
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
elif data == self.GES_BACKWARD_FLAG:
|
||||
print("2", flush=True, end="")
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
else:
|
||||
print("5", flush=True, end="")
|
||||
|
||||
elif data==self.GES_DOWN_FLAG:
|
||||
time.sleep(self.GES_ENTRY_TIME)
|
||||
data=self.paj7620ReadReg(0x43, 1)[0]
|
||||
if data == self.GES_FORWARD_FLAG:
|
||||
print("1", flush=True, end="")
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
elif data == self.GES_BACKWARD_FLAG:
|
||||
print("2", flush=True, end="")
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
else:
|
||||
print("6", flush=True, end="")
|
||||
|
||||
elif data==self.GES_FORWARD_FLAG:
|
||||
print("1", flush=True, end="")
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
|
||||
elif data==self.GES_BACKWARD_FLAG:
|
||||
print("2", flush=True, end="")
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
|
||||
elif data==self.GES_CLOCKWISE_FLAG:
|
||||
print("7", flush=True, end="")
|
||||
|
||||
elif data==self.GES_COUNT_CLOCKWISE_FLAG:
|
||||
print("8", flush=True, end="")
|
||||
|
||||
else:
|
||||
data1=self.paj7620ReadReg(0x44, 1)[0]
|
||||
if (data1 == self.GES_WAVE_FLAG):
|
||||
print("9", flush=True, end="")
|
||||
|
||||
#Return a vlaue from the gestire sensor which can be used in a program
|
||||
# 0:nothing
|
||||
# 1:Forward
|
||||
# 2:Backward
|
||||
# 3:Right
|
||||
# 4:Left
|
||||
# 5:Up
|
||||
# 6:Down
|
||||
# 7:Clockwise
|
||||
# 8:anti-clockwise
|
||||
# 9:wave
|
||||
def return_gesture(self):
|
||||
|
||||
data=self.paj7620ReadReg(0x43,1)[0]
|
||||
if data==self.GES_RIGHT_FLAG:
|
||||
time.sleep(self.GES_ENTRY_TIME)
|
||||
data=self.paj7620ReadReg(0x43, 1)[0]
|
||||
if data == self.GES_FORWARD_FLAG:
|
||||
return 1
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
elif data == self.GES_BACKWARD_FLAG:
|
||||
return 2
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
else:
|
||||
return 3
|
||||
|
||||
elif data==self.GES_LEFT_FLAG:
|
||||
time.sleep(self.GES_ENTRY_TIME)
|
||||
data=self.paj7620ReadReg(0x43, 1)[0]
|
||||
if data == self.GES_FORWARD_FLAG:
|
||||
return 1
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
elif data == self.GES_BACKWARD_FLAG:
|
||||
return 2
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
else:
|
||||
return 4
|
||||
|
||||
elif data==self.GES_UP_FLAG:
|
||||
time.sleep(self.GES_ENTRY_TIME)
|
||||
data=self.paj7620ReadReg(0x43, 1)[0]
|
||||
if data == self.GES_FORWARD_FLAG:
|
||||
return 1
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
elif data == self.GES_BACKWARD_FLAG:
|
||||
return 2
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
else:
|
||||
return 5
|
||||
|
||||
elif data==self.GES_DOWN_FLAG:
|
||||
time.sleep(self.GES_ENTRY_TIME)
|
||||
data=self.paj7620ReadReg(0x43, 1)[0]
|
||||
if data == self.GES_FORWARD_FLAG:
|
||||
return 1
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
elif data == self.GES_BACKWARD_FLAG:
|
||||
return 2
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
else:
|
||||
return 6
|
||||
|
||||
elif data==self.GES_FORWARD_FLAG:
|
||||
return 1
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
|
||||
elif data==self.GES_BACKWARD_FLAG:
|
||||
return 2
|
||||
time.sleep(self.GES_QUIT_TIME)
|
||||
|
||||
elif data==self.GES_CLOCKWISE_FLAG:
|
||||
return 7
|
||||
|
||||
elif data==self.GES_COUNT_CLOCKWISE_FLAG:
|
||||
return 8
|
||||
|
||||
else:
|
||||
data1=self.paj7620ReadReg(0x44, 1)[0]
|
||||
if (data1 == self.GES_WAVE_FLAG):
|
||||
return 9
|
||||
return 0
|
||||
|
||||
if __name__ == "__main__":
|
||||
g=gesture()
|
||||
g.init()
|
||||
while True:
|
||||
g.print_gesture()
|
||||
time.sleep(.1)
|
||||
# print g.return_gesture()
|
||||
# time.sleep(.1)
|
41
local_modules/@ocogeclub/amg8833/AMG8833.js
Normal file
41
local_modules/@ocogeclub/amg8833/AMG8833.js
Normal file
@ -0,0 +1,41 @@
|
||||
'use strict';
|
||||
|
||||
const pig = require('@ocogeclub/pigpio');
|
||||
|
||||
let pi = -1;
|
||||
let i2c_hand = -1;
|
||||
exports.init = (i2c_bus, i2c_addr) => {
|
||||
if (pi < 0) pi = pig._pigpio_start('', '');
|
||||
if (i2c_hand < 0) pig._i2c_close(pi, i2c_hand);
|
||||
i2c_hand = pig._i2c_open(pi, i2c_bus, i2c_addr);
|
||||
pig._i2c_write_byte_data(pi, i2c_hand, 0x00, 0x00); //Normal mode
|
||||
pig._i2c_write_byte_data(pi, i2c_hand, 0x02, 0x00); //10FPS
|
||||
}
|
||||
|
||||
exports.read_temp_array = () => {
|
||||
let linedata = [];
|
||||
for (let i = 0; i < 8; i++) {
|
||||
let data = pig._i2c_read_i2c_block_data(pi, i2c_hand, 0x80 + 0x10 * i, 16);
|
||||
let oneline = [];
|
||||
for (let j = 0; j < 8; j++) {
|
||||
oneline.push(((data[2 * j + 1] & 0x07) * 256 + data[2 * j]) * 0.25);
|
||||
}
|
||||
linedata.push(oneline);
|
||||
}
|
||||
return linedata;
|
||||
}
|
||||
|
||||
exports.stop = () => {
|
||||
if (i2c_hand >= 0) {
|
||||
pig._i2c_close(pi, i2c_hand);
|
||||
i2c_hand = -1;
|
||||
}
|
||||
if (pi >= 0) {
|
||||
pig._pigpio_stop(pi);
|
||||
pi = -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This code was ported from https://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot381i2c-amg8833.html
|
||||
*/
|
10
local_modules/@ocogeclub/amg8833/package.json
Normal file
10
local_modules/@ocogeclub/amg8833/package.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"name": "@ocogeclub/amg8833",
|
||||
"version": "0.0.1",
|
||||
"main": "AMG8833.js",
|
||||
"private": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@ocogeclub/pigpio": "file:../pigpio"
|
||||
}
|
||||
}
|
472
local_modules/@ocogeclub/paj7620/PAJ7620.js
Normal file
472
local_modules/@ocogeclub/paj7620/PAJ7620.js
Normal file
@ -0,0 +1,472 @@
|
||||
"use strict";
|
||||
|
||||
const pig = require('@ocogeclub/pigpio');
|
||||
|
||||
const sleep = sec =>
|
||||
new Promise(r => setTimeout(r, sec * 1000));
|
||||
|
||||
const GES_REACTION_TIME = .100; // default:0.5 // You can adjust the reaction time according to the actual circumstance.
|
||||
const GES_ENTRY_TIME = .050; // default:0.8 // When you want to recognize the Forward/Backward gestures, your gestures' reaction time must less than GES_ENTRY_TIME(0.8s).
|
||||
const GES_QUIT_TIME = 1.000;
|
||||
|
||||
const BANK0 = 0;
|
||||
const BANK1 = 1;
|
||||
|
||||
const PAJ7620_ADDR_BASE = 0x00;
|
||||
|
||||
//REGISTER BANK SELECT
|
||||
const PAJ7620_REGITER_BANK_SEL = (PAJ7620_ADDR_BASE + 0xEF); //W
|
||||
|
||||
//DEVICE ID
|
||||
// const PAJ7620_ID = 0x73;
|
||||
|
||||
//REGISTER BANK 0
|
||||
const PAJ7620_ADDR_SUSPEND_CMD = (PAJ7620_ADDR_BASE + 0x3); //W
|
||||
const PAJ7620_ADDR_GES_PS_DET_MASK_0 = (PAJ7620_ADDR_BASE + 0x41); //RW
|
||||
const PAJ7620_ADDR_GES_PS_DET_MASK_1 = (PAJ7620_ADDR_BASE + 0x42); //RW
|
||||
const PAJ7620_ADDR_GES_PS_DET_FLAG_0 = (PAJ7620_ADDR_BASE + 0x43); //R
|
||||
const PAJ7620_ADDR_GES_PS_DET_FLAG_1 = (PAJ7620_ADDR_BASE + 0x44); //R
|
||||
const PAJ7620_ADDR_STATE_INDICATOR = (PAJ7620_ADDR_BASE + 0x45); //R
|
||||
const PAJ7620_ADDR_PS_HIGH_THRESHOLD = (PAJ7620_ADDR_BASE + 0x69); //RW
|
||||
const PAJ7620_ADDR_PS_LOW_THRESHOLD = (PAJ7620_ADDR_BASE + 0x6A); //RW
|
||||
const PAJ7620_ADDR_PS_APPROACH_STATE = (PAJ7620_ADDR_BASE + 0x6B); //R
|
||||
const PAJ7620_ADDR_PS_RAW_DATA = (PAJ7620_ADDR_BASE + 0x6C); //R
|
||||
|
||||
//REGISTER BANK 1
|
||||
const PAJ7620_ADDR_PS_GAIN = (PAJ7620_ADDR_BASE + 0x44); //RW
|
||||
const PAJ7620_ADDR_IDLE_S1_STEP_0 = (PAJ7620_ADDR_BASE + 0x67); //RW
|
||||
const PAJ7620_ADDR_IDLE_S1_STEP_1 = (PAJ7620_ADDR_BASE + 0x68); //RW
|
||||
const PAJ7620_ADDR_IDLE_S2_STEP_0 = (PAJ7620_ADDR_BASE + 0x69); //RW
|
||||
const PAJ7620_ADDR_IDLE_S2_STEP_1 = (PAJ7620_ADDR_BASE + 0x6A); //RW
|
||||
const PAJ7620_ADDR_OP_TO_S1_STEP_0 = (PAJ7620_ADDR_BASE + 0x6B); //RW
|
||||
const PAJ7620_ADDR_OP_TO_S1_STEP_1 = (PAJ7620_ADDR_BASE + 0x6C); //RW
|
||||
const PAJ7620_ADDR_OP_TO_S2_STEP_0 = (PAJ7620_ADDR_BASE + 0x6D); //RW
|
||||
const PAJ7620_ADDR_OP_TO_S2_STEP_1 = (PAJ7620_ADDR_BASE + 0x6E); //RW
|
||||
const PAJ7620_ADDR_OPERATION_ENABLE = (PAJ7620_ADDR_BASE + 0x72); //RW
|
||||
|
||||
//PAJ7620_REGITER_BANK_SEL
|
||||
const PAJ7620_BANK0 = 0;
|
||||
const PAJ7620_BANK1 = 1;
|
||||
|
||||
//PAJ7620_ADDR_SUSPEND_CMD
|
||||
const PAJ7620_I2C_WAKEUP = 1;
|
||||
const PAJ7620_I2C_SUSPEND = 0;
|
||||
|
||||
//PAJ7620_ADDR_OPERATION_ENABLE
|
||||
const PAJ7620_ENABLE = 1;
|
||||
const PAJ7620_DISABLE = 0;
|
||||
|
||||
//ADC, delete
|
||||
const REG_ADDR_RESULT = 0x00;
|
||||
const REG_ADDR_ALERT = 0x01;
|
||||
const REG_ADDR_CONFIG = 0x02;
|
||||
const REG_ADDR_LIMITL = 0x03;
|
||||
const REG_ADDR_LIMITH = 0x04;
|
||||
const REG_ADDR_HYST = 0x05;
|
||||
const REG_ADDR_CONVL = 0x06;
|
||||
const REG_ADDR_CONVH = 0x07;
|
||||
|
||||
const GES_RIGHT_FLAG = 1 << 0;
|
||||
const GES_LEFT_FLAG = 1 << 1;
|
||||
const GES_UP_FLAG = 1 << 2;
|
||||
const GES_DOWN_FLAG = 1 << 3;
|
||||
const GES_FORWARD_FLAG = 1 << 4;
|
||||
const GES_BACKWARD_FLAG = 1 << 5;
|
||||
const GES_CLOCKWISE_FLAG = 1 << 6;
|
||||
const GES_COUNT_CLOCKWISE_FLAG = 1 << 7;
|
||||
const GES_WAVE_FLAG = 1 << 0;
|
||||
|
||||
//Gesture output
|
||||
exports.FORWARD = 1;
|
||||
exports.BACKWARD = 2;
|
||||
exports.RIGHT = 3;
|
||||
exports.LEFT = 4;
|
||||
exports.UP = 5;
|
||||
exports.DOWN = 6;
|
||||
exports.CLOCKWISE = 7;
|
||||
exports.ANTI_CLOCKWISE = 8;
|
||||
exports.WAVE = 9;
|
||||
|
||||
//Initial register state
|
||||
const initRegisterArray = [
|
||||
[0xEF, 0x00],
|
||||
[0x32, 0x29],
|
||||
[0x33, 0x01],
|
||||
[0x34, 0x00],
|
||||
[0x35, 0x01],
|
||||
[0x36, 0x00],
|
||||
[0x37, 0x07],
|
||||
[0x38, 0x17],
|
||||
[0x39, 0x06],
|
||||
[0x3A, 0x12],
|
||||
[0x3F, 0x00],
|
||||
[0x40, 0x02],
|
||||
[0x41, 0xFF],
|
||||
[0x42, 0x01],
|
||||
[0x46, 0x2D],
|
||||
[0x47, 0x0F],
|
||||
[0x48, 0x3C],
|
||||
[0x49, 0x00],
|
||||
[0x4A, 0x1E],
|
||||
[0x4B, 0x00],
|
||||
[0x4C, 0x20],
|
||||
[0x4D, 0x00],
|
||||
[0x4E, 0x1A],
|
||||
[0x4F, 0x14],
|
||||
[0x50, 0x00],
|
||||
[0x51, 0x10],
|
||||
[0x52, 0x00],
|
||||
[0x5C, 0x02],
|
||||
[0x5D, 0x00],
|
||||
[0x5E, 0x10],
|
||||
[0x5F, 0x3F],
|
||||
[0x60, 0x27],
|
||||
[0x61, 0x28],
|
||||
[0x62, 0x00],
|
||||
[0x63, 0x03],
|
||||
[0x64, 0xF7],
|
||||
[0x65, 0x03],
|
||||
[0x66, 0xD9],
|
||||
[0x67, 0x03],
|
||||
[0x68, 0x01],
|
||||
[0x69, 0xC8],
|
||||
[0x6A, 0x40],
|
||||
[0x6D, 0x04],
|
||||
[0x6E, 0x00],
|
||||
[0x6F, 0x00],
|
||||
[0x70, 0x80],
|
||||
[0x71, 0x00],
|
||||
[0x72, 0x00],
|
||||
[0x73, 0x00],
|
||||
[0x74, 0xF0],
|
||||
[0x75, 0x00],
|
||||
[0x80, 0x42],
|
||||
[0x81, 0x44],
|
||||
[0x82, 0x04],
|
||||
[0x83, 0x20],
|
||||
[0x84, 0x20],
|
||||
[0x85, 0x00],
|
||||
[0x86, 0x10],
|
||||
[0x87, 0x00],
|
||||
[0x88, 0x05],
|
||||
[0x89, 0x18],
|
||||
[0x8A, 0x10],
|
||||
[0x8B, 0x01],
|
||||
[0x8C, 0x37],
|
||||
[0x8D, 0x00],
|
||||
[0x8E, 0xF0],
|
||||
[0x8F, 0x81],
|
||||
[0x90, 0x06],
|
||||
[0x91, 0x06],
|
||||
[0x92, 0x1E],
|
||||
[0x93, 0x0D],
|
||||
[0x94, 0x0A],
|
||||
[0x95, 0x0A],
|
||||
[0x96, 0x0C],
|
||||
[0x97, 0x05],
|
||||
[0x98, 0x0A],
|
||||
[0x99, 0x41],
|
||||
[0x9A, 0x14],
|
||||
[0x9B, 0x0A],
|
||||
[0x9C, 0x3F],
|
||||
[0x9D, 0x33],
|
||||
[0x9E, 0xAE],
|
||||
[0x9F, 0xF9],
|
||||
[0xA0, 0x48],
|
||||
[0xA1, 0x13],
|
||||
[0xA2, 0x10],
|
||||
[0xA3, 0x08],
|
||||
[0xA4, 0x30],
|
||||
[0xA5, 0x19],
|
||||
[0xA6, 0x10],
|
||||
[0xA7, 0x08],
|
||||
[0xA8, 0x24],
|
||||
[0xA9, 0x04],
|
||||
[0xAA, 0x1E],
|
||||
[0xAB, 0x1E],
|
||||
[0xCC, 0x19],
|
||||
[0xCD, 0x0B],
|
||||
[0xCE, 0x13],
|
||||
[0xCF, 0x64],
|
||||
[0xD0, 0x21],
|
||||
[0xD1, 0x0F],
|
||||
[0xD2, 0x88],
|
||||
[0xE0, 0x01],
|
||||
[0xE1, 0x04],
|
||||
[0xE2, 0x41],
|
||||
[0xE3, 0xD6],
|
||||
[0xE4, 0x00],
|
||||
[0xE5, 0x0C],
|
||||
[0xE6, 0x0A],
|
||||
[0xE7, 0x00],
|
||||
[0xE8, 0x00],
|
||||
[0xE9, 0x00],
|
||||
[0xEE, 0x07],
|
||||
[0xEF, 0x01],
|
||||
[0x00, 0x1E],
|
||||
[0x01, 0x1E],
|
||||
[0x02, 0x0F],
|
||||
[0x03, 0x10],
|
||||
[0x04, 0x02],
|
||||
[0x05, 0x00],
|
||||
[0x06, 0xB0],
|
||||
[0x07, 0x04],
|
||||
[0x08, 0x0D],
|
||||
[0x09, 0x0E],
|
||||
[0x0A, 0x9C],
|
||||
[0x0B, 0x04],
|
||||
[0x0C, 0x05],
|
||||
[0x0D, 0x0F],
|
||||
[0x0E, 0x02],
|
||||
[0x0F, 0x12],
|
||||
[0x10, 0x02],
|
||||
[0x11, 0x02],
|
||||
[0x12, 0x00],
|
||||
[0x13, 0x01],
|
||||
[0x14, 0x05],
|
||||
[0x15, 0x07],
|
||||
[0x16, 0x05],
|
||||
[0x17, 0x07],
|
||||
[0x18, 0x01],
|
||||
[0x19, 0x04],
|
||||
[0x1A, 0x05],
|
||||
[0x1B, 0x0C],
|
||||
[0x1C, 0x2A],
|
||||
[0x1D, 0x01],
|
||||
[0x1E, 0x00],
|
||||
[0x21, 0x00],
|
||||
[0x22, 0x00],
|
||||
[0x23, 0x00],
|
||||
[0x25, 0x01],
|
||||
[0x26, 0x00],
|
||||
[0x27, 0x39],
|
||||
[0x28, 0x7F],
|
||||
[0x29, 0x08],
|
||||
[0x30, 0x03],
|
||||
[0x31, 0x00],
|
||||
[0x32, 0x1A],
|
||||
[0x33, 0x1A],
|
||||
[0x34, 0x07],
|
||||
[0x35, 0x07],
|
||||
[0x36, 0x01],
|
||||
[0x37, 0xFF],
|
||||
[0x38, 0x36],
|
||||
[0x39, 0x07],
|
||||
[0x3A, 0x00],
|
||||
[0x3E, 0xFF],
|
||||
[0x3F, 0x00],
|
||||
[0x40, 0x77],
|
||||
[0x41, 0x40],
|
||||
[0x42, 0x00],
|
||||
[0x43, 0x30],
|
||||
[0x44, 0xA0],
|
||||
[0x45, 0x5C],
|
||||
[0x46, 0x00],
|
||||
[0x47, 0x00],
|
||||
[0x48, 0x58],
|
||||
[0x4A, 0x1E],
|
||||
[0x4B, 0x1E],
|
||||
[0x4C, 0x00],
|
||||
[0x4D, 0x00],
|
||||
[0x4E, 0xA0],
|
||||
[0x4F, 0x80],
|
||||
[0x50, 0x00],
|
||||
[0x51, 0x00],
|
||||
[0x52, 0x00],
|
||||
[0x53, 0x00],
|
||||
[0x54, 0x00],
|
||||
[0x57, 0x80],
|
||||
[0x59, 0x10],
|
||||
[0x5A, 0x08],
|
||||
[0x5B, 0x94],
|
||||
[0x5C, 0xE8],
|
||||
[0x5D, 0x08],
|
||||
[0x5E, 0x3D],
|
||||
[0x5F, 0x99],
|
||||
[0x60, 0x45],
|
||||
[0x61, 0x40],
|
||||
[0x63, 0x2D],
|
||||
[0x64, 0x02],
|
||||
[0x65, 0x96],
|
||||
[0x66, 0x00],
|
||||
[0x67, 0x97],
|
||||
[0x68, 0x01],
|
||||
[0x69, 0xCD],
|
||||
[0x6A, 0x01],
|
||||
[0x6B, 0xB0],
|
||||
[0x6C, 0x04],
|
||||
[0x6D, 0x2C],
|
||||
[0x6E, 0x01],
|
||||
[0x6F, 0x32],
|
||||
[0x71, 0x00],
|
||||
[0x72, 0x01],
|
||||
[0x73, 0x35],
|
||||
[0x74, 0x00],
|
||||
[0x75, 0x33],
|
||||
[0x76, 0x31],
|
||||
[0x77, 0x01],
|
||||
[0x7C, 0x84],
|
||||
[0x7D, 0x03],
|
||||
[0x7E, 0x01]
|
||||
];
|
||||
|
||||
//Enable debug message
|
||||
const debug = 0;
|
||||
|
||||
let pi = -1;
|
||||
let i2c_hand = -1;
|
||||
//Initialize the sensors
|
||||
exports.init = async (i2c_bus, i2c_addr) => {
|
||||
if (pi < 0) pi = pig._pigpio_start('', '');
|
||||
if (i2c_hand < 0) pig._i2c_close(pi, i2c_hand);
|
||||
i2c_hand = pig._i2c_open(pi, i2c_bus, i2c_addr);
|
||||
|
||||
await sleep(.001);
|
||||
paj7620SelectBank(BANK0);
|
||||
paj7620SelectBank(BANK0);
|
||||
|
||||
let data0 = paj7620ReadReg(0, 1)[0];
|
||||
let data1 = paj7620ReadReg(1, 1)[0];
|
||||
if (debug)
|
||||
console.log("data0" + data0 + "data1" + data1);
|
||||
if (data0 != 0x20) //or data1 <> 0x76
|
||||
console.log("Error with sensor");
|
||||
//return 0xff
|
||||
if (data0 == 0x20)
|
||||
console.log("wake-up finish.");
|
||||
|
||||
for (let i = 0; i < initRegisterArray.length; i += 1)
|
||||
paj7620WriteReg(initRegisterArray[i][0], initRegisterArray[i][1]);
|
||||
|
||||
paj7620SelectBank(BANK0);
|
||||
|
||||
console.log("Paj7620 initialize register finished.");
|
||||
|
||||
}
|
||||
|
||||
// Write a byte to a register on the Gesture sensor
|
||||
const paj7620WriteReg = (addr, cmd) =>
|
||||
pig._i2c_write_word_data(pi, i2c_hand, addr, cmd);
|
||||
|
||||
//Select a register bank on the Gesture Sensor
|
||||
const paj7620SelectBank = bank => {
|
||||
if (bank == BANK0)
|
||||
paj7620WriteReg(PAJ7620_REGITER_BANK_SEL, PAJ7620_BANK0);
|
||||
}
|
||||
|
||||
//Read a block of bytes of length "qty" starting at address "addr" from the Gesture sensor
|
||||
const paj7620ReadReg = (addr, qty) => {
|
||||
return pig._i2c_read_i2c_block_data(pi, i2c_hand, addr, qty);
|
||||
}
|
||||
|
||||
//Return a vlaue from the gestire sensor which can be used in a program
|
||||
// 0:nothing
|
||||
// 1:Forward
|
||||
// 2:Backward
|
||||
// 3:Right
|
||||
// 4:Left
|
||||
// 5:Up
|
||||
// 6:Down
|
||||
// 7:Clockwise
|
||||
// 8:anti-clockwise
|
||||
// 9:wave
|
||||
exports.return_gesture = async () => {
|
||||
|
||||
let data = paj7620ReadReg(0x43, 1)[0];
|
||||
if (data == GES_RIGHT_FLAG) {
|
||||
await sleep(GES_ENTRY_TIME);
|
||||
data = paj7620ReadReg(0x43, 1)[0];
|
||||
if (data == GES_FORWARD_FLAG) {
|
||||
return 1;
|
||||
// await sleep(GES_QUIT_TIME);
|
||||
}
|
||||
else if (data == GES_BACKWARD_FLAG) {
|
||||
return 2;
|
||||
// await sleep(GES_QUIT_TIME);
|
||||
}
|
||||
else
|
||||
return 3;
|
||||
}
|
||||
|
||||
else if (data == GES_LEFT_FLAG) {
|
||||
await sleep(GES_ENTRY_TIME);
|
||||
data = paj7620ReadReg(0x43, 1)[0];
|
||||
if (data == GES_FORWARD_FLAG) {
|
||||
return 1;
|
||||
// await sleep(GES_QUIT_TIME);
|
||||
}
|
||||
else if (data == GES_BACKWARD_FLAG) {
|
||||
return 2;
|
||||
// await sleep(GES_QUIT_TIME);
|
||||
}
|
||||
else
|
||||
return 4;
|
||||
}
|
||||
|
||||
else if (data == GES_UP_FLAG) {
|
||||
await sleep(GES_ENTRY_TIME);
|
||||
data = paj7620ReadReg(0x43, 1)[0];
|
||||
if (data == GES_FORWARD_FLAG) {
|
||||
return 1;
|
||||
// await sleep(GES_QUIT_TIME);
|
||||
}
|
||||
else if (data == GES_BACKWARD_FLAG) {
|
||||
return 2;
|
||||
// await sleep(GES_QUIT_TIME);
|
||||
}
|
||||
else
|
||||
return 5;
|
||||
}
|
||||
|
||||
else if (data == GES_DOWN_FLAG) {
|
||||
await sleep(GES_ENTRY_TIME);
|
||||
data = paj7620ReadReg(0x43, 1)[0];
|
||||
if (data == GES_FORWARD_FLAG) {
|
||||
return 1;
|
||||
// await sleep(GES_QUIT_TIME);
|
||||
}
|
||||
else if (data == GES_BACKWARD_FLAG) {
|
||||
return 2;
|
||||
// await sleep(GES_QUIT_TIME);
|
||||
}
|
||||
else
|
||||
return 6;
|
||||
}
|
||||
else if (data == GES_FORWARD_FLAG) {
|
||||
return 1;
|
||||
// await sleep(GES_QUIT_TIME);
|
||||
}
|
||||
|
||||
else if (data == GES_BACKWARD_FLAG) {
|
||||
return 2;
|
||||
// await sleep(GES_QUIT_TIME);
|
||||
}
|
||||
|
||||
else if (data == GES_CLOCKWISE_FLAG)
|
||||
return 7;
|
||||
|
||||
else if (data == GES_COUNT_CLOCKWISE_FLAG)
|
||||
return 8;
|
||||
|
||||
else {
|
||||
let data1 = paj7620ReadReg(0x44, 1)[0];
|
||||
if (data1 == GES_WAVE_FLAG)
|
||||
return 9;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
exports.stop = () => {
|
||||
if (i2c_hand >= 0) {
|
||||
pig._i2c_close(pi, i2c_hand);
|
||||
i2c_hand = -1;
|
||||
}
|
||||
if (pi >= 0) {
|
||||
pig._pigpio_stop(pi);
|
||||
pi = -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This code was ported from "Grove - Gesture Sensor v1.0 Python library and examples": https://github.com/DexterInd/GrovePi/tree/master/Software/Python/grove_gesture_sensor
|
||||
*/
|
10
local_modules/@ocogeclub/paj7620/package.json
Normal file
10
local_modules/@ocogeclub/paj7620/package.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"name": "@ocogeclub/paj7620",
|
||||
"version": "0.0.1",
|
||||
"main": "PAJ7620.js",
|
||||
"private": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@ocogeclub/pigpio": "file:../pigpio"
|
||||
}
|
||||
}
|
@ -81,6 +81,9 @@ module.exports.i2c_read_byte_data = reg => {
|
||||
module.exports.i2c_write_i2c_block_data = (reg, data) => {
|
||||
if (i2c_hand >= 0) return module.exports._i2c_write_i2c_block_data(pi, i2c_hand, reg, Buffer.from(data));
|
||||
}
|
||||
module.exports.i2c_read_word_data = reg => {
|
||||
if (i2c_hand >= 0) return module.exports._i2c_read_word_data(pi, i2c_hand, reg);
|
||||
}
|
||||
module.exports.i2c_read_device = count => {
|
||||
if (i2c_hand >= 0) return module.exports._i2c_read_device(pi, i2c_hand, count).toString('utf8');
|
||||
}
|
||||
|
@ -563,6 +563,30 @@ Value _i2cReadWordData(const CallbackInfo &info)
|
||||
i2c_read_word_data(pi, handle, i2c_reg));
|
||||
}
|
||||
|
||||
// I2Cハンドルに関連付けられているデバイスの指定されたレジスタに単一の16ビットワードを書き込む
|
||||
Value _i2cWriteWordData(const CallbackInfo &info)
|
||||
{
|
||||
Env env = info.Env();
|
||||
if (info.Length() < 4)
|
||||
{
|
||||
TypeError::New(env, "Wrong number of arguments")
|
||||
.ThrowAsJavaScriptException();
|
||||
return env.Null();
|
||||
}
|
||||
if (!info[0].IsNumber() || !info[1].IsNumber() || !info[2].IsNumber() || !info[3].IsNumber())
|
||||
{
|
||||
TypeError::New(env, "Wrong arguments").ThrowAsJavaScriptException();
|
||||
return env.Null();
|
||||
}
|
||||
int pi = info[0].As<Number>().Int32Value();
|
||||
unsigned int handle = info[1].As<Number>().Uint32Value();
|
||||
unsigned int i2c_reg = info[2].As<Number>().Uint32Value();
|
||||
unsigned int wVal = info[3].As<Number>().Uint32Value();
|
||||
|
||||
return Number::New(env,
|
||||
i2c_write_word_data(pi, handle, i2c_reg, wVal));
|
||||
}
|
||||
|
||||
// i2c デバイスからデータを受け取る
|
||||
Value _i2cReadDevice(const CallbackInfo &info)
|
||||
{
|
||||
@ -642,6 +666,7 @@ Init(Env env, Object exports)
|
||||
exports.Set(String::New(env, "_i2c_write_i2c_block_data"), Function::New(env, _i2cWriteI2cBlockData));
|
||||
exports.Set(String::New(env, "_i2c_read_i2c_block_data"), Function::New(env, _i2cReadI2cBlockData));
|
||||
exports.Set(String::New(env, "_i2c_read_word_data"), Function::New(env, _i2cReadWordData));
|
||||
exports.Set(String::New(env, "_i2c_write_word_data"), Function::New(env, _i2cWriteWordData));
|
||||
exports.Set(String::New(env, "_i2c_write_device"), Function::New(env, _i2cWriteDevice));
|
||||
exports.Set(String::New(env, "_i2c_read_device"), Function::New(env, _i2cReadDevice));
|
||||
return exports;
|
||||
|
1
main.js
1
main.js
@ -1,5 +1,6 @@
|
||||
const { app, BrowserWindow, Menu, session, ipcMain, dialog } = require('electron')
|
||||
const path = require('path')
|
||||
const fs = require('fs')
|
||||
|
||||
/** Force disable security warning */
|
||||
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'
|
||||
|
@ -19,11 +19,13 @@
|
||||
},
|
||||
"homepage": "https://github.com/ocogeclub/ocoge#readme",
|
||||
"devDependencies": {
|
||||
"electron": "15.0.0",
|
||||
"electron": "15.1.2",
|
||||
"electron-rebuild": "3.2.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ocogeclub/amg8833": "file:local_modules/@ocogeclub/amg8833",
|
||||
"@ocogeclub/bme280": "file:local_modules/@ocogeclub/bme280",
|
||||
"@ocogeclub/paj7620": "file:local_modules/@ocogeclub/paj7620",
|
||||
"@ocogeclub/pigpio": "file:local_modules/@ocogeclub/pigpio",
|
||||
"@tensorflow/tfjs-node": "^3.9.0",
|
||||
"@vladmandic/face-api": "^1.5.3",
|
||||
|
22
preload.js
22
preload.js
@ -1,22 +0,0 @@
|
||||
const electron = require("electron")
|
||||
const path = require('path')
|
||||
// const tf = require('@tensorflow/tfjs-node')
|
||||
electron.contextBridge.exposeInMainWorld(
|
||||
"ocogeapi",
|
||||
{
|
||||
// Electron固有:index.htmlから直接 <script src で呼ばれたJSファイルでのみ利用可
|
||||
electron_ipcRenderer: electron.ipcRenderer,
|
||||
electron_shell: electron.shell,
|
||||
// どこからでも呼び出し可
|
||||
fs: require('fs'),
|
||||
path: path,
|
||||
child_process: require('child_process'),
|
||||
tfjs_node: require('@tensorflow/tfjs-node'),
|
||||
// tfjs_node: tf,
|
||||
// face_api: require('@vladmandic/face-api/dist/face-api.node.js'),
|
||||
lgpio: require('@ocogeclub/lgpio'),
|
||||
bme280: require('@ocogeclub/bme280'),
|
||||
// グローバル変数
|
||||
gtest: 'qwerty' // テスト用
|
||||
}
|
||||
);
|
464
ugj_blocks.js
464
ugj_blocks.js
@ -156,6 +156,20 @@ Blockly.Python['ugj_controls_forEach'] = function (block) {
|
||||
].join('\n');
|
||||
return code;
|
||||
};
|
||||
// Custom Color Picker
|
||||
Blockly.FieldColour.COLOURS = [
|
||||
'#ffffff', '#808000', '#ffff00', '#ff00ff', '#ff4500',
|
||||
'#c0c0c0', '#00ffff', '#00ff00', '#ff0000', '#ff1493',
|
||||
'#808080', '#0000ff', '#008000', '#800080', '#8a2be2',
|
||||
'#000000', '#000080', '#008080', '#800000', '#2e8b57'
|
||||
];
|
||||
Blockly.FieldColour.TITLES = [
|
||||
'white', 'olive', 'yellow', 'magenta', 'orangered',
|
||||
'silver', 'aqua', 'lime', 'red', 'deeppink',
|
||||
'gray', 'blue', 'green', 'purple', 'blueviolet',
|
||||
'black', 'navy', 'teal', 'maroon', 'seagreen'
|
||||
];
|
||||
Blockly.FieldColour.COLUMNS = 5;
|
||||
|
||||
/** Additional Basic Blocks********************************************************************************* */
|
||||
var ugjCodecharDefinition = {
|
||||
@ -309,7 +323,7 @@ Blockly.JavaScript['ugj_gpio_open'] = function (block) {
|
||||
Blockly.JavaScript.provideFunction_(
|
||||
'require_gpio', [`const pi = require('@ocogeclub/` + elutil.gpio_backend + `');`]
|
||||
);
|
||||
var code = `pi.gpio_open();\n`; //
|
||||
var code = `console.log('pi='+pi.gpio_open());\n`; //
|
||||
return code;
|
||||
};
|
||||
Blockly.Python['ugj_gpio_open'] = function (block) {
|
||||
@ -806,7 +820,7 @@ Blockly.JavaScript['ugj_i2c_open'] = function (block) {
|
||||
Blockly.JavaScript.provideFunction_(
|
||||
'require_gpio', [`const pi = require('@ocogeclub/` + elutil.gpio_backend + `');`]
|
||||
);
|
||||
var code = `pi.i2c_open(${elutil.i2c_bus}, ${value_i2c_address});\n`;
|
||||
var code = `console.log('i2c_hand='+pi.i2c_open(${elutil.i2c_bus}, ${value_i2c_address}));\n`;
|
||||
return code;
|
||||
};
|
||||
Blockly.Python['ugj_i2c_open'] = function (block) {
|
||||
@ -1067,7 +1081,7 @@ var ugjBme280Definition = {
|
||||
"nextStatement": null,
|
||||
"tooltip": "%{BKY_UGJ_BME280_TOOLTIP}",
|
||||
"helpUrl": "",
|
||||
"style": "gpio_blocks"
|
||||
"style": "sensor_blocks"
|
||||
};
|
||||
Blockly.Blocks['ugj_bme280'] = {
|
||||
init: function () {
|
||||
@ -1117,6 +1131,205 @@ Blockly.Python['ugj_bme280'] = function (block) {
|
||||
return code;
|
||||
};
|
||||
|
||||
/********** */
|
||||
/** PAJ7620 */
|
||||
/********** */
|
||||
var ugjGestureInitDefinition = {
|
||||
"type": "ugj_gesture_init",
|
||||
"message0": "%{BKY_UGJ_GESTURE_INIT_TITLE}",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "i2c_addr",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"tooltip": "%{BKY_UGJ_GESTURE_INIT_TOOLTIP}",
|
||||
"helpUrl": "",
|
||||
"style": "sensor_blocks"
|
||||
};
|
||||
Blockly.Blocks['ugj_gesture_init'] = {
|
||||
init: function () {
|
||||
this.jsonInit(ugjGestureInitDefinition);
|
||||
}
|
||||
};
|
||||
Blockly.JavaScript['ugj_gesture_init'] = function (block) {
|
||||
var value_i2c_addr = Blockly.JavaScript.valueToCode(block, 'i2c_addr', Blockly.JavaScript.ORDER_ATOMIC);
|
||||
Blockly.JavaScript.provideFunction_(
|
||||
'require_paj7620', [`const paj7620 = require('@ocogeclub/paj7620');`]
|
||||
);
|
||||
var code = `paj7620.init(${elutil.i2c_bus}, ${value_i2c_addr});
|
||||
`;
|
||||
return code;
|
||||
};
|
||||
Blockly.Python['ugj_gesture_init'] = function (block) {
|
||||
var value_i2c_addr = Blockly.Python.valueToCode(block, 'i2c_addr', Blockly.Python.ORDER_ATOMIC);
|
||||
// TODO: Assemble Python into code variable.
|
||||
var code = '...\n';
|
||||
return code;
|
||||
};
|
||||
|
||||
/****************** */
|
||||
/** Gesture Read ** */
|
||||
/****************** */
|
||||
var ugjGestureReadDefinition = {
|
||||
"type": "ugj_gesture_read",
|
||||
"message0": "%{BKY_UGJ_GESTURE_READ_TITLE}",
|
||||
"inputsInline": true,
|
||||
"output": "Number",
|
||||
"tooltip": "%{BKY_UGJ_GESTURE_READ_TOOLTIP}",
|
||||
"helpUrl": "https://ocoge.club/sensors/paj7620.html",
|
||||
"style": "sensor_blocks"
|
||||
};
|
||||
Blockly.Blocks['ugj_gesture_read'] = {
|
||||
init: function () {
|
||||
this.jsonInit(ugjGestureReadDefinition);
|
||||
}
|
||||
};
|
||||
Blockly.JavaScript['ugj_gesture_read'] = function (block) {
|
||||
var code = 'await paj7620.return_gesture()';
|
||||
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
||||
};
|
||||
Blockly.Python['ugj_gesture_read'] = function (block) {
|
||||
// TODO: Assemble Python into code variable.
|
||||
var code = '...';
|
||||
// TODO: Change ORDER_NONE to the correct strength.
|
||||
return [code, Blockly.Python.ORDER_NONE];
|
||||
};
|
||||
/****************** */
|
||||
/** Gesture Stop ** */
|
||||
/****************** */
|
||||
var ugjGestureStopDefinition = {
|
||||
"type": "ugj_gesture_stop",
|
||||
"message0": "%{BKY_UGJ_GESTURE_STOP_TITLE}",
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"tooltip": "%{BKY_UGJ_GESTURE_STOP_TOOLTIP}",
|
||||
"helpUrl": "",
|
||||
"style": "sensor_blocks"
|
||||
};
|
||||
Blockly.Blocks['ugj_gesture_stop'] = {
|
||||
init: function () {
|
||||
this.jsonInit(ugjGestureStopDefinition);
|
||||
}
|
||||
};
|
||||
Blockly.JavaScript['ugj_gesture_stop'] = function (block) {
|
||||
var code = 'paj7620.stop();\n';
|
||||
return code;
|
||||
};
|
||||
Blockly.Python['ugj_gesture_stop'] = function (block) {
|
||||
// TODO: Assemble Python into code variable.
|
||||
var code = '...\n';
|
||||
return code;
|
||||
};
|
||||
|
||||
/******************* */
|
||||
/** Init Grid-Eye ** */
|
||||
/******************* */
|
||||
var ugjGridEyeInitDefinition = {
|
||||
"type": "ugj_grideye_init",
|
||||
"message0": "%{BKY_UGJ_GRIDEYE_INIT_TITLE}",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_dropdown",
|
||||
"name": "addr",
|
||||
"options": [
|
||||
[
|
||||
"0x68",
|
||||
"0x68"
|
||||
],
|
||||
[
|
||||
"0x69",
|
||||
"0x69"
|
||||
]
|
||||
]
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"tooltip": "%{BKY_UGJ_GRIDEYE_INIT_TOOLTIP}",
|
||||
"helpUrl": "",
|
||||
"style": "sensor_blocks"
|
||||
};
|
||||
Blockly.Blocks['ugj_grideye_init'] = {
|
||||
init: function () {
|
||||
this.jsonInit(ugjGridEyeInitDefinition);
|
||||
}
|
||||
};
|
||||
Blockly.JavaScript['ugj_grideye_init'] = function (block) {
|
||||
var dropdown_addr = block.getFieldValue('addr');
|
||||
Blockly.JavaScript.provideFunction_(
|
||||
'require_amg8833', [`const amg8833 = require('@ocogeclub/amg8833');`]
|
||||
);
|
||||
var code = `amg8833.init(${elutil.i2c_bus}, ${dropdown_addr});\n`;
|
||||
return code;
|
||||
};
|
||||
Blockly.Python['ugj_grideye_init'] = function (block) {
|
||||
var dropdown_addr = block.getFieldValue('addr');
|
||||
// TODO: Assemble Python into code variable.
|
||||
var code = '...\n';
|
||||
return code;
|
||||
};
|
||||
/**************************** */
|
||||
/** Read Temperature Array ** */
|
||||
/**************************** */
|
||||
var ugjGridEyeReadDefinition = {
|
||||
"type": "ugj_grideye_read",
|
||||
"message0": "%{BKY_UGJ_GRIDEYE_READ_TITLE}",
|
||||
"inputsInline": true,
|
||||
"output": "Array",
|
||||
"tooltip": "%{BKY_UGJ_GRIDEYE_READ_TOOLTIP}",
|
||||
"helpUrl": "",
|
||||
"style": "sensor_blocks"
|
||||
};
|
||||
Blockly.Blocks['ugj_grideye_read'] = {
|
||||
init: function () {
|
||||
this.jsonInit(ugjGridEyeReadDefinition);
|
||||
}
|
||||
};
|
||||
Blockly.JavaScript['ugj_grideye_read'] = function (block) {
|
||||
var code = 'amg8833.read_temp_array()';
|
||||
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
||||
};
|
||||
Blockly.Python['ugj_grideye_read'] = function (block) {
|
||||
// TODO: Assemble Python into code variable.
|
||||
var code = '...';
|
||||
// TODO: Change ORDER_NONE to the correct strength.
|
||||
return [code, Blockly.Python.ORDER_NONE];
|
||||
};
|
||||
/******************* */
|
||||
/** Stop Grid-Eye ** */
|
||||
/******************* */
|
||||
var ugjGridEyeStopDefinition = {
|
||||
"type": "ugj_grideye_stop",
|
||||
"message0": "%{BKY_UGJ_GRIDEYE_STOP_TITLE}",
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"tooltip": "%{BKY_UGJ_GRIDEYE_STOP_TOOLTIP}",
|
||||
"helpUrl": "",
|
||||
"style": "sensor_blocks"
|
||||
};
|
||||
Blockly.Blocks['ugj_grideye_stop'] = {
|
||||
init: function () {
|
||||
this.jsonInit(ugjGridEyeStopDefinition);
|
||||
}
|
||||
};
|
||||
Blockly.JavaScript['ugj_grideye_stop'] = function (block) {
|
||||
var code = 'amg8833.stop();\n';
|
||||
return code;
|
||||
};
|
||||
Blockly.Python['ugj_grideye_stop'] = function (block) {
|
||||
// TODO: Assemble Python into code variable.
|
||||
var code = '...\n';
|
||||
return code;
|
||||
};
|
||||
|
||||
/** Multimedia *****************************************************************************************************/
|
||||
|
||||
|
||||
@ -1585,6 +1798,178 @@ Blockly.JavaScript['ugj_canvas_drawrect'] = function (block) {
|
||||
return code;
|
||||
};
|
||||
|
||||
/*********************** */
|
||||
/** Create sub canvas ** */
|
||||
/*********************** */
|
||||
var ugjCreateSubCanvasDefinition = {
|
||||
"type": "ugj_create_sub_canvas",
|
||||
"message0": "%{BKY_UGJ_CREATE_SUBCANVAS_TITLE}",
|
||||
"args0": [
|
||||
{
|
||||
"type": "field_variable",
|
||||
"name": "sub_canvas",
|
||||
"variable": "%{BKY_UGJ_CREATE_SUBCANVAS_VAR}"
|
||||
},
|
||||
{
|
||||
"type": "input_dummy"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "width",
|
||||
"check": "Number"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "height",
|
||||
"check": "Number"
|
||||
},
|
||||
{
|
||||
"type": "input_dummy"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "style_width",
|
||||
"check": "Number"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "style_height",
|
||||
"check": "Number"
|
||||
}
|
||||
],
|
||||
"inputsInline": true,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"tooltip": "%{BKY_UGJ_CREATE_SUBCANVAS_TOOLTIP}",
|
||||
"helpUrl": "",
|
||||
"style": "multimedia_blocks"
|
||||
};
|
||||
Blockly.Blocks['ugj_create_sub_canvas'] = {
|
||||
init: function () {
|
||||
this.jsonInit(ugjCreateSubCanvasDefinition);
|
||||
}
|
||||
};
|
||||
Blockly.JavaScript['ugj_create_sub_canvas'] = function (block) {
|
||||
var variable_sub_canvas = Blockly.JavaScript.nameDB_.getName(block.getFieldValue('sub_canvas'), Blockly.Variables.NAME_TYPE);
|
||||
var value_width = Blockly.JavaScript.valueToCode(block, 'width', Blockly.JavaScript.ORDER_ATOMIC);
|
||||
var value_height = Blockly.JavaScript.valueToCode(block, 'height', Blockly.JavaScript.ORDER_ATOMIC);
|
||||
var value_style_width = Blockly.JavaScript.valueToCode(block, 'style_width', Blockly.JavaScript.ORDER_ATOMIC);
|
||||
var value_style_height = Blockly.JavaScript.valueToCode(block, 'style_height', Blockly.JavaScript.ORDER_ATOMIC);
|
||||
var code = `${variable_sub_canvas} = {};
|
||||
${variable_sub_canvas}.el = document.createElement('canvas');
|
||||
${variable_sub_canvas}.el.setAttribute('width', ${value_width});
|
||||
${variable_sub_canvas}.el.setAttribute('height', ${value_height});
|
||||
${variable_sub_canvas}.el.className = 'subdisplay';
|
||||
${variable_sub_canvas}.el.style.width = '${value_style_width}px';
|
||||
${variable_sub_canvas}.el.style.height = '${value_style_height}px';
|
||||
document.getElementById('display_area').appendChild(${variable_sub_canvas}.el);
|
||||
${variable_sub_canvas}.ctx = ${variable_sub_canvas}.el.getContext('2d');
|
||||
${variable_sub_canvas}.imgData = ${variable_sub_canvas}.ctx.createImageData(${variable_sub_canvas}.el.width, ${variable_sub_canvas}.el.height);
|
||||
`;
|
||||
return code;
|
||||
};
|
||||
/********************************************** */
|
||||
/** Draw IR Array Data to Image Data ** */
|
||||
/********************************************** */
|
||||
var ugjDrawGrideyedataDefinition = {
|
||||
"type": "ugj_draw_grideyedata",
|
||||
"message0": "%{BKY_UGJ_DRAW_GRIDEYEDATA_TITLE}",
|
||||
"args0": [
|
||||
{
|
||||
"type": "input_dummy"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "amg8833data",
|
||||
"check": "Array",
|
||||
"align": "RIGHT"
|
||||
},
|
||||
{
|
||||
"type": "field_colour",
|
||||
"name": "color_high",
|
||||
"colour": "#ff0000"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "temp_high",
|
||||
"check": "Number",
|
||||
"align": "RIGHT"
|
||||
},
|
||||
{
|
||||
"type": "field_colour",
|
||||
"name": "color_low",
|
||||
"colour": "#3333ff"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "temp_low",
|
||||
"check": "Number",
|
||||
"align": "RIGHT"
|
||||
},
|
||||
{
|
||||
"type": "input_value",
|
||||
"name": "canvas",
|
||||
"check": "Canvas",
|
||||
"align": "RIGHT"
|
||||
}
|
||||
],
|
||||
"inputsInline": false,
|
||||
"previousStatement": null,
|
||||
"nextStatement": null,
|
||||
"tooltip": "%{BKY_UGJ_DRAW_GRIDEYEDATA_TOOLTIP}",
|
||||
"helpUrl": "",
|
||||
"style": "multimedia_blocks"
|
||||
};
|
||||
Blockly.Blocks['ugj_draw_grideyedata'] = {
|
||||
init: function () {
|
||||
this.jsonInit(ugjDrawGrideyedataDefinition);
|
||||
}
|
||||
};
|
||||
Blockly.JavaScript['ugj_draw_grideyedata'] = function (block) {
|
||||
var value_amg8833data = Blockly.JavaScript.valueToCode(block, 'amg8833data', Blockly.JavaScript.ORDER_ATOMIC);
|
||||
var colour_color_high = block.getFieldValue('color_high');
|
||||
var value_temp_high = Blockly.JavaScript.valueToCode(block, 'temp_high', Blockly.JavaScript.ORDER_ATOMIC);
|
||||
var colour_color_low = block.getFieldValue('color_low');
|
||||
var value_temp_low = Blockly.JavaScript.valueToCode(block, 'temp_low', Blockly.JavaScript.ORDER_ATOMIC);
|
||||
var value_canvas = Blockly.JavaScript.valueToCode(block, 'canvas', Blockly.JavaScript.ORDER_ATOMIC);
|
||||
var functionName = Blockly.JavaScript.provideFunction_(
|
||||
'mapVal',
|
||||
['const ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + ' = (val, inMin, inMax, outMin, outMax) => {',
|
||||
`return (val - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;`,
|
||||
'}'
|
||||
]
|
||||
);
|
||||
// 温度カラー
|
||||
let hr, hg, hb, lr, lg, lb;
|
||||
hr = '0x' + colour_color_high.slice(1, 3);
|
||||
hg = '0x' + colour_color_high.slice(3, 5);
|
||||
hb = '0x' + colour_color_high.slice(5, 7);
|
||||
lr = '0x' + colour_color_low.slice(1, 3);
|
||||
lg = '0x' + colour_color_low.slice(3, 5);
|
||||
lb = '0x' + colour_color_low.slice(5, 7);
|
||||
var code = `// colour_color_high = ${colour_color_high}
|
||||
const color_range = [[${lr}, ${hr}], [${lg}, ${hg}], [${lb}, ${hb}]]; //超簡易的な色付け
|
||||
// const color_range = [[0, 0xff], [0, 0x3f], [0xff, 0]];
|
||||
let grideye_data = ${value_amg8833data};//読み取りブロックを入力に直接接続できるようにする
|
||||
for (let raw = 0; raw < ${value_canvas}.el.height; raw++) {
|
||||
for (let col = 0; col < ${value_canvas}.el.width; col++) {
|
||||
for (let rgb = 0; rgb < 3; rgb++) {
|
||||
let pixel = ${functionName}(grideye_data[raw][col], ${value_temp_low}, ${value_temp_high}, color_range[rgb][0], color_range[rgb][1]);
|
||||
${value_canvas}.imgData.data[((raw * ${value_canvas}.el.width * 4) + col * 4) + rgb] = pixel;
|
||||
}
|
||||
${value_canvas}.imgData.data[((raw * ${value_canvas}.el.width * 4) + col * 4) + 3] = 0xff;
|
||||
}
|
||||
}
|
||||
${value_canvas}.ctx.putImageData(${value_canvas}.imgData, 0, 0);
|
||||
|
||||
`;
|
||||
return code;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/****************************** */
|
||||
/** KeyUpDown Event Listener ** */
|
||||
/****************************** */
|
||||
@ -2367,23 +2752,7 @@ Blockly.JavaScript['ugj_spawn'] = function (block) {
|
||||
/************************** */
|
||||
/** Child shell commands ** */
|
||||
/************************** */
|
||||
// gesture_sensor.py
|
||||
Blockly.Blocks['ugj_child_gesture'] = {
|
||||
init: function () {
|
||||
this.appendDummyInput()
|
||||
.appendField("ジェスチャー");
|
||||
this.setInputsInline(true);
|
||||
this.setOutput(true, "shcmd");
|
||||
this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND);
|
||||
this.setStyle('special_blocks')
|
||||
this.setTooltip("ジェスチャーセンサー Paj7620 (GrovePi-Python)");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
Blockly.JavaScript['ugj_child_gesture'] = function (block) {
|
||||
var code = `'python3', ['${ugj_const.library_path}gesture.py']`;
|
||||
return [code, Blockly.JavaScript.ORDER_NONE];
|
||||
};
|
||||
|
||||
|
||||
// AquesTalk Pi
|
||||
Blockly.Blocks['aquestalk_pi'] = {
|
||||
@ -3035,3 +3404,58 @@ Blockly.JavaScript['ugj_control_button'] = function (block) {
|
||||
return code;
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// 開発用
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
Blockly.Blocks['ugj_dev_run_js'] = {
|
||||
init: function () {
|
||||
this.appendValueInput("arg")
|
||||
.setCheck(null)
|
||||
.setAlign(Blockly.ALIGN_RIGHT)
|
||||
.appendField("Arg:");
|
||||
this.appendValueInput("code")
|
||||
.setCheck("String")
|
||||
.setAlign(Blockly.ALIGN_RIGHT)
|
||||
.appendField("Code:");
|
||||
this.appendValueInput("password")
|
||||
.setCheck("String")
|
||||
.setAlign(Blockly.ALIGN_RIGHT)
|
||||
.appendField("Pwd:");
|
||||
this.setPreviousStatement(true, null);
|
||||
this.setNextStatement(true, null);
|
||||
this.setColour(230);
|
||||
this.setTooltip("");
|
||||
this.setHelpUrl("");
|
||||
}
|
||||
};
|
||||
Blockly.JavaScript['ugj_dev_run_js'] = function (block) {
|
||||
var value_arg = Blockly.JavaScript.valueToCode(block, 'arg', Blockly.JavaScript.ORDER_ATOMIC);
|
||||
var value_code = Blockly.JavaScript.valueToCode(block, 'code', Blockly.JavaScript.ORDER_ATOMIC);
|
||||
var value_password = Blockly.JavaScript.valueToCode(block, 'password', Blockly.JavaScript.ORDER_ATOMIC);
|
||||
// TODO: Assemble JavaScript into code variable.
|
||||
var code = `
|
||||
const crypto = require('crypto');
|
||||
let hashHex = crypto.createHash('sha256').update(${value_password}, 'utf8').digest('hex');
|
||||
if (hashHex == ugj_const.dev_hash) {
|
||||
let AsyncFunction = Object.getPrototypeOf(async function () { }).constructor
|
||||
let ocogeFunc = new AsyncFunction('arg', ${value_code});
|
||||
await ocogeFunc(${value_arg});
|
||||
}
|
||||
else console.log('invalid certification');
|
||||
`;
|
||||
return code;
|
||||
};
|
||||
// Blockly.Blocks['ugj_dev_run_js'] = {
|
||||
// init: function () {
|
||||
// this.setPreviousStatement(true, null);
|
||||
// this.setColour(230);
|
||||
// this.setTooltip("");
|
||||
// this.setHelpUrl("");
|
||||
// }
|
||||
// };
|
||||
// Blockly.JavaScript['ugj_dev_run_js'] = function (block) {
|
||||
// // TODO: Assemble JavaScript into code variable.
|
||||
// // var code = localStorage.getItem('ocoge_dev_code');
|
||||
// var code =
|
||||
// return code;
|
||||
// };
|
20
yarn.lock
20
yarn.lock
@ -61,10 +61,20 @@
|
||||
mkdirp "^1.0.4"
|
||||
rimraf "^3.0.2"
|
||||
|
||||
"@ocogeclub/amg8833@file:local_modules/@ocogeclub/amg8833":
|
||||
version "0.0.1"
|
||||
dependencies:
|
||||
"@ocogeclub/pigpio" "file:../../.cache/yarn/v6/npm-@ocogeclub-amg8833-0.0.1-8dfa7589-6746-40d4-9530-a4546ba16ad3-1634476251665/node_modules/@ocogeclub/pigpio"
|
||||
|
||||
"@ocogeclub/bme280@file:local_modules/@ocogeclub/bme280":
|
||||
version "0.0.1"
|
||||
dependencies:
|
||||
"@ocogeclub/pigpio" "file:../../.cache/yarn/v6/npm-@ocogeclub-bme280-0.0.1-afe790ae-69ff-47f6-96b0-8796b0a559a8-1633832163228/node_modules/@ocogeclub/pigpio"
|
||||
"@ocogeclub/pigpio" "file:../../.cache/yarn/v6/npm-@ocogeclub-bme280-0.0.1-54967241-c3ef-4a53-ad34-16acb3e76088-1634476250850/node_modules/@ocogeclub/pigpio"
|
||||
|
||||
"@ocogeclub/paj7620@file:local_modules/@ocogeclub/paj7620":
|
||||
version "0.0.1"
|
||||
dependencies:
|
||||
"@ocogeclub/pigpio" "file:../../.cache/yarn/v6/npm-@ocogeclub-paj7620-0.0.1-6dd29fc9-a1f9-43f4-9e96-a79744ba2494-1634476250888/node_modules/@ocogeclub/pigpio"
|
||||
|
||||
"@ocogeclub/pigpio@file:local_modules/@ocogeclub/pigpio":
|
||||
version "0.0.1"
|
||||
@ -707,10 +717,10 @@ electron-rebuild@3.2.3:
|
||||
tar "^6.0.5"
|
||||
yargs "^17.0.1"
|
||||
|
||||
electron@15.0.0:
|
||||
version "15.0.0"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-15.0.0.tgz#b1b6244b1cffddf348c27c54b1310b3a3680246e"
|
||||
integrity sha512-LlBjN5nCJoC7EDrgfDQwEGSGSAo/o08nSP5uJxN2m+ZtNA69SxpnWv4yPgo1K08X/iQPoGhoZu6C8LYYlk1Dtg==
|
||||
electron@15.1.2:
|
||||
version "15.1.2"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-15.1.2.tgz#be1e362ab7307e38155709b0862e6a87f5e748b3"
|
||||
integrity sha512-cU5x1ZvhwcTtzClJrsxqbvCocs40uhuXcdXbXFMpe6XnbnjruTbwrB2V0OxN01pStDrYihnfKo2yhfEvhO3zmw==
|
||||
dependencies:
|
||||
"@electron/get" "^1.13.0"
|
||||
"@types/node" "^14.6.2"
|
||||
|
Loading…
Reference in New Issue
Block a user