Replace fifo with queue implementation.

This commit is contained in:
Russell Gallop
2011-08-11 16:31:07 +01:00
parent 5f0a15d4dc
commit ded512dc4b

View File

@@ -1,9 +1,10 @@
#include <xs1.h> #include <xs1.h>
#include <xclib.h> #include <xclib.h>
#include <print.h>
#include "usb_midi.h" #include "usb_midi.h"
#include "midiinparse.h" #include "midiinparse.h"
#include "midioutparse.h" #include "midioutparse.h"
#include <print.h> #include "queue.h"
//#define MIDI_LOOPBACK 1 //#define MIDI_LOOPBACK 1
@@ -78,22 +79,23 @@ void usb_midi(in port ?p_midi_in, out port ?p_midi_out,
struct midi_in_parse_state mips; struct midi_in_parse_state mips;
// the symbol fifo (to go out of uart) // the symbol fifo (to go out of uart)
queue q;
unsigned symbol_fifo[USB_MIDI_DEVICE_OUT_FIFO_SIZE]; unsigned symbol_fifo[USB_MIDI_DEVICE_OUT_FIFO_SIZE];
int rdptr = 0;
int wrptr = 0;
unsigned rxPT, txPT; unsigned rxPT, txPT;
int midi_from_host_overflow = 0; int midi_from_host_overflow = 0;
//configure_clock_rate(clk_midi, 100, 1); //configure_clock_rate(clk_midi, 100, 1);
init_queue(q, symbol_fifo, USB_MIDI_DEVICE_OUT_FIFO_SIZE);
configure_out_port_no_ready(p_midi_out, clk_midi, 1);
configure_in_port(p_midi_in, clk_midi);
configure_out_port_no_ready(p_midi_out, clk_midi, 1); start_clock(clk_midi);
configure_in_port(p_midi_in, clk_midi); start_port(p_midi_out);
start_port(p_midi_in);
start_clock(clk_midi);
start_port(p_midi_out); reset_midi_state(mips);
start_port(p_midi_in);
reset_midi_state(mips);
t :> time; t :> time;
t2 :> rxT; t2 :> rxT;
@@ -186,20 +188,12 @@ void usb_midi(in port ?p_midi_in, out port ?p_midi_out,
uout_count++; uout_count++;
outputted_symbol = outputting_symbol; outputted_symbol = outputting_symbol;
// have we got another symbol to send to uart? // have we got another symbol to send to uart?
if (rdptr != wrptr) { // FIFO not empty if (!isempty(q)) { // FIFO not empty
int space_left;
// Take from FIFO // Take from FIFO
outputting_symbol = symbol_fifo[rdptr]; outputting_symbol = dequeue(q);
symbol = makeSymbol(symbol_fifo[rdptr]); symbol = makeSymbol(outputting_symbol);
rdptr++;
if (rdptr > USB_MIDI_DEVICE_OUT_FIFO_SIZE - 1)
rdptr = 0;
space_left = rdptr - wrptr; if (space(q) > 3 && midi_from_host_overflow) {
if (space_left < 0)
space_left += USB_MIDI_DEVICE_OUT_FIFO_SIZE;
if (space_left > 3 && midi_from_host_overflow) {
midi_from_host_overflow = 0; midi_from_host_overflow = 0;
midi_send_ack(c_midi); midi_send_ack(c_midi);
} }
@@ -242,7 +236,6 @@ void usb_midi(in port ?p_midi_in, out port ?p_midi_out,
int event; int event;
unsigned midi[3]; unsigned midi[3];
unsigned size; unsigned size;
int space_left;
// received data from host // received data from host
event = byterev(datum); event = byterev(datum);
mr_count++; mr_count++;
@@ -266,32 +259,21 @@ void usb_midi(in port ?p_midi_in, out port ?p_midi_out,
{midi[0], midi[1], midi[2], size} = midi_out_parse(event); {midi[0], midi[1], midi[2], size} = midi_out_parse(event);
for (int i = 0; i != size; i++) { for (int i = 0; i != size; i++) {
// add symbol to fifo // add symbol to fifo
symbol_fifo[wrptr] = midi[i]; enqueue(q, midi[i]);
wrptr++;
if (wrptr > USB_MIDI_DEVICE_OUT_FIFO_SIZE - 1) {
wrptr = 0;
}
} }
space_left = rdptr - wrptr; if (space(q) > 3) {
if (space_left < 0)
space_left += USB_MIDI_DEVICE_OUT_FIFO_SIZE;
if (space_left > 3) {
midi_send_ack(c_midi); midi_send_ack(c_midi);
} else { } else {
midi_from_host_overflow = 1; midi_from_host_overflow = 1;
} }
// Start sending from FIFO // Start sending from FIFO
if (wrptr != rdptr && !outputting) { if (!isempty(q) && !outputting) {
outputting_symbol = symbol_fifo[rdptr]; outputting_symbol = dequeue(q);
symbol = makeSymbol(symbol_fifo[rdptr]); symbol = makeSymbol(outputting_symbol);
rdptr++;
if (rdptr > USB_MIDI_DEVICE_OUT_FIFO_SIZE - 1)
rdptr = 0;
if (space_left > 2 && midi_from_host_overflow) { if (space(q) > 2 && midi_from_host_overflow) {
midi_from_host_overflow = 0; midi_from_host_overflow = 0;
midi_send_ack(c_midi); midi_send_ack(c_midi);
} }