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:
parent
bb06b22eca
commit
baa6a42b2c
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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");
|
||||||
|
@ -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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user