1
0
mirror of https://github.com/whowechina/aic_pico.git synced 2024-11-24 22:00:10 +01:00

Sega AIME IO working

This commit is contained in:
whowechina 2023-11-05 21:23:28 +08:00
parent bb06b22eca
commit baa6a42b2c
4 changed files with 41 additions and 34 deletions

View File

@ -13,6 +13,7 @@
#include "hardware/i2c.h" #include "hardware/i2c.h"
#include "pn532.h" #include "pn532.h"
#include "aime.h"
#define FRAME_TIMEOUT 200000 #define FRAME_TIMEOUT 200000
@ -80,6 +81,12 @@ static struct {
const uint8_t syscode[2]; const uint8_t syscode[2];
} virtual_aic = { true, false, "", "\x00\xf1\x00\x00\x00\x01\x43\x00", "\x88\xb4" }; } virtual_aic = { true, false, "", "\x00\xf1\x00\x00\x00\x01\x43\x00", "\x88\xb4" };
static void putc_trap(uint8_t byte)
{
}
static aime_putc_func aime_putc = putc_trap;
void aime_set_baudrate(int mode) void aime_set_baudrate(int mode)
{ {
baudrate_mode = (mode == 0) ? 0 : 1; baudrate_mode = (mode == 0) ? 0 : 1;
@ -90,11 +97,9 @@ void aime_set_virtual_aic(bool enable)
virtual_aic.enabled = enable; virtual_aic.enabled = enable;
} }
static int aime_interface = -1; void aime_init(aime_putc_func putc_func)
void aime_init(int interface)
{ {
aime_interface = interface; aime_putc = putc_func;
pn532_config_sam(); pn532_config_sam();
} }
@ -158,23 +163,21 @@ static void build_response(int payload_len)
static void send_response() static void send_response()
{ {
uint8_t checksum = 0; uint8_t checksum = 0;
uint8_t sync = 0xe0; uint8_t sync = 0xe0;
tud_cdc_n_write(aime_interface, &sync, 1); aime_putc(sync);
for (int i = 0; i < response.len; i++) { for (int i = 0; i < response.len; i++) {
uint8_t c = response.raw[i]; uint8_t c = response.raw[i];
checksum += c; checksum += c;
if (c == 0xe0 || c == 0xd0) { if (c == 0xe0 || c == 0xd0) {
uint8_t escape = 0xd0; uint8_t escape = 0xd0;
tud_cdc_n_write(aime_interface, &escape, 1); aime_putc(escape);
c--; c--;
} }
tud_cdc_n_write(aime_interface, &c, 1); aime_putc(c);
} }
tud_cdc_n_write(aime_interface, &checksum, 1); aime_putc(checksum);
tud_cdc_n_write_flush(aime_interface);
} }
static void send_simple_response(uint8_t status) static void send_simple_response(uint8_t status)
@ -643,7 +646,7 @@ static void aime_handle_frame()
} }
} }
static bool aime_feed(int c) bool aime_feed(int c)
{ {
if (c == 0xe0) { if (c == 0xe0) {
req_ctx.active = true; req_ctx.active = true;
@ -683,21 +686,6 @@ static bool aime_feed(int c)
return true; return true;
} }
void aime_update()
{
if (req_ctx.active && time_us_64() - req_ctx.time > FRAME_TIMEOUT) {
req_ctx.active = false;
}
if (tud_cdc_n_available(aime_interface)) {
uint8_t buf[32];
uint32_t count = tud_cdc_n_read(aime_interface, buf, sizeof(buf));
for (int i = 0; i < count; i++) {
aime_feed(buf[i]);
}
}
}
uint32_t aime_led_color() uint32_t aime_led_color()
{ {
return led_color; return led_color;

View File

@ -6,8 +6,12 @@
#ifndef AIME_H #ifndef AIME_H
#define AIME_H #define AIME_H
void aime_init(int interface); /* return true if accepts a byte, false if rejects */
void aime_update(); typedef void (*aime_putc_func)(uint8_t byte);
void aime_init(aime_putc_func putc_func);
bool aime_feed(int c);
uint32_t aime_led_color(); uint32_t aime_led_color();
// mode 0 or 1 // mode 0 or 1

View File

@ -111,13 +111,28 @@ void detect_card()
memset(cardio.current, 0, 9); memset(cardio.current, 0, 9);
} }
const int aime_intf = 1;
static void cdc_aime_putc(uint8_t byte)
{
tud_cdc_n_write(aime_intf, &byte, 1);
tud_cdc_n_write_flush(aime_intf);
}
static void aime_run()
{
if (tud_cdc_n_available(aime_intf)) {
uint8_t buf[32];
int count = tud_cdc_n_read(aime_intf, buf, sizeof(buf));
for (int i = 0; i < count; i++) {
aime_feed(buf[i]);
}
}
}
void wait_loop() void wait_loop()
{ {
tud_task(); tud_task();
cli_run(); cli_run();
aime_update();
cli_fps_count(0); cli_fps_count(0);
} }
@ -127,7 +142,7 @@ static void core0_loop()
tud_task(); tud_task();
cli_run(); cli_run();
aime_update(); aime_run();
save_loop(); save_loop();
cli_fps_count(0); cli_fps_count(0);
@ -154,7 +169,7 @@ void init()
pn532_init(I2C_PORT, I2C_SCL, I2C_SDA, I2C_FREQ); pn532_init(I2C_PORT, I2C_SCL, I2C_SDA, I2C_FREQ);
pn532_set_wait_loop(wait_loop); pn532_set_wait_loop(wait_loop);
aime_init(1); aime_init(cdc_aime_putc);
cli_init("aic_pico>", "\n << AIC Pico >>\n" cli_init("aic_pico>", "\n << AIC Pico >>\n"
" https://github.com/whowechina\n\n"); " https://github.com/whowechina\n\n");

View File

@ -111,7 +111,7 @@ static void generate_color_wheel()
old_level = aic_cfg->led.level; old_level = aic_cfg->led.level;
for (int i = 0; i < COLOR_WHEEL_SIZE; i++) { for (int i = 0; i < COLOR_WHEEL_SIZE; i++) {
color_wheel[i] = rgb32_from_hsv(i, 250, 255); color_wheel[i] = rgb32_from_hsv(i, 208, 255);
color_wheel[i] = apply_level(color_wheel[i]); color_wheel[i] = apply_level(color_wheel[i]);
} }
} }