From 1d72fff4c972240b01e75ea480175531d062409c Mon Sep 17 00:00:00 2001 From: Jonathan Wang Date: Fri, 16 Aug 2019 17:38:20 -0700 Subject: [PATCH 1/4] Preprocess sound file path to allow spaces on OSX --- src/adafruit_circuitplayground/constants.py | 2 ++ src/adafruit_circuitplayground/express.py | 2 ++ src/adafruit_circuitplayground/utils.py | 6 ++++++ 3 files changed, 10 insertions(+) diff --git a/src/adafruit_circuitplayground/constants.py b/src/adafruit_circuitplayground/constants.py index c044e2e02..328389dc9 100644 --- a/src/adafruit_circuitplayground/constants.py +++ b/src/adafruit_circuitplayground/constants.py @@ -7,6 +7,8 @@ INDEX_ERROR = "The index is not a valid number, you can access the Neopixels from 0 to 9." +MAC_OS = "darwin" + NOT_IMPLEMENTED_ERROR = "This method is not implemented by the simulator" NOT_SUITABLE_FILE_ERROR = "Your .wav file is not suitable for the Circuit Playground Express." diff --git a/src/adafruit_circuitplayground/express.py b/src/adafruit_circuitplayground/express.py index b26d1ddf6..ecb756df5 100644 --- a/src/adafruit_circuitplayground/express.py +++ b/src/adafruit_circuitplayground/express.py @@ -144,6 +144,8 @@ def shake(self, shake_threshold=30): return self.__state['shake'] def play_file(self, file_name): + # Allowing files with spaces to be played on OSX + file_name = utils.escape_if_OSX(file_name) file_name = utils.remove_leading_slashes(file_name) abs_path_parent_dir = os.path.abspath( os.path.join(self.__abs_path_to_code_file, os.pardir)) diff --git a/src/adafruit_circuitplayground/utils.py b/src/adafruit_circuitplayground/utils.py index c03e6e15d..a769f1bf2 100644 --- a/src/adafruit_circuitplayground/utils.py +++ b/src/adafruit_circuitplayground/utils.py @@ -1,6 +1,7 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT license. +import os import sys import json import copy @@ -28,3 +29,8 @@ def show(state, debug_mode=False): def remove_leading_slashes(string): string = string.lstrip('\\/') return string + +def escape_if_OSX(file_name): + if os.name == CONSTANTS.MAC_OS: + file_name = file_name.replace(" ", "%20") + return file_name \ No newline at end of file From e5b6e90cd414c2196314b832eff34fb9ea70a9b5 Mon Sep 17 00:00:00 2001 From: Jonathan Wang Date: Mon, 19 Aug 2019 18:52:30 -0700 Subject: [PATCH 2/4] Fix playback functionality for Mac --- src/adafruit_circuitplayground/express.py | 3 +-- src/adafruit_circuitplayground/utils.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/adafruit_circuitplayground/express.py b/src/adafruit_circuitplayground/express.py index ecb756df5..454bb29ed 100644 --- a/src/adafruit_circuitplayground/express.py +++ b/src/adafruit_circuitplayground/express.py @@ -144,13 +144,12 @@ def shake(self, shake_threshold=30): return self.__state['shake'] def play_file(self, file_name): - # Allowing files with spaces to be played on OSX - file_name = utils.escape_if_OSX(file_name) file_name = utils.remove_leading_slashes(file_name) abs_path_parent_dir = os.path.abspath( os.path.join(self.__abs_path_to_code_file, os.pardir)) abs_path_wav_file = os.path.normpath( os.path.join(abs_path_parent_dir, file_name)) + abs_path_wav_file = utils.escape_if_OSX(abs_path_wav_file) if sys.implementation.version[0] >= 3: if file_name.endswith(".wav"): diff --git a/src/adafruit_circuitplayground/utils.py b/src/adafruit_circuitplayground/utils.py index a769f1bf2..94ed4b5b8 100644 --- a/src/adafruit_circuitplayground/utils.py +++ b/src/adafruit_circuitplayground/utils.py @@ -31,6 +31,6 @@ def remove_leading_slashes(string): return string def escape_if_OSX(file_name): - if os.name == CONSTANTS.MAC_OS: + if sys.platform.startswith(CONSTANTS.MAC_OS): file_name = file_name.replace(" ", "%20") return file_name \ No newline at end of file From e9298f09d403a3498e9637940e431acd0629ad99 Mon Sep 17 00:00:00 2001 From: Jonathan Wang Date: Mon, 19 Aug 2019 19:10:02 -0700 Subject: [PATCH 3/4] Remove unused import --- src/adafruit_circuitplayground/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/adafruit_circuitplayground/utils.py b/src/adafruit_circuitplayground/utils.py index d0c48f62b..43b309ed4 100644 --- a/src/adafruit_circuitplayground/utils.py +++ b/src/adafruit_circuitplayground/utils.py @@ -1,7 +1,6 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT license. -import os import sys import json import copy From 64374bc9928b6793e7f5e14394f33d51b16d32ab Mon Sep 17 00:00:00 2001 From: Jonathan Wang Date: Tue, 20 Aug 2019 11:36:52 -0700 Subject: [PATCH 4/4] Check telemetry to ensure AI key is set before sending events or else methods will hang --- src/adafruit_circuitplayground/express.py | 18 +++++++++--------- src/adafruit_circuitplayground/pixel.py | 4 ++-- src/adafruit_circuitplayground/utils.py | 3 +++ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/adafruit_circuitplayground/express.py b/src/adafruit_circuitplayground/express.py index 67e2b82f0..6077a68bf 100644 --- a/src/adafruit_circuitplayground/express.py +++ b/src/adafruit_circuitplayground/express.py @@ -71,7 +71,7 @@ def button_b(self): @property def detect_taps(self): - if(not self.telemetry_state["DETECT_TAPS"]): + if(utils.telemetry_available() and not self.telemetry_state["DETECT_TAPS"]): utils.send_telemetry("DETECT_TAPS") self.telemetry_state["DETECT_TAPS"] = True return self.__state['detect_taps'] @@ -86,21 +86,21 @@ def detect_taps(self, value): def tapped(self): """ Not Implemented! """ - if(not self.telemetry_state["TAPPED"]): + if(utils.telemetry_available() and not self.telemetry_state["TAPPED"]): utils.send_telemetry("TAPPED") self.telemetry_state["TAPPED"] = True raise NotImplementedError(CONSTANTS.NOT_IMPLEMENTED_ERROR) @property def red_led(self): - if(not self.telemetry_state["RED_LED"]): + if(utils.telemetry_available() and not self.telemetry_state["RED_LED"]): utils.send_telemetry("RED_LED") self.telemetry_state["RED_LED"] = True return self.__state['red_led'] @red_led.setter def red_led(self, value): - if(not self.telemetry_state["RED_LED"]): + if(utils.telemetry_available() and not self.telemetry_state["RED_LED"]): utils.send_telemetry("RED_LED") self.telemetry_state["RED_LED"] = True self.__state['red_led'] = bool(value) @@ -156,7 +156,7 @@ def adjust_touch_threshold(self, adjustement): """Not implemented! The CPX Simulator doesn't use capacitive touch threshold. """ - if(not self.telemetry_state["ADJUST_THRESHOLD"]): + if(utils.telemetry_available() and not self.telemetry_state["ADJUST_THRESHOLD"]): utils.send_telemetry("ADJUST_THRESHOLD") self.telemetry_state["ADJUST_THRESHOLD"] = True @@ -167,7 +167,7 @@ def shake(self, shake_threshold=30): return self.__state['shake'] def play_file(self, file_name): - if(not self.telemetry_state["PLAY_FILE"]): + if(utils.telemetry_available() and not self.telemetry_state["PLAY_FILE"]): utils.send_telemetry("PLAY_FILE") self.telemetry_state["PLAY_FILE"] = True file_name = utils.remove_leading_slashes(file_name) @@ -192,7 +192,7 @@ def play_file(self, file_name): def play_tone(self, frequency, duration): """ Not Implemented! """ - if(not self.telemetry_state["PLAY_TONE"]): + if(utils.telemetry_available() and not self.telemetry_state["PLAY_TONE"]): utils.send_telemetry("PLAY_TONE") self.telemetry_state["PLAY_TONE"] = True raise NotImplementedError( @@ -201,7 +201,7 @@ def play_tone(self, frequency, duration): def start_tone(self, frequency): """ Not Implemented! """ - if(not self.telemetry_state["START_TONE"]): + if(utils.telemetry_available() and not self.telemetry_state["START_TONE"]): utils.send_telemetry("START_TONE") self.telemetry_state["START_TONE"] = True raise NotImplementedError( @@ -210,7 +210,7 @@ def start_tone(self, frequency): def stop_tone(self): """ Not Implemented! """ - if(not self.telemetry_state["STOP_TONE"]): + if(utils.telemetry_available() and not self.telemetry_state["STOP_TONE"]): utils.send_telemetry("STOP_TONE") self.telemetry_state["STOP_TONE"] = True raise NotImplementedError( diff --git a/src/adafruit_circuitplayground/pixel.py b/src/adafruit_circuitplayground/pixel.py index cc9044f9e..aee29e2b2 100644 --- a/src/adafruit_circuitplayground/pixel.py +++ b/src/adafruit_circuitplayground/pixel.py @@ -31,13 +31,13 @@ def __getitem__(self, index): if type(index) is not slice: if not self.__valid_index(index): raise IndexError(CONSTANTS.INDEX_ERROR) - if(not self.telemetry_state): + if(utils.telemetry_available() and not self.telemetry_state): utils.send_telemetry("PIXELS") self.telemetry_state = True return self.__state['pixels'][index] def __setitem__(self, index, val): - if(not self.telemetry_state): + if(utils.telemetry_available() and not self.telemetry_state): utils.send_telemetry("PIXELS") self.telemetry_state = True is_slice = False diff --git a/src/adafruit_circuitplayground/utils.py b/src/adafruit_circuitplayground/utils.py index 43b309ed4..c36e344d9 100644 --- a/src/adafruit_circuitplayground/utils.py +++ b/src/adafruit_circuitplayground/utils.py @@ -39,3 +39,6 @@ def send_telemetry(event_name): telemetry_client.track_event( '{}/{}'.format(EXTENSION_NAME, CONSTANTS.TELEMETRY_EVENT_NAMES[event_name])) telemetry_client.flush() + +def telemetry_available(): + return telemetry_client.context.instrumentation_key != '__AIKEY__' \ No newline at end of file