diff --git a/sbapp/main.py b/sbapp/main.py index ecd9cfe..965909e 100644 --- a/sbapp/main.py +++ b/sbapp/main.py @@ -1,4 +1,4 @@ -__debug_build__ = False +__debug_build__ = True __disable_shaders__ = False __version__ = "0.6.3" __variant__ = "beta" @@ -2868,13 +2868,10 @@ class SidebandApp(MDApp): self.root.ids.telemetry_s_location.active = self.sideband.config["telemetry_s_location"] self.root.ids.telemetry_s_location.bind(active=self.telemetry_location_toggle) - self.root.ids.telemetry_s_orientation.active = self.sideband.config["telemetry_s_orientation"] - self.root.ids.telemetry_s_orientation.bind(active=self.telemetry_save) - self.root.ids.telemetry_s_battery.active = self.sideband.config["telemetry_s_battery"] self.root.ids.telemetry_s_battery.bind(active=self.telemetry_save) - self.root.ids.telemetry_s_barometer.active = self.sideband.config["telemetry_s_barometer"] + self.root.ids.telemetry_s_barometer.active = self.sideband.config["telemetry_s_pressure"] self.root.ids.telemetry_s_barometer.bind(active=self.telemetry_save) self.root.ids.telemetry_s_temperature.active = self.sideband.config["telemetry_s_temperature"] @@ -2883,19 +2880,19 @@ class SidebandApp(MDApp): self.root.ids.telemetry_s_humidity.active = self.sideband.config["telemetry_s_humidity"] self.root.ids.telemetry_s_humidity.bind(active=self.telemetry_save) - self.root.ids.telemetry_s_compass.active = self.sideband.config["telemetry_s_compass"] + self.root.ids.telemetry_s_compass.active = self.sideband.config["telemetry_s_magnetic_field"] self.root.ids.telemetry_s_compass.bind(active=self.telemetry_save) - self.root.ids.telemetry_s_light.active = self.sideband.config["telemetry_s_light"] + self.root.ids.telemetry_s_light.active = self.sideband.config["telemetry_s_ambient_light"] self.root.ids.telemetry_s_light.bind(active=self.telemetry_save) self.root.ids.telemetry_s_gravity.active = self.sideband.config["telemetry_s_gravity"] self.root.ids.telemetry_s_gravity.bind(active=self.telemetry_save) - self.root.ids.telemetry_s_gyroscope.active = self.sideband.config["telemetry_s_gyroscope"] + self.root.ids.telemetry_s_gyroscope.active = self.sideband.config["telemetry_s_angular_velocity"] self.root.ids.telemetry_s_gyroscope.bind(active=self.telemetry_save) - self.root.ids.telemetry_s_accelerometer.active = self.sideband.config["telemetry_s_accelerometer"] + self.root.ids.telemetry_s_accelerometer.active = self.sideband.config["telemetry_s_acceleration"] self.root.ids.telemetry_s_accelerometer.bind(active=self.telemetry_save) self.root.ids.telemetry_s_proximity.active = self.sideband.config["telemetry_s_proximity"] @@ -2947,16 +2944,15 @@ class SidebandApp(MDApp): self.sideband.config["telemetry_send_appearance"] = self.root.ids.telemetry_send_appearance.active self.sideband.config["telemetry_s_location"] = self.root.ids.telemetry_s_location.active - self.sideband.config["telemetry_s_orientation"] = self.root.ids.telemetry_s_orientation.active self.sideband.config["telemetry_s_battery"] = self.root.ids.telemetry_s_battery.active - self.sideband.config["telemetry_s_barometer"] = self.root.ids.telemetry_s_barometer.active + self.sideband.config["telemetry_s_pressure"] = self.root.ids.telemetry_s_barometer.active self.sideband.config["telemetry_s_temperature"] = self.root.ids.telemetry_s_temperature.active self.sideband.config["telemetry_s_humidity"] = self.root.ids.telemetry_s_humidity.active - self.sideband.config["telemetry_s_compass"] = self.root.ids.telemetry_s_compass.active - self.sideband.config["telemetry_s_light"] = self.root.ids.telemetry_s_light.active + self.sideband.config["telemetry_s_magnetic_field"] = self.root.ids.telemetry_s_compass.active + self.sideband.config["telemetry_s_ambient_light"] = self.root.ids.telemetry_s_light.active self.sideband.config["telemetry_s_gravity"] = self.root.ids.telemetry_s_gravity.active - self.sideband.config["telemetry_s_gyroscope"] = self.root.ids.telemetry_s_gyroscope.active - self.sideband.config["telemetry_s_accelerometer"] = self.root.ids.telemetry_s_accelerometer.active + self.sideband.config["telemetry_s_angular_velocity"] = self.root.ids.telemetry_s_gyroscope.active + self.sideband.config["telemetry_s_acceleration"] = self.root.ids.telemetry_s_accelerometer.active self.sideband.config["telemetry_s_proximity"] = self.root.ids.telemetry_s_proximity.active self.sideband.save_configuration() @@ -2981,6 +2977,7 @@ class SidebandApp(MDApp): def telemetry_copy(self, sender=None): Clipboard.copy(str(self.sideband.get_telemetry())) + self.sideband.update_telemetry() def telemetry_send_update(self, sender=None): # TODO: Implement diff --git a/sbapp/sideband/core.py b/sbapp/sideband/core.py index 1f369b1..0e28f76 100644 --- a/sbapp/sideband/core.py +++ b/sbapp/sideband/core.py @@ -467,26 +467,24 @@ class SidebandCore(): if not "telemetry_s_location" in self.config: self.config["telemetry_s_location"] = False - if not "telemetry_s_orientation" in self.config: - self.config["telemetry_s_orientation"] = False if not "telemetry_s_battery" in self.config: self.config["telemetry_s_battery"] = False - if not "telemetry_s_barometer" in self.config: - self.config["telemetry_s_barometer"] = False + if not "telemetry_s_pressure" in self.config: + self.config["telemetry_s_pressure"] = False if not "telemetry_s_temperature" in self.config: self.config["telemetry_s_temperature"] = False if not "telemetry_s_humidity" in self.config: self.config["telemetry_s_humidity"] = False - if not "telemetry_s_compass" in self.config: - self.config["telemetry_s_compass"] = False - if not "telemetry_s_light" in self.config: - self.config["telemetry_s_light"] = False + if not "telemetry_s_magnetic_field" in self.config: + self.config["telemetry_s_magnetic_field"] = False + if not "telemetry_s_ambient_light" in self.config: + self.config["telemetry_s_ambient_light"] = False if not "telemetry_s_gravity" in self.config: self.config["telemetry_s_gravity"] = False - if not "telemetry_s_gyroscope" in self.config: - self.config["telemetry_s_gyroscope"] = False - if not "telemetry_s_accelerometer" in self.config: - self.config["telemetry_s_accelerometer"] = False + if not "telemetry_s_angular_velocity" in self.config: + self.config["telemetry_s_angular_velocity"] = False + if not "telemetry_s_acceleration" in self.config: + self.config["telemetry_s_acceleration"] = False if not "telemetry_s_proximity" in self.config: self.config["telemetry_s_proximity"] = False @@ -606,9 +604,13 @@ class SidebandCore(): else: return False - def is_trusted(self, context_dest): + def is_trusted(self, context_dest, conv_data = None): try: - existing_conv = self._db_conversation(context_dest) + if conv_data == None: + existing_conv = self._db_conversation(context_dest) + else: + existing_conv = conv_data + if existing_conv != None: if existing_conv["trust"] == 1: return True @@ -629,7 +631,10 @@ class SidebandCore(): if cd != None and "telemetry" in cd and cd["telemetry"] == True: return True else: - return False + if self.is_trusted(context_dest, conv_data=existing_conv) and self.config["telemetry_send_to_trusted"]: + return True + else: + return False else: return False @@ -1633,36 +1638,39 @@ class SidebandCore(): self.telemeter.stop_all() def update_telemetry(self): - telemetry = self.get_telemetry() - packed_telemetry = self.get_packed_telemetry() - telemetry_changed = False + try: + telemetry = self.get_telemetry() + packed_telemetry = self.get_packed_telemetry() + telemetry_changed = False - if telemetry != None and packed_telemetry != None: - if self.latest_telemetry == None or len(telemetry) != len(self.latest_telemetry): - telemetry_changed = True + if telemetry != None and packed_telemetry != None: + if self.latest_telemetry == None or len(telemetry) != len(self.latest_telemetry): + telemetry_changed = True - for sn in telemetry: - if telemetry_changed: - break + for sn in telemetry: + if telemetry_changed: + break - if sn != "time": - if sn in self.latest_telemetry: - if telemetry[sn] != self.latest_telemetry[sn]: + if sn != "time": + if sn in self.latest_telemetry: + if telemetry[sn] != self.latest_telemetry[sn]: + telemetry_changed = True + else: telemetry_changed = True - else: - telemetry_changed = True - if telemetry_changed: - self.telemetry_changes += 1 - self.latest_telemetry = telemetry - self.latest_packed_telemetry = packed_telemetry + if telemetry_changed: + self.telemetry_changes += 1 + self.latest_telemetry = telemetry + self.latest_packed_telemetry = packed_telemetry + except Exception as e: + RNS.log("Error while updating telemetry: "+str(e), RNS.LOG_ERROR) def update_telemeter_config(self): if self.config["telemetry_enabled"] == True: if self.telemeter == None: self.telemeter = Telemeter() - sensors = ["location", "orientation", "battery", "barometer", "temperature", "humidity", "compass", "light", "gravity", "gyroscope", "accelerometer", "proximity"] + sensors = ["location", "battery", "pressure", "temperature", "humidity", "magnetic_field", "ambient_light", "gravity", "angular_velocity", "acceleration", "proximity"] for sensor in sensors: if self.config["telemetry_s_"+sensor]: self.telemeter.enable(sensor) @@ -2357,7 +2365,7 @@ class SidebandCore(): if send_telemetry: # TODO: REMOVE - RNS.log("Sending telemetry", RNS.LOG_WARNING) + RNS.log("Sending telemetry: "+str(self.latest_packed_telemetry), RNS.LOG_WARNING) fields[LXMF.FIELD_TELEMETRY] = self.latest_packed_telemetry return fields diff --git a/sbapp/sideband/sense.py b/sbapp/sideband/sense.py index 8ff7090..8571752 100644 --- a/sbapp/sideband/sense.py +++ b/sbapp/sideband/sense.py @@ -17,7 +17,7 @@ class Telemeter(): name = None s = t.sids[sid]() for n in t.available: - if t.available[n] == type(s): + if t.sids[t.available[n]] == type(s): name = n if name != None: @@ -35,16 +35,32 @@ class Telemeter(): self.sids = { Sensor.SID_TIME: Time, Sensor.SID_BATTERY: Battery, - Sensor.SID_BAROMETER: Barometer, + Sensor.SID_PRESSURE: Pressure, Sensor.SID_LOCATION: Location, - Sensor.SID_PHYSICAL_LINK: PhysicalLink + Sensor.SID_PHYSICAL_LINK: PhysicalLink, + Sensor.SID_TEMPERATURE: Temperature, + Sensor.SID_HUMIDITY: Humidity, + Sensor.SID_MAGNETIC_FIELD: MagneticField, + Sensor.SID_AMBIENT_LIGHT: AmbientLight, + Sensor.SID_GRAVITY: Gravity, + Sensor.SID_ANGULAR_VELOCITY: AngularVelocity, + Sensor.SID_ACCELERATION: Acceleration, + Sensor.SID_PROXIMITY: Proximity, } self.available = { - "time": Time, - "battery": Battery, - "barometer": Barometer, - "location": Location, - "physical_link": PhysicalLink, + "time": Sensor.SID_TIME, + "battery": Sensor.SID_BATTERY, + "pressure": Sensor.SID_PRESSURE, + "location": Sensor.SID_LOCATION, + "physical_link": Sensor.SID_PHYSICAL_LINK, + "temperature": Sensor.SID_TEMPERATURE, + "humidity": Sensor.SID_HUMIDITY, + "magnetic_field": Sensor.SID_MAGNETIC_FIELD, + "ambient_light": Sensor.SID_AMBIENT_LIGHT, + "gravity": Sensor.SID_GRAVITY, + "angular_velocity": Sensor.SID_ANGULAR_VELOCITY, + "acceleration": Sensor.SID_ACCELERATION, + "proximity": Sensor.SID_PROXIMITY, } self.from_packed = from_packed self.sensors = {} @@ -61,7 +77,7 @@ class Telemeter(): if not self.from_packed: if sensor in self.available: if not sensor in self.sensors: - self.sensors[sensor] = self.available[sensor]() + self.sensors[sensor] = self.sids[self.available[sensor]]() if not self.sensors[sensor].active: self.sensors[sensor].start() @@ -108,12 +124,20 @@ class Telemeter(): return umsgpack.packb(packed) class Sensor(): - SID_NONE = 0x00 - SID_TIME = 0x01 - SID_LOCATION = 0x02 - SID_BAROMETER = 0x03 - SID_BATTERY = 0x04 - SID_PHYSICAL_LINK = 0x05 + SID_NONE = 0x00 + SID_TIME = 0x01 + SID_LOCATION = 0x02 + SID_PRESSURE = 0x03 + SID_BATTERY = 0x04 + SID_PHYSICAL_LINK = 0x05 + SID_ACCELERATION = 0x06 + SID_TEMPERATURE = 0x07 + SID_HUMIDITY = 0x08 + SID_MAGNETIC_FIELD = 0x09 + SID_AMBIENT_LIGHT = 0x0A + SID_GRAVITY = 0x0B + SID_ANGULAR_VELOCITY = 0x0C + SID_PROXIMITY = 0x0E def __init__(self, sid = None, stale_time = None): self._sid = sid or Sensor.SID_NONE @@ -280,8 +304,8 @@ class Battery(Sensor): except: return None -class Barometer(Sensor): - SID = Sensor.SID_BAROMETER +class Pressure(Sensor): + SID = Sensor.SID_PRESSURE STALE_TIME = 5 def __init__(self): @@ -289,22 +313,22 @@ class Barometer(Sensor): if RNS.vendor.platformutils.is_android(): from plyer import barometer - self.android_barometer = barometer + self.android_sensor = barometer def setup_sensor(self): if RNS.vendor.platformutils.is_android(): - self.android_barometer.enable() + self.android_sensor.enable() self.update_data() def teardown_sensor(self): if RNS.vendor.platformutils.is_android(): - self.android_barometer.disable() + self.android_sensor.disable() self.data = None def update_data(self): try: if RNS.vendor.platformutils.is_android(): - self.data = {"mbar": self.android_barometer.pressure} + self.data = {"mbar": self.android_sensor.pressure} except: self.data = None @@ -493,5 +517,369 @@ class PhysicalLink(Sensor): return None else: return {"rssi": packed[0], "snr": packed[1], "q": packed[2]} + except: + return None + +class Temperature(Sensor): + SID = Sensor.SID_TEMPERATURE + STALE_TIME = 5 + + def __init__(self): + super().__init__(type(self).SID, type(self).STALE_TIME) + + if RNS.vendor.platformutils.is_android(): + from plyer import temperature + self.android_sensor = temperature + + def setup_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.enable() + self.update_data() + + def teardown_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.disable() + self.data = None + + def update_data(self): + try: + if RNS.vendor.platformutils.is_android(): + self.data = {"c": round(self.android_sensor.temperature, 2)} + + except: + self.data = None + + def pack(self): + d = self.data + if d == None: + return None + else: + return d["percent_relative"] + + def unpack(self, packed): + try: + if packed == None: + return None + else: + return {"percent_relative": packed} + except: + return None + +class Humidity(Sensor): + SID = Sensor.SID_HUMIDITY + STALE_TIME = 5 + + def __init__(self): + super().__init__(type(self).SID, type(self).STALE_TIME) + + if RNS.vendor.platformutils.is_android(): + from plyer import humidity + self.android_sensor = humidity + + def setup_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.enable() + self.update_data() + + def teardown_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.disable() + self.data = None + + def update_data(self): + try: + if RNS.vendor.platformutils.is_android(): + self.data = {"percent_relative": round(self.android_sensor.tell, 2)} + + except: + self.data = None + + def pack(self): + d = self.data + if d == None: + return None + else: + return d["percent_relative"] + + def unpack(self, packed): + try: + if packed == None: + return None + else: + return {"percent_relative": packed} + except: + return None + +class MagneticField(Sensor): + SID = Sensor.SID_MAGNETIC_FIELD + STALE_TIME = 1 + + def __init__(self): + super().__init__(type(self).SID, type(self).STALE_TIME) + + if RNS.vendor.platformutils.is_android(): + from plyer import compass + self.android_sensor = compass + + def setup_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.enable() + self.update_data() + + def teardown_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.disable() + self.data = None + + def update_data(self): + try: + if RNS.vendor.platformutils.is_android(): + vectors = self.android_sensor.field + self.data = {"x": round(vectors[0], 6), "y": round(vectors[1], 6), "z": round(vectors[2], 6)} + + except: + self.data = None + + def pack(self): + d = self.data + if d == None: + return None + else: + return [d["x"], d["y"], d["z"]] + + def unpack(self, packed): + try: + if packed == None: + return None + else: + return {"x": packed[0], "y": packed[1], "z": packed[2]} + except: + return None + +class AmbientLight(Sensor): + SID = Sensor.SID_AMBIENT_LIGHT + STALE_TIME = 1 + + def __init__(self): + super().__init__(type(self).SID, type(self).STALE_TIME) + + if RNS.vendor.platformutils.is_android(): + from plyer import light + self.android_sensor = light + + def setup_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.enable() + self.update_data() + + def teardown_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.disable() + self.data = None + + def update_data(self): + try: + if RNS.vendor.platformutils.is_android(): + self.data = {"lux": round(self.android_sensor.illumination, 2)} + + except: + self.data = None + + def pack(self): + d = self.data + if d == None: + return None + else: + return d["lux"] + + def unpack(self, packed): + try: + if packed == None: + return None + else: + return {"lux": packed} + except: + return None + +class Gravity(Sensor): + SID = Sensor.SID_GRAVITY + STALE_TIME = 1 + + def __init__(self): + super().__init__(type(self).SID, type(self).STALE_TIME) + + if RNS.vendor.platformutils.is_android(): + from plyer import gravity + self.android_sensor = gravity + + def setup_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.enable() + self.update_data() + + def teardown_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.disable() + self.data = None + + def update_data(self): + try: + if RNS.vendor.platformutils.is_android(): + vectors = self.android_sensor.gravity + self.data = {"x": round(vectors[0], 6), "y": round(vectors[1], 6), "z": round(vectors[2], 6)} + + except: + self.data = None + + def pack(self): + d = self.data + if d == None: + return None + else: + return [d["x"], d["y"], d["z"]] + + def unpack(self, packed): + try: + if packed == None: + return None + else: + return {"x": packed[0], "y": packed[1], "z": packed[2]} + except: + return None + +class AngularVelocity(Sensor): + SID = Sensor.SID_ANGULAR_VELOCITY + STALE_TIME = 1 + + def __init__(self): + super().__init__(type(self).SID, type(self).STALE_TIME) + + if RNS.vendor.platformutils.is_android(): + from plyer import gyroscope + self.android_sensor = gyroscope + + def setup_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.enable() + self.update_data() + + def teardown_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.disable() + self.data = None + + def update_data(self): + try: + if RNS.vendor.platformutils.is_android(): + vectors = self.android_sensor.rotation + self.data = {"x": round(vectors[0], 6), "y": round(vectors[1], 6), "z": round(vectors[2], 6)} + + except: + self.data = None + + def pack(self): + d = self.data + if d == None: + return None + else: + return [d["x"], d["y"], d["z"]] + + def unpack(self, packed): + try: + if packed == None: + return None + else: + return {"x": packed[0], "y": packed[1], "z": packed[2]} + except: + return None + +class Acceleration(Sensor): + SID = Sensor.SID_ACCELERATION + STALE_TIME = 1 + + def __init__(self): + super().__init__(type(self).SID, type(self).STALE_TIME) + + if RNS.vendor.platformutils.is_android(): + from plyer import accelerometer + self.android_sensor = accelerometer + + def setup_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.enable() + self.update_data() + + def teardown_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.disable() + self.data = None + + def update_data(self): + try: + if RNS.vendor.platformutils.is_android(): + vectors = self.android_sensor.acceleration + self.data = {"x": round(vectors[0], 6), "y": round(vectors[1], 6), "z": round(vectors[2], 6)} + + except: + self.data = None + + def pack(self): + d = self.data + if d == None: + return None + else: + return [d["x"], d["y"], d["z"]] + + def unpack(self, packed): + try: + if packed == None: + return None + else: + return {"x": packed[0], "y": packed[1], "z": packed[2]} + except: + return None + +class Proximity(Sensor): + SID = Sensor.SID_PROXIMITY + STALE_TIME = 1 + + def __init__(self): + super().__init__(type(self).SID, type(self).STALE_TIME) + + if RNS.vendor.platformutils.is_android(): + from plyer import proximity + self.android_sensor = proximity + + def setup_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.enable() + self.update_data() + + def teardown_sensor(self): + if RNS.vendor.platformutils.is_android(): + self.android_sensor.disable() + self.data = None + + def update_data(self): + try: + if RNS.vendor.platformutils.is_android(): + self.data = self.android_sensor.proximity + + except: + self.data = None + + def pack(self): + d = self.data + if d == None: + return None + else: + return d + + def unpack(self, packed): + try: + if packed == None: + return None + else: + return packed except: return None \ No newline at end of file diff --git a/sbapp/ui/layouts.py b/sbapp/ui/layouts.py index f4387eb..8a0d72e 100644 --- a/sbapp/ui/layouts.py +++ b/sbapp/ui/layouts.py @@ -1102,21 +1102,6 @@ MDNavigationLayout: pos_hint: {"center_y": 0.3} active: False - MDBoxLayout: - orientation: "horizontal" - size_hint_y: None - padding: [0,0,dp(24),dp(0)] - height: dp(48) - - MDLabel: - text: "Orientation" - font_style: "H6" - - MDSwitch: - id: telemetry_s_orientation - pos_hint: {"center_y": 0.3} - active: False - MDBoxLayout: orientation: "horizontal" size_hint_y: None @@ -1139,7 +1124,7 @@ MDNavigationLayout: height: dp(48) MDLabel: - text: "Barometer" + text: "Pressure" font_style: "H6" MDSwitch: @@ -1184,7 +1169,7 @@ MDNavigationLayout: height: dp(48) MDLabel: - text: "Compass" + text: "Magnetic Field" font_style: "H6" MDSwitch: @@ -1229,7 +1214,7 @@ MDNavigationLayout: height: dp(48) MDLabel: - text: "Gyroscope" + text: "Angular Velocity" font_style: "H6" MDSwitch: @@ -1244,7 +1229,7 @@ MDNavigationLayout: height: dp(48) MDLabel: - text: "Accelerometer" + text: "Acceleration" font_style: "H6" MDSwitch: diff --git a/sbapp/ui/messages.py b/sbapp/ui/messages.py index 917f989..9f8decc 100644 --- a/sbapp/ui/messages.py +++ b/sbapp/ui/messages.py @@ -173,7 +173,6 @@ class Messages(): extra_telemetry = {} phy_stats_str = "" - RNS.log(str(m["lxm"].fields), RNS.LOG_WARNING) if "extras" in m and m["extras"] != None: phy_stats = m["extras"] if "q" in phy_stats: