Skip to content

Commit c584f0b

Browse files
committed
Mob team synchronized via MQTT.
1 parent 0077339 commit c584f0b

File tree

9 files changed

+93
-64
lines changed

9 files changed

+93
-64
lines changed

Frames/MobTimerController.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ def __init__(self, *args, **kwargs):
3333
self.timer_extension_count = self.settings_manager.get_timer_extension_count()
3434
self.extensions_used = 0
3535
atexit.register(self.session_manager.clear_sessions)
36-
if self.session_manager.get_active_sessions().__len__() > 0:
37-
self.quit_and_destroy_session()
36+
# if self.session_manager.get_active_sessions().__len__() > 0:
37+
# self.quit_and_destroy_session()
3838

3939
self.session_manager.create_session()
4040
self.iconbitmap(default='time-bomb.ico')
@@ -83,7 +83,7 @@ def __init__(self, *args, **kwargs):
8383
self.dojo_manager = DojoManager(self)
8484

8585

86-
def launch_transparent_countdown_if_blocking(self, event):
86+
def launch_transparent_countdown_if_blocking(self, event = None):
8787
if self.frame_is_screen_blocking():
8888
self.show_transparent_countdown_frame()
8989

@@ -160,6 +160,7 @@ def remove_title_bar(self):
160160
container.master.overrideredirect(1)
161161

162162
def set_always_on_top(self):
163+
return
163164
for container in self.containers:
164165
container.master.wm_attributes("-topmost", True)
165166
if PlatformUtility.platform_is_mac():
@@ -169,6 +170,7 @@ def set_always_on_top(self):
169170
container.master.focus_force()
170171

171172
def set_full_screen_always_on_top(self):
173+
return
172174
self.set_always_on_top()
173175
self.remove_title_bar()
174176
self.disable_resizing()

Frames/ScreenBlockerFrame.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def mobber_list_change_callback(self, mobber_list, driver_index, navigator_index
4747

4848
self.names_list.insert('', END, text=name, tags=tags)
4949

50-
def time_change_callback(self, time, minutes, seconds):
50+
def time_change_callback(self, time, minutes, seconds, origin_station_name=None):
5151
self.label_minutes['text'] = "{0:0>2}".format(minutes)
5252
self.label_seconds['text'] = "{0:0>2}".format(seconds)
5353

@@ -203,11 +203,9 @@ def remove_mobber_if_screen_blocking(self, event):
203203
def add_default_team(self, event):
204204
team = self.settings_manager.get_general_team().split(',')
205205
randomize_team = self.settings_manager.get_randomize_team()
206-
self.mobber_manager.clear()
207206
if randomize_team:
208207
random.shuffle(team)
209-
for member in team:
210-
self.mobber_manager.add_mobber(member)
208+
self.mobber_manager.set_mobber_list(team)
211209

212210
def focus_mobber_entry(self):
213211
self.add_mobber_entry.focus_set()

Infrastructure/DojoManager.py

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,62 @@
11
import _thread
22
import random
3+
import uuid
34

45
import paho.mqtt.publish as mqtt_pub
56
import paho.mqtt.client as mqtt
67
import json
78

8-
RANDOM_TOPIC_BID = "RandomTopicBid"
9-
10-
START_RANDOM_DRIVER_BID = "StartRandomDriverBid"
11-
129
MOBBER_LIST = "MobberList"
1310

1411
TIME_CHANGE = "TimeChange"
1512

13+
SAY_HELLO = "SayHello"
14+
15+
START_TIMER = "StartTimer"
16+
1617

1718
class DojoManager(object):
1819
def __init__(self, controller):
1920
if not controller.settings_manager.get_dojo_enabled():
2021
return
22+
23+
self.time_change_increment = 0
24+
self.mobber_change_increment = 0
25+
self.session_id = uuid.uuid4().__str__()
26+
27+
2128
self.switch_dictionary = {
2229
MOBBER_LIST: self.sub_mobber_list,
2330
TIME_CHANGE: self.sub_time_change,
24-
START_RANDOM_DRIVER_BID: self.sub_start_random_driver_bid,
25-
RANDOM_TOPIC_BID: self.sub_random_topic_bid
31+
SAY_HELLO: self.sub_say_hello,
32+
START_TIMER: self.sub_start_timer,
2633
}
2734
self.station_drivers = {}
35+
self.other_stations = []
2836
self.controller = controller
2937
self.dojo_broker = self.controller.settings_manager.get_dojo_broker()
3038
self.dojo_port = self.controller.settings_manager.get_dojo_port()
31-
self.dojo_mob_station_name = self.controller.settings_manager.get_dojo_mob_station_name()
39+
self.dojo_mob_station_name = self.controller.settings_manager.get_dojo_mob_station_name() + uuid.uuid4().__str__()
3240
self.dojo_session_id = self.controller.settings_manager.get_dojo_session_id()
3341
self.dojo_topic_root = self.controller.settings_manager.get_dojo_topic_root()
3442
self.controller.mobber_manager.subscribe_to_mobber_list_change(self.publish_mobber_list_changes)
3543
self.controller.time_options_manager.subscribe_to_timechange(self.publish_time_change)
3644
self.subscribe_to_time_change()
45+
self.say_hello()
46+
47+
def say_hello(self):
48+
topic = self.generate_topic(SAY_HELLO)
49+
self.publish(topic, "")
3750

38-
def publish_time_change(self, time_string, minutes, seconds):
51+
def publish_time_change(self, time_string, minutes, seconds, origin_station_name=None):
3952
topic = self.generate_topic(TIME_CHANGE)
53+
station_name = self.dojo_mob_station_name
54+
if origin_station_name is not None:
55+
return
4056
payload_dictionary = {
4157
"minutes": minutes,
42-
"seconds": seconds
58+
"seconds": seconds,
59+
"station_name": station_name
4360
}
4461
payload = json.dumps(payload_dictionary)
4562
self.publish(topic, payload)
@@ -73,6 +90,7 @@ def on_message(self, client, userdata, msg):
7390
session_id = topic_parts[1]
7491
station_name = topic_parts[2]
7592
message_type = topic_parts[3]
93+
print("on_message",msg.topic)
7694
self.switch_statement_dictionary_trick(station_name, message_type, msg.payload)
7795

7896
def switch_statement_dictionary_trick(self, station_name, message_type, payload):
@@ -81,43 +99,42 @@ def switch_statement_dictionary_trick(self, station_name, message_type, payload)
8199
def sub_mobber_list(self, station_name, message_type, payload):
82100
if not station_name == self.dojo_mob_station_name:
83101
payload_dictionary = json.loads(payload.decode("utf-8"))
84-
for mobber in payload_dictionary["mobber_list"]:
85-
self.controller.mobber_manager.add_mobber(mobber)
86-
topic = self.generate_topic(START_RANDOM_DRIVER_BID)
87-
self.publish(topic, "")
102+
mobber_list = payload_dictionary["mobber_list"]
103+
print("sub_mobber_list",mobber_list)
104+
self.controller.mobber_manager.set_mobber_list(mobber_list)
88105

89106
def generate_topic(self, message_type):
90107
topic = "{}/{}/{}/{}".format(self.dojo_topic_root, self.dojo_session_id, self.dojo_mob_station_name,
91108
message_type)
109+
print("generate_topic",topic)
92110
return topic
93111

94112
def sub_time_change(self, station_name, message_type, payload):
113+
print(payload)
95114
if not station_name == self.dojo_mob_station_name:
96115
payload_dictionary = json.loads(payload.decode("utf-8"))
97116
minutes = payload_dictionary["minutes"]
98117
seconds = payload_dictionary["seconds"]
118+
origin_station_name = payload_dictionary["station_name"]
99119
if not (
100120
self.controller.time_options_manager.minutes == minutes and self.controller.time_options_manager.seconds == seconds):
101-
self.controller.time_options_manager.set_countdown_time(minutes, seconds)
121+
self.controller.time_options_manager.set_countdown_time(minutes, seconds, origin_station_name)
102122

103-
def sub_start_random_driver_bid(self, station_name, message_type, payload):
104-
print(message_type)
105-
# topic = self.generate_topic(RANDOM_TOPIC_BID)
106-
# if self.controller.mobber_manager.mobber_list.__len__() > 1:
107-
# payload_dictionary = {"bid": random.randint(0, 100),
108-
# "mobber": random.choice(self.controller.mobber_manager.mobber_list)}
109-
# self.publish(topic, json.dumps(payload_dictionary))
123+
def sub_say_hello(self, station_name, message_type, payload):
124+
if not station_name == self.dojo_mob_station_name:
125+
if not self.other_stations.__contains__(station_name):
126+
self.other_stations.append(station_name)
127+
topic = self.generate_topic(SAY_HELLO)
128+
self.publish(topic, "")
110129

111-
def sub_random_topic_bid(self, station_name, message_type, payload):
112-
print(payload)
113-
# payload_dictionary = json.loads(payload.decode("utf-8"))
114-
# self.station_drivers[payload_dictionary["mobber"]] = station_name
115-
# print(self.station_drivers)
116-
# self.controller.mobber_manager.fire_time_change_callbacks()
130+
def sub_start_timer(self, station_name, message_type, payload):
131+
if not station_name == self.dojo_mob_station_name:
132+
self.controller.launch_transparent_countdown_if_blocking()
117133

118134
def subscribe_to_dojo(self):
119135
client = mqtt.Client()
120136
client.on_connect = self.on_connect
121137
client.on_message = self.on_message
122138
client.connect(self.dojo_broker, self.dojo_port, 60)
123139
client.loop_forever()
140+

Infrastructure/MobberManager.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,43 +16,44 @@ def add_mobber(self, mobber_name):
1616
clean_mobber_name = str(mobber_name).strip()
1717
if clean_mobber_name != "" and not self.mobber_list.__contains__(clean_mobber_name):
1818
self.mobber_list.append(mobber_name)
19-
self.fire_time_change_callbacks()
19+
self.fire_mobber_list_change_callbacks()
2020

2121
def get_mobbers(self):
2222
return self.mobber_list
2323

2424
def remove_mobber(self, remove_mobber_index):
25-
if self.mobber_count() == 0: return
25+
if self.mobber_count() == 0:
26+
return
2627
del self.mobber_list[remove_mobber_index]
27-
self.fire_time_change_callbacks()
28+
self.fire_mobber_list_change_callbacks()
2829

2930
def move_mobber_up(self, swap_index):
3031
if self.mobber_count() == 0: return
3132
destination_index = swap_index - 1
3233
self.mobber_list[swap_index], self.mobber_list[destination_index] = self.mobber_list[destination_index], \
3334
self.mobber_list[swap_index]
34-
self.fire_time_change_callbacks()
35+
self.fire_mobber_list_change_callbacks()
3536

3637
def move_mobber_down(self, swap_index):
3738
if self.mobber_count() == 0: return
3839
destination_index = (swap_index + 1) % self.mobber_list.__len__()
3940
self.mobber_list[swap_index], self.mobber_list[destination_index] = self.mobber_list[destination_index], \
4041
self.mobber_list[swap_index]
41-
self.fire_time_change_callbacks()
42+
self.fire_mobber_list_change_callbacks()
4243

4344
def subscribe_to_mobber_list_change(self, mobber_list_change_callback):
4445
self.mobber_list_change_callbacks.append(mobber_list_change_callback)
45-
self.fire_time_change_callbacks()
46+
self.fire_mobber_list_change_callbacks()
4647

47-
def fire_time_change_callbacks(self):
48+
def fire_mobber_list_change_callbacks(self):
4849
self.update_next_driver_index()
4950
for mobber_list_change_callback in self.mobber_list_change_callbacks:
5051
if mobber_list_change_callback:
5152
mobber_list_change_callback(self.mobber_list, self.driver_index, self.next_driver_index)
5253

5354
def clear(self):
5455
self.mobber_list = []
55-
self.fire_time_change_callbacks()
56+
self.fire_mobber_list_change_callbacks()
5657

5758
def switch_next_driver(self):
5859
mobber_count = self.mobber_list.__len__()
@@ -61,7 +62,7 @@ def switch_next_driver(self):
6162
self.driver_index = self.next_driver_index
6263
else:
6364
self.driver_index = (self.driver_index + 1) % mobber_count
64-
self.fire_time_change_callbacks()
65+
self.fire_mobber_list_change_callbacks()
6566

6667
def update_next_driver_index(self):
6768
mobber_count = self.mobber_list.__len__()
@@ -84,5 +85,14 @@ def rewind_driver(self):
8485
if self.driver_index < 0:
8586
self.driver_index = mobber_count - 1
8687
self.update_next_driver_index()
87-
self.fire_time_change_callbacks()
88+
self.fire_mobber_list_change_callbacks()
89+
90+
def set_mobber_list(self, mobber_list):
91+
if self.mobber_list != mobber_list:
92+
self.mobber_list = []
93+
for mobber_name in mobber_list:
94+
clean_mobber_name = str(mobber_name).strip()
95+
if clean_mobber_name != "" and not self.mobber_list.__contains__(clean_mobber_name):
96+
self.mobber_list.append(mobber_name)
97+
self.fire_mobber_list_change_callbacks()
8898

Infrastructure/TimeSettingsManager.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ def subscribe_to_timechange(self, time_change_callback):
2929
self.time_change_callbacks.append(time_change_callback)
3030
self.fire_time_change_callbacks()
3131

32-
def fire_time_change_callbacks(self):
32+
def fire_time_change_callbacks(self, origin_station_name=None):
3333
for time_change_callback in self.time_change_callbacks:
3434
if time_change_callback:
35-
time_change_callback(self.get_time_string(), self.minutes, self.seconds)
35+
time_change_callback(self.get_time_string(), self.minutes, self.seconds, origin_station_name)
3636

37-
def set_countdown_time(self, minutes, seconds):
37+
def set_countdown_time(self, minutes, seconds, origin_station_name=None):
3838
self.minutes = minutes
3939
self.seconds = seconds
40-
self.fire_time_change_callbacks()
40+
self.fire_time_change_callbacks(origin_station_name)

MobTimer.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ extension count = 1
3333

3434
[CODE DOJO]
3535
enable dojo mode = True
36-
broker = iot.eclipse.org
36+
broker = localhost
3737
port = 1883
3838
mob station name = NewName
3939
session id = 1337

tests/Infrastructure/MobberManager/TestsMobberManager.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def test_add_mobber_joe_chris_joe__remove_joe_has_joe_chris(self):
3030
mobber_manager = MobberManager()
3131
mobber_manager.add_mobber("Joe")
3232
mobber_manager.add_mobber("Chris")
33-
mobber_manager.add_mobber("Joe")
33+
mobber_manager.add_mobber("John")
3434
mobber_manager.remove_mobber(2)
3535
result = ["Joe", "Chris"]
3636
self.assertEqual(mobber_manager.get_mobbers(), result)
@@ -178,6 +178,7 @@ def time_change_callback(mobber_list, driver_index, navigator_index):
178178
mobber_manager.switch_next_driver()
179179
mobber_manager.switch_next_driver()
180180
mobber_manager.switch_next_driver()
181+
mobber_manager.set_mobber_list(["Hello", "Eric", "Joe"])
181182
mobber_manager.switch_next_driver()
182183
mobber_manager.switch_next_driver()
183184
mobber_manager.remove_mobber(2)

tests/Infrastructure/MobberManager/tests.Infrastructure.MobberManager.TestsMobberManager.test_subscribe_to_mobber_list_changes_random.approved.txt

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@ Action 7:Joe, Chris (Next), Sam, John (Driver), Bill,
99
Action 8:Joe, Chris (Driver), Sam (Next), John, Bill,
1010
Action 9:Joe, Chris, Sam (Driver), John (Next), Bill,
1111
Action 10:Joe, Chris (Next), Sam, John (Driver), Bill,
12-
Action 11:Joe, Chris (Driver), Sam (Next), John, Bill,
13-
Action 12:Joe, Chris, Sam (Driver), John, Bill (Next),
14-
Action 13:Joe, Chris (Next), John (Driver), Bill,
15-
Action 14:Chris, John (Next), Bill (Driver),
16-
Action 15:Chris (Next), John (Driver), Bill,
17-
Action 16:Chris, John (Driver), Bill, Seth (Next),
18-
Action 17:John, Chris (Driver), Bill, Seth (Next),
19-
Action 18:John, Chris (Driver), Bill, Seth, Fredrick (Next),
20-
Action 19:John, Bill (Driver), Chris, Seth, Fredrick (Next),
21-
Action 20:John, Chris (Driver), Seth (Next), Fredrick,
22-
Action 21:Chris, Seth (Driver), Fredrick (Next),
23-
Action 22:Seth (Next), Fredrick (Driver),
12+
Action 11:Hello, Eric (Next), Joe,
13+
Action 12:Hello, Eric (Driver), Joe (Next),
14+
Action 13:Hello, Eric (Next), Joe (Driver),
15+
Action 14:Hello (Driver), Eric (Next),
16+
Action 15:Eric (Driver) (Next),
17+
Action 16:Eric (Driver) (Next),
18+
Action 17:Eric (Driver), Seth (Next),
19+
Action 18:Seth (Driver), Eric (Next),
20+
Action 19:Seth (Driver), Eric, Fredrick (Next),
21+
Action 20:Seth (Driver), Fredrick (Next), Eric,
22+
Action 21:Seth (Driver), Eric (Next),
23+
Action 22:Eric (Driver) (Next),
24+
Action 23:

tests/Infrastructure/TimeOptionsManager/TestsTimeOptionsManager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def test_subscribe_to_time_changes(self):
5858
time_options_manager = TimeSettingsManager()
5959
result = {"result": "time"}
6060

61-
def time_change_callback(time, minutes, seconds):
61+
def time_change_callback(time, minutes, seconds,origin_station_name):
6262
result["result"] += " " + time
6363

6464
time_options_manager.subscribe_to_timechange(time_change_callback)
@@ -71,7 +71,7 @@ def test_subscribe_to_time_changes_complex(self):
7171
time_options_manager = TimeSettingsManager()
7272
result = {"result": "Time Options after Change:", "increment" : 0}
7373

74-
def time_change_callback(time, minutes, seconds):
74+
def time_change_callback(time, minutes, seconds,origin_station_name):
7575
result["increment"] += 1
7676
result["result"] += "\n Change " + result["increment"].__str__() + "| " + time
7777

0 commit comments

Comments
 (0)