from m5stack import *
from m5stack_ui import *
from uiflow import *
import wifiCfg
import urequests
import time
import json
screen = M5Screen()
screen.clean_screen()
screen.set_screen_bg_color(0x000000)
num = None
offset = None
update_enabled = None
display_date = None
numString = None
api_url = None
touch_button_plus = M5Btn(text='+', x=210, y=45, w=50, h=50, bg_c=0x5ba6d2, text_c=0xffffff, font=FONT_MONT_48, parent=None)
labelCount = M5Label('00', x=130, y=45, color=0xffffff, font=FONT_MONT_48, parent=None)
touch_button_minus = M5Btn(text='-', x=60, y=45, w=50, h=50, bg_c=0xf1492b, text_c=0xffffff, font=FONT_MONT_48, parent=None)
labelTitle = M5Label('Medication Counter', x=86, y=4, color=0x86ea50, font=FONT_MONT_14, parent=None)
switch_enabled = M5Switch(x=125, y=100, w=70, h=30, bg_c=0xCCCCCC, color=0x0089ff, parent=None)
labelLastestEntry = M5Label('yyyy-mm-dd hh-mi-ss', x=140, y=150, color=0xfffcfc, font=FONT_MONT_14, parent=None)
labelCaption1 = M5Label('Lastest Entry:', x=20, y=150, color=0xfbf8f8, font=FONT_MONT_14, parent=None)
labelDate = M5Label('YYYY/MM/DD', x=55, y=190, color=0xf6f1f1, font=FONT_MONT_34, parent=None)
labelPrevDay = M5Label('<<', x=45, y=220, color=0xd5b175, font=FONT_MONT_14, parent=None)
labelToday = M5Label('Today', x=140, y=220, color=0xd5b175, font=FONT_MONT_14, parent=None)
labelNextDay = M5Label('>>', x=260, y=220, color=0xd5b175, font=FONT_MONT_14, parent=None)
# 関数定義:現在日付を表示日付変数にセット
def setCurrentDate():
global num, offset, update_enabled, display_date, numString, api_url
display_date = rtc.datetime()[0]
display_date = (str(display_date) + str(((str('/') + str(zeroPadding(rtc.datetime()[1]))))))
display_date = (str(display_date) + str(((str('/') + str(zeroPadding(rtc.datetime()[2]))))))
# 関数定義:数値のゼロパディング
def zeroPadding(num):
global offset, update_enabled, display_date, numString, api_url
numString = str(num)
if num <= 9:
numString = (str('0') + str(num))
return numString
# 関数定義:コントロール非表示
def controlHide():
global num, offset, update_enabled, display_date, numString, api_url
labelTitle.set_hidden(True)
labelCount.set_hidden(True)
labelDate.set_hidden(True)
labelCaption1.set_hidden(True)
labelLastestEntry.set_hidden(True)
labelDate.set_hidden(True)
labelPrevDay.set_hidden(True)
labelToday.set_hidden(True)
labelNextDay.set_hidden(True)
touch_button_plus.set_hidden(True)
touch_button_minus.set_hidden(True)
switch_enabled.set_hidden(True)
# 関数定義:コントロール表示
def controlShow():
global num, offset, update_enabled, display_date, numString, api_url
labelTitle.set_hidden(False)
labelCount.set_hidden(False)
labelDate.set_hidden(False)
labelCaption1.set_hidden(False)
labelLastestEntry.set_hidden(False)
labelDate.set_hidden(False)
labelPrevDay.set_hidden(False)
labelToday.set_hidden(False)
labelNextDay.set_hidden(False)
touch_button_plus.set_hidden(False)
touch_button_minus.set_hidden(False)
switch_enabled.set_hidden(False)
# 関数定義:コントロール位置調整
def setControlPositon():
global num, offset, update_enabled, display_date, numString, api_url
labelCount.set_align(ALIGN_CENTER, x=0, y=(-50), ref=screen.obj)
labelDate.set_align(ALIGN_CENTER, x=0, y=80, ref=screen.obj)
# 関数定義:服薬情報取得
# - 服薬情報をWebAPIから取得する
# 引数: offset (0=表示日付の当日, 1=表示日付の翌日, -1=表示日付の前日)
def getData(offset):
global num, update_enabled, display_date, numString, api_url
rgb.setColorAll(0xffff66)
rgb.setBrightness(10)
# GET APIにHTTPリクエストする
# GET /items/{year}/{month}/{day}/{offset}
try:
req = urequests.request(method='GET', url=(str(api_url) + str(((str('/items/') + str(((str(display_date) + str(((str('/') + str(offset))))))))))), headers={})
# 成功時、返却されたJSONデータを読みこんで、画面情報を更新
display_date = (json.loads((req.text)))['display_date']
labelDate.set_text(str(display_date))
labelCount.set_text(str((json.loads((req.text)))['count']))
labelLastestEntry.set_text(str((json.loads((req.text)))['lastest_entry']))
# コントロールの位置調整
setControlPositon()
rgb.setColorAll(0x33ff33)
wait(1)
rgb.setBrightness(0)
except:
rgb.setColorAll(0xff0000)
wait(2)
rgb.setBrightness(0)
# 関数定義:服薬情報登録
# - 服薬情報をWebAPIで登録する
def putData():
global num, offset, update_enabled, display_date, numString, api_url
rgb.setColorAll(0x3366ff)
rgb.setBrightness(10)
# PUT APIにHTTPリクエストする
# PUT /items/{year}/{month}/{day}
try:
req = urequests.request(method='PUT', url=(str(api_url) + str(((str('/items/') + str(display_date))))),json={}, headers={})
# 登録成功時、服薬情報取得をコールして画面情報を更新
if (json.loads((req.text))) == 'put ok':
# 関数コール:服薬情報取得
# 引数:offset = 0(表示日付の当日)
getData(0)
except:
rgb.setColorAll(0xff0000)
wait(2)
rgb.setBrightness(0)
# 関数定義:服薬情報削除
# - 服薬情報をWebAPIで削除する
def deleteData():
global num, offset, update_enabled, display_date, numString, api_url
rgb.setColorAll(0xff99ff)
rgb.setBrightness(10)
# DELETE APIにHTTPリクエストする
# DELTE /items/{year}/{month}/{day}
try:
req = urequests.request(method='DELETE', url=(str(api_url) + str(((str('/items/') + str(display_date))))),json={}, headers={})
# 削除成功時、服薬情報取得をコールして画面情報を更新
if (json.loads((req.text))) == 'delete ok':
# 関数コール:服薬情報取得
# 引数:offset = 0(表示日付の当日)
getData(0)
except:
rgb.setColorAll(0xff0000)
wait(2)
rgb.setBrightness(0)
# 使用可能スイッチをONにした時のイベント
def switch_enabled_on():
global update_enabled, display_date, numString, num, api_url, offset
update_enabled = True
pass
switch_enabled.on(switch_enabled_on)
# 使用可能スイッチをOFFにした時のイベント
def switch_enabled_off():
global update_enabled, display_date, numString, num, api_url, offset
update_enabled = False
pass
switch_enabled.off(switch_enabled_off)
# プラスボタンを押した時のイベント
def touch_button_plus_pressed():
global update_enabled, display_date, numString, num, api_url, offset
if update_enabled == True:
power.setVibrationEnable(True)
wait(0.2)
power.setVibrationEnable(False)
# 関数コール:服薬情報登録
putData()
pass
touch_button_plus.pressed(touch_button_plus_pressed)
# マイナスボタンを押した時のイベント
def touch_button_minus_pressed():
global update_enabled, display_date, numString, num, api_url, offset
if update_enabled == True:
power.setVibrationEnable(True)
wait(0.2)
power.setVibrationEnable(False)
# 関数コール:服薬情報削除
deleteData()
pass
touch_button_minus.pressed(touch_button_minus_pressed)
# 本体のAボタン(左)が押された時のイベント
def buttonA_wasPressed():
global update_enabled, display_date, numString, num, api_url, offset
power.setVibrationEnable(True)
wait(0.2)
power.setVibrationEnable(False)
# 関数コール:服薬情報取得
# 引数:offset = -1(表示日付の前日)
getData(-1)
pass
btnA.wasPressed(buttonA_wasPressed)
# 本体のBボタン(真ん中)が押された時のイベント
def buttonB_wasPressed():
global update_enabled, display_date, numString, num, api_url, offset
power.setVibrationEnable(True)
wait(0.2)
power.setVibrationEnable(False)
# 関数コール:現在日付を表示日付変数にセット
setCurrentDate()
# 関数コール:服薬情報取得
# 引数:offset = 0(表示日付の当日)
getData(0)
pass
btnB.wasPressed(buttonB_wasPressed)
# 本体のCボタン(右)が押された時のイベント
def buttonC_wasPressed():
global update_enabled, display_date, numString, num, api_url, offset
power.setVibrationEnable(True)
wait(0.2)
power.setVibrationEnable(False)
# 関数コール:服薬情報取得
# 引数:offset = 1(表示日付の翌日)
getData(1)
pass
btnC.wasPressed(buttonC_wasPressed)
# ここから起動時処理スタート
# 関数コール:コントロールを非表示
controlHide()
# Wifiと接続する
wifiCfg.doConnect('wifi-ssid', 'wifi-password')
# Wifiの接続が完了するまで待機する
while not (wifiCfg.wlan_sta.isconnected()):
wait(1)
# NTPで時刻合わせ
rtc.settime('ntp', host='jp.pool.ntp.org', tzone=9)
# 関数コール:現在日付を変数にセット
setCurrentDate()
# WebAPIのURLを変数にセット
api_url = 'https://xxx.execute-api.ap-northeast-1.amazonaws.com'
# 関数コール:服薬情報取得
# 引数:offset = 0(当日)
getData(0)
# 関数コール:コントロール表示
controlShow()