Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions CrossMgrVideo/CamServer.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,15 @@ def get( usbSuccess, camInfo ):
# Read the frame. If anything fails, keep going in the loop so we can reset with another camInfo.
if not cap.isOpened():
ret, frame = False, None
time.sleep( 0.5 ) # Keep going so we can get a camInfo to try again.
time.sleep( 2.0 ) # Keep going so we can get a camInfo to try again.
keepCapturing = False
else:
try:
ret, frame = cap.read()
if not ret: # Camera is probably disconnected, clean up and try again.
cap.release()
CVUtil.resetCache()
keepCapturing = False
except Exception as e: # Potential out of memory error?
ret, frame = False, None
except KeyboardInterrupt:
Expand Down Expand Up @@ -271,9 +276,14 @@ def get( usbSuccess, camInfo ):
# Send fps message.
fpsFrameCount += bool( frame is not None )
if (ts - fpsStart).total_seconds() >= 3.0:
qOut.put( {'cmd':'fps', 'fps_actual':fpsFrameCount / (ts - fpsStart).total_seconds()} )
fps = fpsFrameCount / (ts - fpsStart).total_seconds()
qOut.put( {'cmd':'fps', 'fps_actual':fps} )
fpsStart = ts
fpsFrameCount = 0
# Adjust status image freqency to account for framerate, aiming for 6 updates per second
freq = int((fps+0.5)/6)
if freq > 0:
sendUpdates['primary'] = freq

# Remove stale intervals from list.
if intervals:
Expand Down
64 changes: 51 additions & 13 deletions CrossMgrVideo/ComputeSpeed.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@
_ = lambda x: x

class WheelEdgesPage(adv.WizardPageSimple):
#sizes from https://www.bikecalc.com/wheel_size_math
sizes = ['622-50', '622-40', '622-28', '622-25', '571-28', '584-28', '559-50', '559-40', '559-28', '507-28', '406-40', '406-28', '349-28']
diameters = [ 0.722, 0.702, 0.678, 0.672, 0.627, 0.640, 0.659, 0.639, 0.615, 0.563, 0.486, 0.462, 0.405 ]
defaultWheelSize = 2 #622-28

def __init__(self, parent):
super().__init__(parent)

Expand All @@ -23,19 +28,33 @@ def __init__(self, parent):
self.sbvl.Bind( wx.EVT_KEY_DOWN, self.onKeyDown )

footerSizer = wx.BoxSizer( wx.HORIZONTAL )

vbsSettings = wx.BoxSizer( wx.VERTICAL )
hbs = wx.BoxSizer( wx.HORIZONTAL )
self.timestamp = wx.StaticText(self, label='00:00:00.000')
self.timestamp.SetFont( wx.Font( (0,24), wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL ) )
footerSizer.Add( self.timestamp, flag=wx.LEFT, border=2)

hbs.Add( self.timestamp, flag=wx.LEFT, border=2)
self.frameLeft = wx.Button( self, style=wx.BU_EXACTFIT, label='\u25C0' )
self.frameLeft.Bind( wx.EVT_BUTTON, lambda e: self.changeFrame(-1) )
self.frameRight = wx.Button( self, style=wx.BU_EXACTFIT, label='\u25B6' )
self.frameRight.Bind( wx.EVT_BUTTON, lambda e: self.changeFrame(1) )

footerSizer.Add( self.frameLeft, flag=wx.LEFT, border=2)
footerSizer.Add( self.frameRight, flag=wx.LEFT, border=0)
footerSizer.Add( wx.StaticText(self, label='or Mousewheel'), flag=wx.LEFT|wx.TOP, border=2 )
hbs.Add( self.frameLeft, flag=wx.LEFT, border=2)
hbs.Add( self.frameRight, flag=wx.LEFT, border=0)
hbs.Add( wx.StaticText(self, label='or Mousewheel'), flag=wx.LEFT|wx.TOP, border=2 )
vbsSettings.Add( hbs, flag=wx.LEFT, border=2)

hbs = wx.BoxSizer( wx.HORIZONTAL )
self.wheelSelector = wx.ComboBox( self, style=wx.TE_PROCESS_ENTER, choices=WheelEdgesPage.sizes )
self.wheelSelector.SetSelection(WheelEdgesPage.defaultWheelSize)
self.wheelSelector.Bind( wx.EVT_COMBOBOX, self.onselectWheel )
self.wheelSelector.Bind( wx.EVT_TEXT_ENTER, self.onEnterWheel )
hbs.Add( wx.StaticText(self, label = _('Select wheel size or enter diameter (mm):')), flag=wx.TOP|wx.LEFT|wx.RIGHT, border = border )
hbs.Add( self.wheelSelector, flag=wx.LEFT, border=2)

vbsSettings.Add( hbs, flag=wx.LEFT, border=2)


footerSizer.Add( vbsSettings, flag=wx.LEFT, border=4 )

vbsFooter = wx.BoxSizer( wx.VERTICAL )
vbsFooter.Add( wx.StaticText(self, label = _('1. Drag the Green Square so the line is on the Leading Edge of the Front Wheel.')),
Expand Down Expand Up @@ -76,6 +95,16 @@ def setExplain( self ):
)
self.GetSizer().Layout()

def onselectWheel( self, event ):
self.wheelDiameter = WheelEdgesPage.diameters[self.wheelSelector.GetSelection()]
self.setExplain()
pass

def onEnterWheel( self, event ):
mm = float(self.wheelSelector.GetValue())
self.wheelDiameter = mm/1000
self.setExplain()

@property
def t( self ):
return self.tsJpg[self.iPhoto1][0] if self.iPhoto1 is not None else None
Expand All @@ -84,15 +113,20 @@ def t( self ):
def bitmap( self ):
return CVUtil.jpegToBitmap(self.tsJpg[self.iPhoto1][1]) if self.iPhoto1 is not None else None

def Set( self, tsJpg, iPhoto1, iPhoto2, wheelDiameter ):
def Set( self, tsJpg, iPhoto1, iPhoto2, wheelDiameter=None ):
self.tsJpg, self.iPhoto1, self.iPhoto2 = tsJpg, iPhoto1, iPhoto2
self.wheelDiameter = wheelDiameter
if wheelDiameter:
self.wheelSelector.SetValue('{:3.0f}'.format(wheelDiameter*1000))
self.wheelDiameter = wheelDiameter
else:
self.wheelDiameter = WheelEdgesPage.diameters[self.wheelSelector.GetSelection()]
self.sbvl.SetBitmap( self.bitmap )
self.setExplain()

def getWheelEdges( self ):
return self.sbvl.GetVerticalLines()


class FrontWheelEdgePage(adv.WizardPageSimple):
def __init__(self, parent, getSpeed):
super().__init__(parent)
Expand Down Expand Up @@ -122,17 +156,18 @@ def onVerticalLines( self, event=None ):
self.speed.SetLabel( self.formatSpeed(kmh, mps, mph) )
self.GetSizer().Layout()

def Set( self, t, bitmap, wheelDiameter ):
def Set( self, t, bitmap ):
self.t = t
self.wheelDiameter = wheelDiameter
self.sbvl.SetBitmap( bitmap )
self.onVerticalLines()

def setWheelDiameter( self, wheelDiameter ):
self.wheelDiameter = wheelDiameter

def getFrontWheelEdge( self ):
return self.sbvl.GetVerticalLines()[0]

class ComputeSpeed:
wheelDiameter = 0.678

def __init__( self, parent, size=wx.DefaultSize ):
self.wizard = adv.Wizard( parent, wx.ID_ANY, _('Compute Speed') )
Expand All @@ -148,6 +183,7 @@ def __init__( self, parent, size=wx.DefaultSize ):

self.wizard.SetPageSize( size )
self.wizard.GetPageAreaSizer().Add( self.wheelEdgesPage )
self.wizard.GetPageAreaSizer().Add( self.frontWheelEdgePage )
self.wizard.FitToPage( self.wheelEdgesPage )

def getSpeed( self ):
Expand Down Expand Up @@ -184,8 +220,8 @@ def bitmap2( self ):

def Show( self, tsJpg, iPhoto1, iPhoto2, ts_start ):
self.tsJpg, self.iPhoto1, self.iPhoto2, self.ts_start = tsJpg, iPhoto1, iPhoto2, ts_start
self.wheelEdgesPage.Set( self.tsJpg, self.iPhoto1, self.iPhoto2, self.wheelDiameter )
self.frontWheelEdgePage.Set( self.t2, self.bitmap2, self.wheelDiameter )
self.wheelEdgesPage.Set( self.tsJpg, self.iPhoto1, self.iPhoto2 )
self.frontWheelEdgePage.Set( self.t2, self.bitmap2 )

if self.wizard.RunWizard(self.wheelEdgesPage):
return self.getSpeed()
Expand All @@ -197,7 +233,9 @@ def onPageChanging( self, evt ):
if isForward:
page = evt.GetPage()
if page == self.wheelEdgesPage:
self.wheelDiameter = self.wheelEdgesPage.wheelDiameter
self.frontWheelEdgePage.sbvl.verticalLines = [self.wheelEdgesPage.sbvl.verticalLines[1]]
self.frontWheelEdgePage.setWheelDiameter(self.wheelDiameter)

def onPageChanged( self, evt ):
isForward = evt.GetDirection()
Expand Down
Binary file added CrossMgrVideo/CrossMgrVideoImages/pause.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added CrossMgrVideo/CrossMgrVideoImages/record.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading