#include "klavirko-ui.h"
#include "aix.h"
+#include "main.h"
#include "debug.h"
#include "wave.h"
#include "gui.h"
else
{
aix_buffer[aix_buffer_w] = data;
+ // if (data == '\n')
+ data_waiting |= DATA_FLAG_AIX;
// advance the pointer
ADVANCE_BP(aix_buffer_w, N_AIX_BUFFER);
}
while (NOT_EMPTY_BP(aix_buffer_w, aix_buffer_r, N_AIX_BUFFER)) // data waiting in buffer
{
+ data_waiting &= (~DATA_FLAG_AIX);
// get data; advance pointer
data = aix_buffer[aix_buffer_r];
ADVANCE_BP(aix_buffer_r, N_AIX_BUFFER);
void debug_aix (const uint8_t blocking); // print AIX state
extern uint16_t aix_data[N_AIX_DATA];
-
-extern volatile uint8_t aix_buffer_r;
-extern volatile uint8_t aix_buffer_w;
#include <string.h>
#include "klavirko-ui.h"
#include "ctrl.h"
+#include "main.h"
#include "wave.h"
#include "debug.h"
#include "gui.h"
uint8_t ctrl_txbuffer_w = 0;
volatile uint8_t ctrl_error = 0;
- uint8_t ctrl_state = CTRL_WAIT;
+volatile uint8_t ctrl_state = CTRL_WAIT;
uint8_t ctrl_retry = 0;
volatile uint16_t ctrl_timeout = 0;
++ctrl_timeout;
}
+inline void int_ctrl_tx(void) // CTRL got free to send
+{
+ if (ctrl_state == CTRL_SEND) // still something to send
+ data_waiting |= DATA_FLAG_CTRL_OUT;
+ else
+ data_waiting &= ~(DATA_FLAG_CTRL_OUT);
+}
+
inline void int_ctrl_rx(void) // received byte from CTRL
{
uint8_t data;
ctrl_error |= ERR_OVERFLOW;
else
{
+ // if (data=='\n')
+ data_waiting |= DATA_FLAG_CTRL_IN;
ctrl_rxbuffer[ctrl_rxbuffer_w] = data;
ADVANCE_BP(ctrl_rxbuffer_w, N_CTRL_RXBUFFER);
}
CTRL_TX__SS = 1;
CTRL_RX__SS = 1;
+ CTRL_TX__MK = 0;
CTRL_RX__MK = 0;
CTRL_RX__MKE = 0;
}
ctrl_txbuffer[ctrl_txbuffer_w] = io;
ADVANCE_BP(ctrl_txbuffer_w, N_CTRL_TXBUFFER);
}
+ data_waiting &= ~(DATA_FLAG_CTRL_OUT);
if (NOT_EMPTY_BP(ctrl_txbuffer_w, ctrl_txbuffer_r, N_CTRL_TXBUFFER)) // data in output buffer
{
while (NOT_EMPTY_BP(ctrl_rxbuffer_w, ctrl_rxbuffer_r, N_CTRL_RXBUFFER)) // data in input buffer
{
+ data_waiting &= ~(DATA_FLAG_CTRL_IN);
// get the byte, advance the pointer
io = ctrl_rxbuffer[ctrl_rxbuffer_r];
ADVANCE_BP(ctrl_rxbuffer_r, N_CTRL_RXBUFFER);
/* COMMUNICATING WITH MAIN CONTROLLER */
/*
-Copyright 2021 Balthasar Szczepański
+Copyright 2021, 2025 Balthasar Szczepański
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
extern uint8_t midi_pedal_en;
inline void ctrl_watchdog (void) LOWTEXT;
+inline void int_ctrl_tx (void) LOWTEXT_INT; // CTRL got free to send
inline void int_ctrl_rx (void) LOWTEXT_INT; // received byte from CTR
inline void int_ctrl_err (void) LOWTEXT_INT; // received error from CTR
inline void setup_ctrl (void);
if (draw_wave_active)
{
- lcd_setup_drawing(LCD_GRAY, draw_x, HALFSCREEN_PIXELS-1, 0, 9);
+ // lcd_setup_drawing(LCD_GRAY, draw_x, HALFSCREEN_PIXELS-1, 0, 9);
+ if (draw_x == 0)
+ lcd_setup_drawing(LCD_GRAY, 0, HALFSCREEN_PIXELS-1, 0, 9);
while (draw_wave_active)
{
x = convert_wave((int8_t)draw_wave_data[draw_x]);
return;
}
// interrupt drawing to handle AIX communication
- if (NOT_EMPTY_BP(aix_buffer_w, aix_buffer_r, N_AIX_DATA))
+ if (data_waiting)
return;
}
draw_x = 0;
else if (draw_adsr_active)
{
- lcd_setup_drawing(LCD_GRAY, HALFSCREEN_PIXELS+draw_x, FULLSCREEN_PIXELS-1, 0, 9);
+ // lcd_setup_drawing(LCD_GRAY, HALFSCREEN_PIXELS+draw_x, FULLSCREEN_PIXELS-1, 0, 9);
+ if (draw_x == 0)
+ lcd_setup_drawing(LCD_GRAY, HALFSCREEN_PIXELS, FULLSCREEN_PIXELS-1, 0, 9);
while (draw_adsr_active)
{
x = draw_adsr_data[draw_x];
return;
}
// interrupt drawing to handle communication
- if (NOT_EMPTY_BP(aix_buffer_w, aix_buffer_r, N_AIX_DATA))
+ if (data_waiting)
return;
}
draw_x = 0;
};
volatile uint32_t main_timer = 0;
+volatile uint8_t data_waiting = 0;
inline void int_main_timer (void)
{
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#define DATA_FLAG_AIX 0b0001
+#define DATA_FLAG_CTRL_IN 0b0100
+#define DATA_FLAG_CTRL_OUT 0b1000
+
#include <stdint.h>
#include "klavirko-ui.h"
extern const uint8_t REVERSE_BITS[256]; // reverse order of bits in a byte
extern volatile uint32_t main_timer; // milliseconds since start
+extern volatile uint8_t data_waiting ; // data flags
/*
-Copyright 2021 Balthasar Szczepański
+Copyright 2021, 2025 Balthasar Szczepański
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
FALLBACK_INT, // INT_CSI00/INT_IIC00/INT_ST0 (0x1E)
int_aix_rx,///////INT_CSI01/INT_IIC01/INT_SR0 (0x20)
int_aix_err,//////INT_SRE0/INT_TM01H (0x22)
- FALLBACK_INT, // INT_ST1 (0x24)
+ int_ctrl_tx,//////INT_ST1 (0x24)
int_ctrl_rx,//////INT_CSI11/INT_IIC11/INT_SR1 (0x26)
int_ctrl_err,/////INT_SRE1/INT_TM03H (0x28)
FALLBACK_INT, // INT_IICA0 (0x2A)