mirror of
https://github.com/tjboldt/Apple2-IO-RPi.git
synced 2024-11-24 00:30:50 +00:00
* Add backoff to reduce CPU usage * Update driver version for CPU fix
This commit is contained in:
parent
0dbb55fda1
commit
8d5aa26b78
@ -160,11 +160,18 @@ func (a2 A2Gpio) ReadByte() (byte, error) {
|
|||||||
|
|
||||||
// wait for the Apple II to write
|
// wait for the Apple II to write
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
|
lastSleepTime := time.Now()
|
||||||
|
sleepDuration := 10
|
||||||
for inWrite.Read() == 1 {
|
for inWrite.Read() == 1 {
|
||||||
if time.Since(startTime) > edgeTimeout {
|
if time.Since(startTime) > edgeTimeout {
|
||||||
outRead.High()
|
outRead.High()
|
||||||
return 0, errors.New("timed out reading byte -- write stuck high")
|
return 0, errors.New("timed out reading byte -- write stuck high")
|
||||||
}
|
}
|
||||||
|
if time.Since(lastSleepTime) > edgeTimeout/10 {
|
||||||
|
sleepDuration *= 3;
|
||||||
|
time.Sleep(time.Millisecond * time.Duration(sleepDuration));
|
||||||
|
lastSleepTime = time.Now()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// get a nibble of data
|
// get a nibble of data
|
||||||
@ -211,10 +218,17 @@ func (a2 A2Gpio) ReadByte() (byte, error) {
|
|||||||
// wait for the Apple II to finish writing
|
// wait for the Apple II to finish writing
|
||||||
//fmt.Printf("wait for the Apple II to finish writing\n")
|
//fmt.Printf("wait for the Apple II to finish writing\n")
|
||||||
startTime = time.Now()
|
startTime = time.Now()
|
||||||
|
lastSleepTime = time.Now()
|
||||||
|
sleepDuration = 10
|
||||||
for inWrite.Read() == 0 {
|
for inWrite.Read() == 0 {
|
||||||
if time.Since(startTime) > edgeTimeout {
|
if time.Since(startTime) > edgeTimeout {
|
||||||
return 0, errors.New("timed out reading byte -- write stuck low")
|
return 0, errors.New("timed out reading byte -- write stuck low")
|
||||||
}
|
}
|
||||||
|
if time.Since(lastSleepTime) > edgeTimeout/10 {
|
||||||
|
sleepDuration *= 3;
|
||||||
|
time.Sleep(time.Millisecond * time.Duration(sleepDuration));
|
||||||
|
lastSleepTime = time.Now()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return data, nil
|
return data, nil
|
||||||
@ -230,11 +244,18 @@ func (a2 A2Gpio) WriteByte(data byte) error {
|
|||||||
|
|
||||||
// wait for the Apple II to be ready to read
|
// wait for the Apple II to be ready to read
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
|
lastSleepTime := time.Now()
|
||||||
|
sleepDuration := 10
|
||||||
for inRead.Read() == 1 {
|
for inRead.Read() == 1 {
|
||||||
if time.Since(startTime) > edgeTimeout {
|
if time.Since(startTime) > edgeTimeout {
|
||||||
outWrite.High()
|
outWrite.High()
|
||||||
return errors.New("timed out writing byte -- read stuck high")
|
return errors.New("timed out writing byte -- read stuck high")
|
||||||
}
|
}
|
||||||
|
if time.Since(lastSleepTime) > edgeTimeout/10 {
|
||||||
|
sleepDuration *= 3;
|
||||||
|
time.Sleep(time.Millisecond * time.Duration(sleepDuration));
|
||||||
|
lastSleepTime = time.Now()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((data & 128) >> 7) == 1 {
|
if ((data & 128) >> 7) == 1 {
|
||||||
@ -291,11 +312,18 @@ func (a2 A2Gpio) WriteByte(data byte) error {
|
|||||||
// wait for the Apple II to finsih reading
|
// wait for the Apple II to finsih reading
|
||||||
//fmt.Printf("wait for the Apple II to finsih reading\n")
|
//fmt.Printf("wait for the Apple II to finsih reading\n")
|
||||||
startTime = time.Now()
|
startTime = time.Now()
|
||||||
|
lastSleepTime = time.Now()
|
||||||
|
sleepDuration = 10
|
||||||
for inRead.Read() == 0 {
|
for inRead.Read() == 0 {
|
||||||
if time.Since(startTime) > edgeTimeout {
|
if time.Since(startTime) > edgeTimeout {
|
||||||
outWrite.High()
|
outWrite.High()
|
||||||
return errors.New("timed out writing byte -- read stuck low")
|
return errors.New("timed out writing byte -- read stuck low")
|
||||||
}
|
}
|
||||||
|
if time.Since(lastSleepTime) > edgeTimeout/10 {
|
||||||
|
sleepDuration *= 3;
|
||||||
|
time.Sleep(time.Millisecond * time.Duration(sleepDuration));
|
||||||
|
lastSleepTime = time.Now()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// let the Apple II know we are done writing
|
// let the Apple II know we are done writing
|
||||||
|
@ -49,15 +49,12 @@ func main() {
|
|||||||
handlers.SetCommunication(comm)
|
handlers.SetCommunication(comm)
|
||||||
comm.Init()
|
comm.Init()
|
||||||
|
|
||||||
lastCommandTime := time.Now()
|
|
||||||
|
|
||||||
// In case Apple II is waiting, send 0 byte to start
|
// In case Apple II is waiting, send 0 byte to start
|
||||||
comm.WriteByte(0)
|
comm.WriteByte(0)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
command, err := comm.ReadByte()
|
command, err := comm.ReadByte()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
lastCommandTime = time.Now()
|
|
||||||
switch command {
|
switch command {
|
||||||
case resetCommand:
|
case resetCommand:
|
||||||
handlers.ResetCommand()
|
handlers.ResetCommand()
|
||||||
@ -77,7 +74,7 @@ func main() {
|
|||||||
handlers.ShellCommand()
|
handlers.ShellCommand()
|
||||||
}
|
}
|
||||||
// temporary workaround for busy wait loop heating up the RPi
|
// temporary workaround for busy wait loop heating up the RPi
|
||||||
} else if time.Since(lastCommandTime) > time.Millisecond*100 {
|
} else {
|
||||||
time.Sleep(time.Millisecond * 100)
|
time.Sleep(time.Millisecond * 100)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,4 +8,4 @@ package info
|
|||||||
|
|
||||||
// Version is the hexadecimal version number that
|
// Version is the hexadecimal version number that
|
||||||
// should be incremented with each driver update
|
// should be incremented with each driver update
|
||||||
const Version = "0029"
|
const Version = "002A"
|
||||||
|
Loading…
Reference in New Issue
Block a user