1
0
mirror of synced 2024-11-14 19:57:36 +01:00
Arduino-Aime-Reader/Arduino-Aime-Reader.ino

179 lines
4.2 KiB
Arduino
Raw Normal View History

#include "cmd.h"
#if defined(__AVR_ATmega32U4__) || defined(ARDUINO_SAMD_ZERO)
#pragma message "当前的开发板是 ATmega32U4 或 SAMD_ZERO"
#define SerialDevice SerialUSB
2022-03-06 13:29:21 +01:00
#define LED_PIN A3
#elif defined(ARDUINO_ESP8266_NODEMCU_ESP12E)
#pragma message "当前的开发板是 NODEMCU_ESP12E"
#define SerialDevice Serial
2022-03-06 13:29:21 +01:00
#define LED_PIN D5
//#define SwitchBaudPIN D4 //修改波特率按钮
2022-03-06 13:29:21 +01:00
#elif defined(ARDUINO_NodeMCU_32S)
#pragma message "当前的开发板是 NodeMCU_32S"
#define SerialDevice Serial
#define LED_PIN 13
#else
#error "未经测试的开发板,请检查串口和阵脚定义"
#endif
bool high_baudrate = true;//high_baudrate=true
2021-03-15 15:48:12 +01:00
void setup() {
2022-03-06 13:29:21 +01:00
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
2021-08-15 13:56:27 +02:00
FastLED.setBrightness(50);
FastLED.showColor(0);
2021-03-15 15:48:12 +01:00
nfc.begin();
2021-08-15 13:56:27 +02:00
while (!nfc.getFirmwareVersion()) {
FastLED.showColor(0xFF0000);
2021-08-15 13:56:27 +02:00
delay(500);
FastLED.showColor(0);
2021-08-15 13:56:27 +02:00
delay(500);
}
2021-04-24 14:44:05 +02:00
nfc.setPassiveActivationRetries(0x10);//设定等待次数
2021-03-15 15:48:12 +01:00
nfc.SAMConfig();
memset(&req, 0, sizeof(req.bytes));
memset(&res, 0, sizeof(res.bytes));
SerialDevice.begin(high_baudrate ? 115200 : 38400);
FastLED.showColor(high_baudrate ? 0x0000FF : 0x00FF00);
#ifdef SwitchBaudPIN
#pragma message "已启用波特率切换功能"
pinMode(SwitchBaudPIN, INPUT_PULLUP);
#endif
2021-03-15 15:48:12 +01:00
}
void loop() {
SerialCheck();
packet_write();
#ifdef SwitchBaudPIN
if (!digitalRead(SwitchBaudPIN)) {
high_baudrate = !high_baudrate;
SerialDevice.flush();
SerialDevice.begin(high_baudrate ? 115200 : 38400);
FastLED.showColor(high_baudrate ? 0x0000FF : 0x00FF00);
delay(2000);
}
#endif
2021-03-15 15:48:12 +01:00
}
static uint8_t len, r, checksum;
static bool escape = false;
2021-03-15 15:48:12 +01:00
static uint8_t packet_read() {
while (SerialDevice.available()) {
r = SerialDevice.read();
2021-03-15 15:48:12 +01:00
if (r == 0xE0) {
req.frame_len = 0xFF;
continue;
}
if (req.frame_len == 0xFF) {
req.frame_len = r;
2021-12-07 12:41:50 +01:00
len = 0;
2021-03-15 15:48:12 +01:00
checksum = r;
continue;
}
if (r == 0xD0) {
escape = true;
continue;
}
if (escape) {
r++;
escape = false;
}
2021-12-07 12:41:50 +01:00
req.bytes[++len] = r;
2021-03-15 15:48:12 +01:00
if (len == req.frame_len && checksum == r) {
return req.cmd;
}
checksum += r;
}
return 0;
}
static void packet_write() {
uint8_t checksum = 0, len = 0;
if (res.cmd == 0) {
2021-03-15 15:48:12 +01:00
return;
}
SerialDevice.write(0xE0);
while (len <= res.frame_len) {
uint8_t w;
if (len == res.frame_len) {
w = checksum;
} else {
w = res.bytes[len];
checksum += w;
}
2021-03-15 15:48:12 +01:00
if (w == 0xE0 || w == 0xD0) {
SerialDevice.write(0xD0);
SerialDevice.write(--w);
2021-03-15 15:48:12 +01:00
} else {
SerialDevice.write(w);
2021-03-15 15:48:12 +01:00
}
len++;
2021-03-15 15:48:12 +01:00
}
res.cmd = 0;
}
2021-10-09 19:16:03 +02:00
void SerialCheck() {
switch (packet_read()) {
case SG_NFC_CMD_RESET:
sg_nfc_cmd_reset();
break;
case SG_NFC_CMD_GET_FW_VERSION:
sg_nfc_cmd_get_fw_version();
break;
case SG_NFC_CMD_GET_HW_VERSION:
sg_nfc_cmd_get_hw_version();
break;
case SG_NFC_CMD_POLL:
sg_nfc_cmd_poll();
break;
case SG_NFC_CMD_MIFARE_READ_BLOCK:
sg_nfc_cmd_mifare_read_block();
break;
case SG_NFC_CMD_FELICA_ENCAP:
sg_nfc_cmd_felica_encap();
break;
case SG_NFC_CMD_AIME_AUTHENTICATE:
sg_nfc_cmd_aime_authenticate();
break;
case SG_NFC_CMD_BANA_AUTHENTICATE:
sg_nfc_cmd_bana_authenticate();
2021-10-09 19:16:03 +02:00
break;
case SG_NFC_CMD_MIFARE_SELECT_TAG:
sg_nfc_cmd_mifare_select_tag();
break;
case SG_NFC_CMD_MIFARE_SET_KEY_AIME:
2022-03-01 14:04:48 +01:00
sg_nfc_cmd_mifare_set_key_aime();
2021-10-09 19:16:03 +02:00
break;
case SG_NFC_CMD_MIFARE_SET_KEY_BANA:
sg_nfc_cmd_mifare_set_key_bana();
2021-10-09 19:16:03 +02:00
break;
case SG_NFC_CMD_RADIO_ON:
sg_nfc_cmd_radio_on();
break;
case SG_NFC_CMD_RADIO_OFF:
sg_nfc_cmd_radio_off();
break;
case SG_RGB_CMD_RESET:
sg_led_cmd_reset();
break;
case SG_RGB_CMD_GET_INFO:
sg_led_cmd_get_info();
break;
case SG_RGB_CMD_SET_COLOR:
sg_led_cmd_set_color();
break;
case 0:
break;
default:
sg_res_init();
}
}