fixing some bugs found during tests for demo

This commit is contained in:
langolierz
2018-05-06 03:00:46 +00:00
parent d8b4808b23
commit ad04d5171a
8 changed files with 51 additions and 142 deletions

View File

@@ -37,6 +37,7 @@ class Actions(object):
def clear_all_slots(self):
self.data.clear_all_slots()
self.display.browser_menu.generate_browser_list()
def _load_this_slot_into_next_player(self, slot):
if self.data.update_next_slot_number(slot):
@@ -118,10 +119,13 @@ class Actions(object):
self.data.function_on = not self.data.function_on
def next_bank(self):
self.data.update_bank_number_by_amount(1)
print('current bank is {} , the number of banks is {} '.format(self.data.bank_number, len(self.data.bank_data)))
def previous_bank(self):
self.data.update_bank_number_by_amount(-1)
print('current bank is {} , the number of banks is {} '.format(self.data.bank_number, len(self.data.bank_data)))
def increase_speed(self):
new_rate = self.video_driver.current_player.change_rate(0.5)
@@ -176,12 +180,15 @@ class Actions(object):
self.capture.start_recording()
def toggle_screen_mirror(self):
if self.data.update_screen:
self.data.update_screen = False
subprocess.call(['sudo', 'systemctl', 'start', 'raspi2fb@1'])
if self.data.settings['other']['DEV_MODE_RESET']['value'] == 'off':
if self.data.update_screen:
self.data.update_screen = False
subprocess.call(['sudo', 'systemctl', 'start', 'raspi2fb@1'])
else:
self.data.update_screen = True
subprocess.call(['sudo', 'systemctl', 'stop', 'raspi2fb@1'])
else:
self.data.update_screen = True
subprocess.call(['sudo', 'systemctl', 'stop', 'raspi2fb@1'])
self.message_handler.set_message('INFO', 'cant mirror in dev mode')
def toggle_player_mode(self):
if self.data.player_mode == 'now':
@@ -206,6 +213,9 @@ class Actions(object):
output_range = max_param - min_param
return int(( cc_value / 127 ) * output_range + min_param)
def get_midi_status(self):
self.message_handler.set_message('INFO', 'midi status is {}'.format(self.data.midi_status))
def update_video_settings(self, setting_value):
self.video_driver.update_video_settings()
@@ -226,6 +236,11 @@ class Actions(object):
self.data.update_setting_value('video', 'OUTPUT', 'composite')
else:
self.data.update_setting_value('video', 'OUTPUT', 'hdmi')
#### this is to work around a bug where 1080 videos on hdmi drop out ...
subprocess.call(['tvservice --sdtvon="PAL 4:3"'],shell=True)
self._refresh_frame_buffer()
subprocess.call(['tvservice', '-p'])
self._refresh_frame_buffer()
def check_dev_mode(self):
#### check if in dev mode:(ie not using the lcd screen)
@@ -259,11 +274,11 @@ class Actions(object):
if mode == 'PAL' and progressive == 'p':
sdtv_mode = '18'
elif mode == 'PAL' and progressive == '':
sdtv_mode = '2'
sdtv_mode = '02'
elif mode == 'NTSC' and progressive == 'p':
sdtv_mode = '16'
elif mode == 'NTSC' and progressive == '':
sdtv_mode = '0'
sdtv_mode = '00'
if aspect == '4:3':
sdtv_aspect = '1'

View File

@@ -23,7 +23,7 @@ class Data(object):
def __init__(self, message_handler):
self.message_handler = message_handler
self.EMPTY_BANK = [self.EMPTY_SLOT for i in range(10)]
#self.EMPTY_BANK = [self.EMPTY_SLOT for i in range(10)]
self.PATHS_TO_BROWSER = [self.PATH_TO_EXTERNAL_DEVICES, '/home/pi/Videos' ]
### state data
@@ -37,7 +37,7 @@ class Data(object):
self.player_mode = 'now'
### persisted data (use default if doesnt exits):
self.bank_data = [self.EMPTY_BANK]
self.bank_data = [self.create_empty_bank()]
if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.BANK_DATA_JSON):
self.bank_data = self._read_json(self.BANK_DATA_JSON)
@@ -52,6 +52,10 @@ class Data(object):
self.key_mappings = self._read_json(self.KEYPAD_MAPPING_JSON)
self.midi_mappings = self._read_json(self.MIDI_MAPPING_JSON)
@staticmethod
def create_empty_bank():
empty_slot = dict(name='', location='', length=-1, start=-1, end=-1, rate=1)
return [empty_slot for i in range(10)]
def _read_json(self, file_name):
with open(self.PATH_TO_DATA_OBJECTS + file_name) as data_file:
@@ -86,14 +90,15 @@ class Data(object):
self._update_a_slots_data(slot_number, new_slot)
def clear_all_slots(self):
self.bank_data[self.bank_number] = self.EMPTY_BANK
self.bank_data[self.bank_number] = self.create_empty_bank()
self._update_json(self.BANK_DATA_JSON, self.bank_data)
def update_bank_number_by_amount(self, amount):
if(self.bank_data[-1] != self.EMPTY_BANK):
self.bank_data.append(self.EMPTY_BANK)
empty_bank = self.create_empty_bank()
if(self.bank_data[-1] != empty_bank):
self.bank_data.append(empty_bank)
elif(len(self.bank_data) > 1):
if self.bank_data[-2] == self.EMPTY_BANK:
if self.bank_data[-2] == empty_bank:
self.bank_data.pop()
self._update_json(self.BANK_DATA_JSON, self.bank_data)
self.bank_number = (self.bank_number+amount)%(len(self.bank_data))

View File

@@ -1,4 +0,0 @@
class FixedLengthSet(object):

View File

@@ -1,3 +1,3 @@
#!/bin/bash
sudo sed -i "s/sdtv_mode=./sdtv_mode=$1/g" /boot/config.txt
sudo sed -i "s/sdtv_mode=../sdtv_mode=$1/g" /boot/config.txt
sudo sed -i "s/sdtv_aspect=./sdtv_aspect=$2/g" /boot/config.txt

View File

@@ -44,16 +44,16 @@
"DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"]
},
"m": {
"DEFAULT": ["load_slot_3_into_next_player","decrease_speed"]
"DEFAULT": ["load_slot_3_into_next_player"]
},
"n": {
"DEFAULT": ["load_slot_4_into_next_player","increase_speed"]
"DEFAULT": ["load_slot_4_into_next_player"]
},
"o": {
"DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"]
},
"p": {
"DEFAULT": ["load_slot_6_into_next_player", "print_speed"]
"DEFAULT": ["load_slot_6_into_next_player"]
},
"q": {
"DEFAULT": ["load_slot_7_into_next_player"]

View File

@@ -11,20 +11,23 @@
"note_on 72": {
"NAV_BROWSER": ["move_browser_selection_up"],
"PLAYER": ["seek_back_on_player"],
"NAV_SETTINGS": ["move_settings_selection_up"]
"NAV_SETTINGS": ["move_settings_selection_up"],
"LENGTH_SET": ["return_to_default_control_mode"]
},
"note_on 73": {
"NAV_BROWSER": ["move_browser_selection_down"],
"PLAYER": ["seek_forward_on_player"],
"NAV_SETTINGS": ["move_settings_selection_down"]
"NAV_SETTINGS": ["move_settings_selection_down"],
"LENGTH_SET": ["return_to_default_control_mode"]
},
"note_on 74": {
"NAV_BROWSER": ["enter_on_browser_selection"],
"PLAYER": ["toggle_action_on_player"],
"NAV_SETTINGS": ["enter_on_settings_selection"]
"PLAYER": ["toggle_action_on_player","toggle_show_on_player"],
"NAV_SETTINGS": ["enter_on_settings_selection"],
"LENGTH_SET": ["record_fixed_length"]
},
"note_on 75": {
"DEFAULT": ["switch_to_next_player"]
"DEFAULT": ["switch_to_next_player", "toggle_player_mode"]
},
"note_on 76": {
"DEFAULT": ["set_playing_sample_start_to_current_duration", "clear_playing_sample_start_time"]
@@ -32,7 +35,8 @@
"note_on 77": {
"DEFAULT": ["set_playing_sample_end_to_current_duration", "clear_playing_sample_end_time"]
},
"note_on 78": {},
"note_on 78": {
"DEFAULT": ["toggle_capture_preview", "toggle_capture_recording"]},
"note_on 79": {
"DEFAULT": ["cycle_display_mode"]
},
@@ -49,13 +53,13 @@
"DEFAULT": ["load_slot_2_into_next_player","clear_all_slots"]
},
"note_on 84": {
"DEFAULT": ["load_slot_3_into_next_player","decrease_speed"]
"DEFAULT": ["load_slot_3_into_next_player"]
},
"note_on 85": {
"DEFAULT": ["load_slot_4_into_next_player","increase_speed"]
"DEFAULT": ["load_slot_4_into_next_player"]
},
"note_on 86": {
"DEFAULT": ["load_slot_5_into_next_player","print_speed"]
"DEFAULT": ["load_slot_5_into_next_player","toggle_screen_mirror"]
},
"note_on 87": {
"DEFAULT": ["load_slot_6_into_next_player"]

View File

@@ -16,6 +16,7 @@ class MidiInput(object):
def try_open_port(self):
midi_setting = self.data.settings['midi']['INPUT']['value']
print('try open port : midi setting is {}'.format(midi_setting))
if midi_setting == 'enabled':
midi_ports = mido.get_input_names()
midi_device_on_port_20 = [s for s in midi_ports if '20:0' in s]
@@ -57,7 +58,6 @@ class MidiInput(object):
self.on_midi_message(message_dict)
if i > 0:
print('the number processed {}'.format(i))
self.root.after(self.midi_delay, self.poll_midi_input)
def on_midi_message(self, message_dict):

View File

@@ -1,111 +0,0 @@
import string
import datetimimport mido
class MidiInput(object):
def __init__(self, root, message_handler, display, actions, data):
self.root = root
self.message_handler = message_handler
self.display = display
self.actions = actions
self.data = data
self.midi_mappings = data.midi_mappings
self.midi_device = None
self.midi_delay = 1
self.try_open_port()
def try_open_port(self):
midi_setting = self.data.settings['midi']['INPUT']['value']
if midi_setting == 'enabled':
midi_ports = mido.get_input_names()
midi_device_on_port_20 = [s for s in midi_ports if '20:0' in s]
if midi_device_on_port_20:
if self.data.midi_status == 'disconnected':
self.midi_device = mido.open_input(midi_device_on_port_20[0])
self.data.midi_status = 'connected'
self.message_handler.set_message('INFO', 'connected to midi device {}'.format(self.midi_device.name))
self.poll_midi_input()
elif self.data.midi_status == 'connected':
self.data.midi_status = 'disconnected'
self.root.after(1000, self.try_open_port)
def poll_midi_input(self):
i = 0
cc_dict = dict()
for message in self.midi_device.iter_pending():
i = i + 1
message_dict = message.dict()
## only listening to midi channel 1 for now , will make it seletcable later
if not message_dict['channel'] == 0:
pass
## turning off noisey clock messages for now - may want to use them at some point
elif message_dict['type'] == 'clock':
pass
## trying to only let through step cc messages to increase response time
elif message_dict['type'] == 'control_change':
control_number = message_dict['control']
if not control_number in cc_dict.keys():
cc_dict[control_number] = message_dict['value']
else:
step_size = 4
ignore_range = range(cc_dict[control_number] - step_size,cc_dict[control_number] + step_size)
if not message_dict['value'] in ignore_range:
cc_dict[control_number] = message_dict['value']
self.on_midi_message(message_dict)
print(cc_dict)
else:
self.on_midi_message(message_dict)
if i > 0:
print('the number processed {}'.format(i))
self.root.after(self.midi_delay, self.poll_midi_input)
def on_midi_message(self, message_dict):
if message_dict['type'] == 'note_on' and message_dict['velocity'] == 0:
message_dict['type'] = 'note_off'
mapped_message_name = message_dict['type']
mapped_message_value = None
if 'note' in message_dict:
mapped_message_name = '{} {}'.format(mapped_message_name,message_dict['note'])
if 'control' in message_dict:
mapped_message_name = '{} {}'.format(mapped_message_name,message_dict['control'])
mapped_message_value = message_dict['value']
if mapped_message_name in self.midi_mappings.keys():
self.run_action_for_mapped_message(mapped_message_name, mapped_message_value)
else:
print('{} is not in midi map'.format(mapped_message_name))
def run_action_for_mapped_message(self, message_name, mapped_message_value):
this_mapping = self.midi_mappings[message_name]
if self.data.control_mode in this_mapping:
mode = self.data.control_mode
elif 'DEFAULT' in this_mapping:
mode = 'DEFAULT'
if self.data.function_on and len(this_mapping[mode]) > 1:
method_name = this_mapping[mode][1]
self.data.function_on = False
else:
method_name = this_mapping[mode][0]
print('the action being called is {}'.format(method_name))
self.call_method_name(method_name, mapped_message_value)
self.display.refresh_display()
def call_method_name(self, method_name, argument=None):
if argument is not None:
# try:
getattr(self.actions, method_name)(argument)
#except TypeError as e:
# print(e)
# self.message_handler.set_message('INFO', 'bad midi cc mapping')
else:
getattr(self.actions, method_name)()