wxCTB on mac

BlitzMax Forums/Brucey's Modules/wxCTB on mac

Nigel Brown(Posted 2011) [#1]
I have some serial port code that runs without error on PC, but crashes on MAC when there is data available?

SuperStrict

Framework	wx.wxApp

Import	wx.wxFrame
Import	wx.wxCTB
Import	wx.wxTimer
	
Import	BRL.retro


'---------------------------------------------------------------------
Type MyApp Extends wxApp
'---------------------------------------------------------------------

	Const WINDOW_WIDTH:Int = 442
	Const WINDOW_HEIGHT:Int= 384

	Field	frame:MyFrame

	Method OnInit:Int()

		'
		frame = MyFrame(New MyFrame.CreateMyFrame(Self,Null,wxID_ANY,AppTitle,0,0,WINDOW_WIDTH,WINDOW_HEIGHT))
		frame.Centre()
		
		SetTopWindow(frame)
		
		frame.show()

		Return True
	
	End Method

End Type


New MyApp.run()

'---------------------------------------------------------------------
Type MyFrame Extends wxFrame 'MyFrame3Base
'---------------------------------------------------------------------
	'
	Const baudrate:Int	= wxBAUD_2400
	Const TIMEOUT:Int		= 5
	Const TIMER_FREQ:Int	= 200
	
	Field m_timer:wxTimer
	Field dev:wxSerialPort
	Field devname:String
	Field token:String
	
	Field buffer:TBank

	'---------------------------------------------------------------------
	Method CreateMyFrame:MyFrame( _my_app:MyApp, _parent:wxFrame, _id:Int, _s_title:String, _x:Int,_y:Int,_w:Int,_h:Int )
	'---------------------------------------------------------------------

		Return myFrame(Super.Create(_parent,_id,_s_title,_x,_y,_w,_h,wxCAPTION|wxCLOSE_BOX|wxMINIMIZE_BOX|wxSYSTEM_MENU)) 'wxRESIZE_BORDER)

	End Method

	'
	'---------------------------------------------------------------------
	Method OnInit()
	'---------------------------------------------------------------------
		'
		token:String = ""
		buffer:TBank = CreateBank(1024)

		'
		dev:wxSerialPort = New wxSerialPort.Create()
		Global DCS:wxSerialPort_DCS = New wxSerialPort_DCS.Create()
		DCS.SetBaud(baudrate)
		DebugLog "DCS.GetSettings = " + DCS.GetSettings()
		' Try To open the given port
?win32
		devname = "COM1:"
?MacOS
		devname = wxChooseSerialPort()
?
		
		If dev.Open(devname, DCS ) < 0
			'
			wxMessageBox("Cannot open " + devname )
			dev.free()
		Else
			m_timer = New wxTimer.Create(Self)
			m_timer.Start(TIMER_FREQ)

		EndIf

		' Connect frame events.
		ConnectAny( wxEVT_CLOSE_WINDOW, OnCloseWindow )
		Connect(wxID_ANY, wxEVT_TIMER, OnTimer)

	End Method

	'
	'---------------------------------------------------------------------
	Function OnTimer(event:wxEvent)
	'---------------------------------------------------------------------
		myFrame(event.parent)._OnTimer(wxCommandEvent(Event))
	End Function
	'---------------------------------------------------------------------
	Method _OnTimer(event:wxCommandEvent)
	'---------------------------------------------------------------------
		Local bytesRead:Int		
		Local char:Byte Ptr = LockBank(buffer)

		Select dev.ReadUntilEOS( char, bytesRead, "~n", TIMEOUT, True )
			Case 0
				DebugLog "timeout " + bytesRead
				If bytesRead > 0
					token :+ String.FromBytes( char, bytesRead )
				EndIf
			Case 1
				token :+ String.FromBytes( char, bytesRead )
				DebugLog "sucess token = " + token + " : " + bytesRead
				token = ""
			Case -1
				DebugLog "otherwise"				

		End Select

		UnlockBank(buffer)

	EndMethod

	'---------------------------------------------------------------------
	Method	OnCloseDown()
	'---------------------------------------------------------------------
		DebugLog "::OnCloseDown"
		
		dev.Close()
		dev.free()
	
	End Method

	'---------------------------------------------------------------------
	Function OnCloseWindow(event:wxEvent)
	'---------------------------------------------------------------------
		'
		DebugLog "::OnCloseWindow"

		myFrame(event.parent).OnCloseDown()

		event.Skip()

	End Function

	'---------------------------------------------------------------------
	Function OnQuit(event:wxEvent)
	'---------------------------------------------------------------------
		'
		DebugLog "::OnQuit"
		
		myFrame(event.parent).Close(True)

	End Function

End Type


Last edited 2011

Last edited 2011


Nigel Brown(Posted 2011) [#2]
latest: If I pass a null instead of "~n" it does not crash?

Last edited 2011


Nigel Brown(Posted 2011) [#3]
it fails on the mac every time it finds the eol string? if a timeout value is set to -1 then it never fails but becomes a blocking call to serial port!

Last edited 2011