' (c) 2007 Speed-IT-up (Display3000), Peter Küsters
$hwstack = 128
$swstack = 128
$framesize = 128
$regfile = "m128def.dat"
$crystal = 16000000
$baud1 = 57600
Config Serialin1 = Buffered , Size = 40 , Bytematch = 13
Config Serialout1 = Buffered , Size = 40
Echo Off
Declare Sub Writeserinp
Declare Sub Checkserinp
Declare Sub Parser
Const Mymainchannel = 2
Const Sw_down = 50
Dim Buffer As String * 15
Dim Bufferarray(15) As Byte At Buffer Overlay
Dim Serinpstr As String * 63
Dim Serinpbuffer As String * 63
Dim Serinbuffarr(5) As Byte At Serinpbuffer Overlay
Dim Cr_received As Byte
Dim Strsize As Byte
Dim Mainchannel As Byte
Dim Subchannel As Word
Dim Wert As Single
Dim Frage As Byte
Dim Zeichenpos As Byte
Dim Strpuff As String * 20
Dim Status_old As String * 20
Dim Temp_level_oben As Byte
Dim Temp_level_unten As Byte
Dim Farbe As Word
Dim Voltage As Single
Dim Speed_l As Integer
Dim Speed_r As Integer
Dim Speed As Integer
Dim Speed_hold As Integer
Dim Strspeed As String * 20
'Now we need to select Port B as to an output port (data output to the display)
Ddrb = &B1111111 'DDR = Data direction register; All 8 ports switched to output (1)
$include Init21_display3000.bas
Open "COM2:" For Binary As #1
Orientation = Landscape
Graphics_mode = 256high_compressed
Gosub Lcd_cls
Restore Logo
Call Lcd_bitmap(0 , 0 , 175 , 131)
Enable Interrupts
Do
If Cr_received = 1 Then 'wenn was im ser. Buffer ist abholen
Cr_received = 0
Input #1 , , Serinpstr Noecho
Clear Serialin1
'zum Abtrennen eines oder mehrerer LF am Anfang des Strings, das noch vom Vorgänger-String im Buffer steht
While Asc(serinpstr) = 10
Strsize = Len(serinpstr) - 1
Serinpstr = Right(serinpstr , Strsize)
Wend
'Hier ist der String empfangen und ein event. LF entfernt
Call Checkserinp
End If
Loop
'---------------------------------------------------------------------------
' Serial1charmatch
' Im Eingangspuffer wurde ein "13" empfangen
' Dieser eine Takt Interrupt verzögert theoretisch die Regelung!?!
'---------------------------------------------------------------------------
Serial1charmatch:
Cr_received = 1
Return
'---------------------------------------------------------------------------
' Writeserinp
' Leitet den empfangenen String zum nächsten Modul weiter
'---------------------------------------------------------------------------
Sub Writeserinp
'Print #1 Serinpstr ' Befehl Weiterreichen
End Sub
'---------------------------------------------------------------------------
' Checkserinp
' Hier der String abgeholt
' Der Mainchannel und der : wird geprüft
'---------------------------------------------------------------------------
Sub Checkserinp
If Asc(serinpstr) = 35 Then 'Strings mit # gleich weiterleiten
'Call Writeserinp
Exit Sub
End If
If Asc(serinpstr) = 27 Then 'Strings mit ESC gleich weiterleiten
'Call Writeserinp
Exit Sub
End If
Zeichenpos = Instr(serinpstr , ":")
If Zeichenpos > 0 Then ' Doppelpunkt Gefunden
If Instr(serinpstr , "*") > 0 And Instr(serinpstr , "*") < Zeichenpos Then
'Call Writeserinp
Call Parser
Exit Sub
Else 'kein *
Serinpbuffer = Left(serinpstr , Zeichenpos)
Mainchannel = Val(serinpbuffer)
If Mainchannel = Mymainchannel Then
Call Parser
Exit Sub
Else
'Call Writeserinp
Exit Sub
End If
End If
Else 'kein :
If Mainchannel = Mymainchannel Then 'Mainchannel müsste noch von vorigem Durchlauf drinstehen
Call Parser
Exit Sub
Else 'anderes Modul
'Call Writeserinp
Exit Sub
End If
End If
End Sub
'---------------------------------------------------------------------------
' Parser
' Hier beginnt der Parser
'
'---------------------------------------------------------------------------
Sub Parser
Local I As Byte
'der ":" und alles davor kommt weg
Zeichenpos = Len(serinpstr) - 2 'Instr(serinpstr , Doppelpunkt)
Serinpbuffer = Right(serinpstr , Zeichenpos)
Zeichenpos = Instr(serinpbuffer , "=")
If Zeichenpos > 0 Then '= ist vorhanden
Frage = 0
Else
Frage = 1
End If
If Zeichenpos = 0 Then Zeichenpos = Len(serinpbuffer)
Buffer = Left(serinpbuffer , Zeichenpos)
Subchannel = Val(buffer)
If Frage = 0 Then
Frage = Len(serinpbuffer) - Zeichenpos
Buffer = Right(serinpbuffer , Frage)
Wert = Val(buffer)
End If
Select Case Subchannel
'Lenker
Case 3
Strpuff = Format(buffer , " +0")
Call Lcd_print(strpuff , 24 , 85 , 1 , 1 , 1 , Black , White)
'Power Motor links
Case 7
If Wert < 0 Then
Temp_level_oben = 0
Wert = Wert * -1
Temp_level_unten = Wert / 5
Else
Temp_level_unten = 0
Temp_level_oben = Wert / 5
End If
If Wert > 160 Then
Farbe = Red
Else
Farbe = Green
End If
If Temp_level_unten > 36 Then Temp_level_unten = 36
Temp_level_unten = 90 + Temp_level_unten
Call Lcd_box(100 , 90 , 105 , Temp_level_unten , Farbe)
Call Lcd_box(100 , Temp_level_unten , 105 , 126 , White)
If Temp_level_oben > 36 Then Temp_level_oben = 36
Temp_level_oben = 90 - Temp_level_oben
Call Lcd_box(100 , Temp_level_oben , 105 , 90 , Farbe)
Call Lcd_box(100 , 53 , 105 , Temp_level_oben , White)
'Power Motor rechts
Case 8
If Wert > 0 Then
Temp_level_unten = 0
Temp_level_oben = Wert / 5
Else
Temp_level_oben = 0
Wert = Wert * -1
Temp_level_unten = Wert / 5
End If
If Wert > 160 Then
Farbe = Red
Else
Farbe = Green
End If
If Temp_level_unten > 36 Then Temp_level_unten = 36
Temp_level_unten = 90 + Temp_level_unten
Call Lcd_box(70 , 90 , 75 , Temp_level_unten , Farbe)
Call Lcd_box(70 , Temp_level_unten , 75 , 126 , White)
If Temp_level_oben > 36 Then Temp_level_oben = 36
Temp_level_oben = 90 - Temp_level_oben
Call Lcd_box(70 , Temp_level_oben , 75 , 90 , Farbe)
Call Lcd_box(70 , 53 , 75 , Temp_level_oben , White)
Case 9 'Speed left
Speed_l = Wert
If Wert > 0 Then
Temp_level_unten = 0
Temp_level_oben = Wert / 5
Else
Temp_level_oben = 0
Wert = Wert * -1
Temp_level_unten = Wert / 5
End If
If Wert > 160 Then
Farbe = Red
Else
Farbe = Blue
End If
If Temp_level_unten > 36 Then Temp_level_unten = 36
Temp_level_unten = 90 + Temp_level_unten
Call Lcd_box(75 , 90 , 80 , Temp_level_unten , Farbe)
Call Lcd_box(75 , Temp_level_unten , 80 , 126 , White)
If Temp_level_oben > 36 Then Temp_level_oben = 36
Temp_level_oben = 90 - Temp_level_oben
Call Lcd_box(75 , Temp_level_oben , 80 , 90 , Farbe)
Call Lcd_box(75 , 53 , 80 , Temp_level_oben , White)
Case 10 'Speed right
Speed_r = Wert
If Wert < 0 Then
Temp_level_oben = 0
Wert = Wert * -1
Temp_level_unten = Wert / 5
Else
Temp_level_unten = 0
Temp_level_oben = Wert / 5
End If
If Wert > 160 Then
Farbe = Red
Else
Farbe = Blue
End If
If Temp_level_unten > 36 Then Temp_level_unten = 36
Temp_level_unten = 90 + Temp_level_unten
Call Lcd_box(95 , 90 , 100 , Temp_level_unten , Farbe)
Call Lcd_box(95 , Temp_level_unten , 100 , 126 , White)
If Temp_level_oben > 36 Then Temp_level_oben = 36
Temp_level_oben = 90 - Temp_level_oben
Call Lcd_box(95 , Temp_level_oben , 100 , 90 , Farbe)
Call Lcd_box(95 , 53 , 100 , Temp_level_oben , White)
Case 11
If Buffer <> Status_old Then
Status_old = Buffer
Call Lcd_print( " " , 10 , 25 , 1 , 1 , 1 , White , White)
Select Case Wert
Case 10
Call Lcd_print( "Störung! ADXL low" , 10 , 25 , 1 , 1 , 1 , Red , White)
Case 11
Call Lcd_print( "Störung! ADXL high" , 10 , 25 , 1 , 1 , 1 , Red , White)
Case 12
Call Lcd_print( "Störung! Gyro low" , 10 , 25 , 1 , 1 , 1 , Red , White)
Case 13
Call Lcd_print( "Störung! Gyro high" , 10 , 25 , 1 , 1 , 1 , Red , White)
Case 14
Call Lcd_print( "Störung! Fußschalter" , 10 , 25 , 1 , 1 , 1 , Red , White)
Case Else
If Buffer = "Standby" Then Speed_hold = 0
Call Lcd_print(buffer , 10 , 25 , 1 , 1 , 1 , Black , White)
End Select
End If
'Battery
Case 12
Voltage = Val(buffer)
Voltage = Voltage * 0.0328
Select Case Voltage
Case 0 To 24
Farbe = Red
Case 24 To 25
Farbe = Orange
Case 25 To 29
Farbe = Green
Case Else
Farbe = Black
End Select
Buffer = Str(voltage)
Buffer = Left(buffer , 4)
Strpuff = Format(buffer , " 0") + "V"
Call Lcd_print(strpuff , 24 , 52 , 1 , 1 , 1 , Farbe , White)
'Speed wird hier gezeichnet, da die Zeit bei den Speedbalken zu knapp wird.
Speed = Speed_l + Speed_r
Speed = Speed / 2
If Speed < 1 And Speed > -1 Then Speed = 0
Strspeed = Str(speed)
Strspeed = Format(strspeed , " +0.0")
Strspeed = Left(strspeed , 6)
If Speed > Speed_hold Then
Speed_hold = Speed
Call Lcd_print(strspeed , 135 , 58 , 1 , 1 , 1 , Black , White)
End If
Strspeed = Strspeed + " km/h"
Call Lcd_print(strspeed , 50 , 38 , 1 , 1 , 1 , Black , White)
Case Else
End Select
Enable Interrupts
End Sub
End
$inc Logo , Nosize , "lcd.bin"
$inc Colortable , Nosize , "color.bin"
$include Glcd21_display3000.bas
$include Glcd21_fonts.bas