Skip to content

Commit 0077339

Browse files
committed
Implementing Random Driver Bidding
1 parent e09238e commit 0077339

File tree

7 files changed

+175
-9
lines changed

7 files changed

+175
-9
lines changed

Frames/MobTimerController.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from Frames.ScreenBlockerFrame import ScreenBlockerFrame
99
from Frames.TransparentCountdownFrame import TransparentCountdownFrame
1010
from Infrastructure.CountdownManager import CountdownManager
11+
from Infrastructure.DojoManager import DojoManager
1112
from Infrastructure.MobberManager import MobberManager
1213
from Infrastructure.PlatformUtility import PlatformUtility
1314
from Infrastructure.ScreenUtility import ScreenUtility
@@ -79,6 +80,9 @@ def __init__(self, *args, **kwargs):
7980
self.bind_all("<Control-Return>", self.launch_transparent_countdown_if_blocking)
8081
self.time_options_manager.set_countdown_time(self.settings_manager.get_timer_minutes(), self.settings_manager.get_timer_seconds())
8182

83+
self.dojo_manager = DojoManager(self)
84+
85+
8286
def launch_transparent_countdown_if_blocking(self, event):
8387
if self.frame_is_screen_blocking():
8488
self.show_transparent_countdown_frame()

Frames/ScreenBlockerFrame.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,15 @@ def mobber_list_change_callback(self, mobber_list, driver_index, navigator_index
3535
for index in range(0, mobber_list.__len__()):
3636
tags = ()
3737
name = mobber_list[index]
38-
if index == driver_index:
39-
tags = (TAGNAME_CURRENT_MOBBER)
40-
name += " <= Current"
41-
if index == navigator_index:
42-
name += " <= Next"
38+
if self.controller.settings_manager.get_dojo_enabled:
39+
if self.controller.dojo_manager.station_drivers.__contains__(name):
40+
name += " <= {}".format(self.controller.dojo_manager.station_drivers[name])
41+
else:
42+
if index == driver_index:
43+
tags = (TAGNAME_CURRENT_MOBBER)
44+
name += " <= Current"
45+
if index == navigator_index:
46+
name += " <= Next"
4347

4448
self.names_list.insert('', END, text=name, tags=tags)
4549

Infrastructure/DojoManager.py

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import _thread
2+
import random
3+
4+
import paho.mqtt.publish as mqtt_pub
5+
import paho.mqtt.client as mqtt
6+
import json
7+
8+
RANDOM_TOPIC_BID = "RandomTopicBid"
9+
10+
START_RANDOM_DRIVER_BID = "StartRandomDriverBid"
11+
12+
MOBBER_LIST = "MobberList"
13+
14+
TIME_CHANGE = "TimeChange"
15+
16+
17+
class DojoManager(object):
18+
def __init__(self, controller):
19+
if not controller.settings_manager.get_dojo_enabled():
20+
return
21+
self.switch_dictionary = {
22+
MOBBER_LIST: self.sub_mobber_list,
23+
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
26+
}
27+
self.station_drivers = {}
28+
self.controller = controller
29+
self.dojo_broker = self.controller.settings_manager.get_dojo_broker()
30+
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()
32+
self.dojo_session_id = self.controller.settings_manager.get_dojo_session_id()
33+
self.dojo_topic_root = self.controller.settings_manager.get_dojo_topic_root()
34+
self.controller.mobber_manager.subscribe_to_mobber_list_change(self.publish_mobber_list_changes)
35+
self.controller.time_options_manager.subscribe_to_timechange(self.publish_time_change)
36+
self.subscribe_to_time_change()
37+
38+
def publish_time_change(self, time_string, minutes, seconds):
39+
topic = self.generate_topic(TIME_CHANGE)
40+
payload_dictionary = {
41+
"minutes": minutes,
42+
"seconds": seconds
43+
}
44+
payload = json.dumps(payload_dictionary)
45+
self.publish(topic, payload)
46+
47+
def publish_mobber_list_changes(self, mobber_list, driver_index, next_driver_index):
48+
topic = self.generate_topic(MOBBER_LIST)
49+
payload_object = {
50+
"driver_index": driver_index,
51+
"next_driver_index": next_driver_index,
52+
"mobber_list": mobber_list
53+
}
54+
payload = json.dumps(payload_object)
55+
self.publish(topic, payload)
56+
57+
def publish(self, topic, payload):
58+
_thread.start_new_thread(self.thread_publish, (topic, payload))
59+
60+
def thread_publish(self, topic, payload):
61+
mqtt_pub.single(topic, hostname=self.dojo_broker, port=self.dojo_port, payload=payload)
62+
63+
def subscribe_to_time_change(self):
64+
_thread.start_new_thread(self.subscribe_to_dojo, ())
65+
66+
def on_connect(self, client, userdata, flags, rc):
67+
topic = "{}/{}/#".format(self.dojo_topic_root, self.dojo_session_id)
68+
client.subscribe(topic)
69+
70+
def on_message(self, client, userdata, msg):
71+
topic_parts = msg.topic.split('/')
72+
topic_root = topic_parts[0]
73+
session_id = topic_parts[1]
74+
station_name = topic_parts[2]
75+
message_type = topic_parts[3]
76+
self.switch_statement_dictionary_trick(station_name, message_type, msg.payload)
77+
78+
def switch_statement_dictionary_trick(self, station_name, message_type, payload):
79+
self.switch_dictionary[message_type](station_name, message_type, payload)
80+
81+
def sub_mobber_list(self, station_name, message_type, payload):
82+
if not station_name == self.dojo_mob_station_name:
83+
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, "")
88+
89+
def generate_topic(self, message_type):
90+
topic = "{}/{}/{}/{}".format(self.dojo_topic_root, self.dojo_session_id, self.dojo_mob_station_name,
91+
message_type)
92+
return topic
93+
94+
def sub_time_change(self, station_name, message_type, payload):
95+
if not station_name == self.dojo_mob_station_name:
96+
payload_dictionary = json.loads(payload.decode("utf-8"))
97+
minutes = payload_dictionary["minutes"]
98+
seconds = payload_dictionary["seconds"]
99+
if not (
100+
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)
102+
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))
110+
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()
117+
118+
def subscribe_to_dojo(self):
119+
client = mqtt.Client()
120+
client.on_connect = self.on_connect
121+
client.on_message = self.on_message
122+
client.connect(self.dojo_broker, self.dojo_port, 60)
123+
client.loop_forever()

Infrastructure/MobberManager.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ def mobber_count(self):
1313
return self.mobber_list.__len__()
1414

1515
def add_mobber(self, mobber_name):
16-
if str(mobber_name).strip() != "":
16+
clean_mobber_name = str(mobber_name).strip()
17+
if clean_mobber_name != "" and not self.mobber_list.__contains__(clean_mobber_name):
1718
self.mobber_list.append(mobber_name)
1819
self.fire_time_change_callbacks()
1920

@@ -84,3 +85,4 @@ def rewind_driver(self):
8485
self.driver_index = mobber_count - 1
8586
self.update_next_driver_index()
8687
self.fire_time_change_callbacks()
88+

Infrastructure/SettingsManager.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class SettingsManager(object):
77
TIMER_SETTINGS = "TIMER SETTINGS"
88
CONTINUE_SCREEN_BLOCKER_SETTINGS = "CONTINUE SCREEN BLOCKER SETTINGS"
99
SCREEN_BLOCKER_SETTINGS = "SCREEN BLOCKER SETTINGS"
10+
CODE_DOJO = "CODE DOJO"
1011

1112
def __init__(self):
1213
self.config = configparser.ConfigParser()
@@ -16,6 +17,7 @@ def __init__(self):
1617
self.screen_blocker_settings = self.config[SettingsManager.SCREEN_BLOCKER_SETTINGS]
1718
self.general_settings_ = self.config[SettingsManager.GENERAL_SETTINGS]
1819
self.timer_settings_ = self.config[SettingsManager.TIMER_SETTINGS]
20+
self.code_dojo = self.config[SettingsManager.CODE_DOJO]
1921

2022
def get_transparent_window_screen_size_percent(self):
2123
return self.window_settings_.getfloat("size percentage", 0.3)
@@ -84,4 +86,22 @@ def get_timer_extension_count(self):
8486
return self.timer_settings_.getint("extension count", 2)
8587

8688
def get_general_enable_tips(self):
87-
return self.general_settings_.getboolean("enable tips", True)
89+
return self.general_settings_.getboolean("enable tips", True)
90+
91+
def get_dojo_enabled(self):
92+
return self.code_dojo.getboolean("enable dojo mode", False)
93+
94+
def get_dojo_broker(self):
95+
return self.code_dojo.get("broker", "iot.eclipse.org")
96+
97+
def get_dojo_port(self):
98+
return self.code_dojo.getint("port", 1883)
99+
100+
def get_dojo_mob_station_name(self):
101+
return self.code_dojo.get("mob station name", "NewName")
102+
103+
def get_dojo_session_id(self):
104+
return self.code_dojo.get("session id","1337")
105+
106+
def get_dojo_topic_root(self):
107+
return self.code_dojo.get("topic root", "MobTimer")

MobTimer.cfg

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,18 @@ use logo image = False
2323
logo image name = company-logo.png
2424
auto theme logo = False
2525

26-
2726
[TIMER SETTINGS]
2827
minutes = 5
2928
seconds = 0
3029
extension enabled = False
3130
extension minutes = 0
3231
extension seconds = 30
33-
extension count = 1
32+
extension count = 1
33+
34+
[CODE DOJO]
35+
enable dojo mode = True
36+
broker = iot.eclipse.org
37+
port = 1883
38+
mob station name = NewName
39+
session id = 1337
40+
topic root = MobTimer

MobTimer.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,9 @@
22

33
root = MobTimerController()
44
root.mainloop()
5+
6+
7+
8+
9+
10+

0 commit comments

Comments
 (0)