def start(self, quality, bitrate, duration): """ Start recording a video of quality and duration """ # organize params for raspivid command filename = '%s/%s_%smbps_%s.h264' % (self._working_directory, quality, bitrate, datetime.now().strftime('%Y.%m.%d_%H%M')) params = {'filename': filename, 't': int(duration * 1000), 'b': int(bitrate * 10**6)} params.update(self._quality_map[quality]) raspivid_command = 'raspivid --hflip --vflip --vstab --width %(w)s --height %(h)s --framerate 25 --bitrate %(b)s --timeout %(t)s --output %(filename)s' % params self._pid = self._run_and_get_pid(raspivid_command) print 'pid is', self._pid self._active = True self.started_at = time.time() # memorize recording options self.filename = filename self.quality = quality self.bitrate = bitrate # don't interrupt raspivid, it will finish itself # we're just interested when recording is finished self._timer_id = Watchdog.set_timeout(duration + 1, self.stop) print 'recorder started'
def redraw_menu(btn): # boooooo global state global menu_timer_id if state != 'menu': show_menu() # timers Watchdog.clear_timeout(menu_timer_id) menu_timer_id = Watchdog.set_timeout(MENU_TIMEOUT, hide_menu) stop_select_propagation = False # first, allow to go up if it's possible and requested if btn == 'up': if menu['level']: menu['level'].pop() # second, go down to the selected item item, prev_item = menu, menu for level in menu['level']: prev_item = item item = item['items'][level] # third, allow to go even lower, if it's possible and requested if btn in ['down', 'select']: if 'items' in item['items'][item['selected']]: menu['level'].append(item['selected']) prev_item = item item = item['items'][item['selected']] stop_select_propagation = True # allow to go through items of this level if btn in ['left', 'right']: if 'left' == btn: delta = -1 if 'right' == btn: delta = +1 item['selected'] = (item['selected'] + delta) % len(item['items']) # prepare item meta to be printed to screen prev_name = '' name = item['items'][item['selected']]['name'] description = item['items'][item['selected']].get('description', '') if not description: if item != prev_item: prev_name = '%s%s' % (lcd.CHAR_ARROW_UP, prev_item['items'][prev_item['selected']]['name']) position = '%s%d/%d%s' % (lcd.CHAR_ARROW_LEFT, item['selected'] + 1, len(item['items']), lcd.CHAR_ARROW_RIGHT) lcd.home() lcd.clear() line1 = '%-16s' % (name, ) line2 = '%-11s%5s' % (description or prev_name, position) lcd.message('%s\n%s' % (line1, line2)) # finally process SELECT if btn == 'select' and not stop_select_propagation: selected_item = item['items'][item['selected']] if 'call' in selected_item: func, args = selected_item['call'], selected_item['args'] func(*args)