Skip to content

Commit

Permalink
tests/driver_mfrc522: add test for mfrc522 driver
Browse files Browse the repository at this point in the history
  • Loading branch information
HendrikVE committed Jan 20, 2022
1 parent f599994 commit 05a6622
Show file tree
Hide file tree
Showing 4 changed files with 338 additions and 0 deletions.
9 changes: 9 additions & 0 deletions tests/driver_mfrc522/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
include ../Makefile.tests_common

USEMODULE += mfrc522

USEMODULE += ztimer
USEMODULE += ztimer_msec
USEMODULE += shell

include $(RIOTBASE)/Makefile.include
8 changes: 8 additions & 0 deletions tests/driver_mfrc522/Makefile.ci
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
BOARD_INSUFFICIENT_MEMORY := \
arduino-duemilanove \
arduino-leonardo \
arduino-nano \
arduino-uno \
atmega328p \
atmega32u4 \
#
20 changes: 20 additions & 0 deletions tests/driver_mfrc522/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# MFRC522 RFID Card Reader

## Overview

This test application demonstrates the usage of the MFRC522 driver interface
and can be used to test a MFRC522 RFID card reader with shell commands.

## Usage

The following shell commands are available:
* **reset** Reset the device.
* **antenna_on** Turn the antenna on.
* **antenna_off** Turn the antenna off.
* **set_antenna_gain** Set antenna gain.
* **get_antenna_gain** Get antenna gain.
* **firmware_version** Print the firmware version.
* **picc_dump** Dumps debug info about a scanned PICC.
* **scan_uid** Scan repeatedly until a PICC's UID is scanned.
* **set_uid** Set the UID of a scanned PICC.
* **self_test** Run the self test.
301 changes: 301 additions & 0 deletions tests/driver_mfrc522/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,301 @@
/*
* Copyright (C) 2021 Freie Universität Berlin
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/

/**
* @ingroup tests
* @brief Test application for the MFRC522 controller
* @author Hendrik van Essen <hendrik.ve@fu-berlin.de>
* @file
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "ztimer.h"
#include "shell.h"

#include "mfrc522.h"
#include "mfrc522_params.h"

static mfrc522_t mfrc522_dev;

/* Stores scanned ID read from RFID Module */
static uint8_t read_card[4];

int get_uid(mfrc522_uid_t *uid, bool stop_read)
{
int rc = 0;

/* Getting ready for Reading PICCs
* If a new PICC placed to RFID reader continue
*/
if ( ! (rc = mfrc522_picc_is_new_card_present(&mfrc522_dev))) {
puts("No card detected ...");
return 0;
}

puts("Card detected. Read card serial ...");

/* Since a PICC placed get Serial and continue */
mfrc522_status_code_t status = mfrc522_picc_read_card_serial(&mfrc522_dev, uid);
if (status != MFRC522_STATUS_OK) {
return 0;
}

printf("Scanned PICC's UID: ");
for ( uint8_t i = 0; i < uid->size; i++) {
read_card[i] = uid->uid_byte[i];
printf("%x", read_card[i]);
}
printf("\n");

/* Stop reading */
if (stop_read) {
mfrc522_picc_halt_a(&mfrc522_dev);
}

return 1;
}

int scan_uid(int argc, char **argv)
{
(void) argc;
(void) argv;

mfrc522_uid_t uid;
uint8_t success_read;

int i = 0;
do {
if (i >= 1) {
printf("Repeat scan (%d/20) ...\n", i + 1);
}
success_read = get_uid(&uid, true);
ztimer_sleep(ZTIMER_MSEC, 500);
i++;
} while (!success_read && i < 20);

return 0;
}

int self_test(int argc, char **argv)
{
(void) argc;
(void) argv;

bool success = mfrc522_pcd_perform_self_test(&mfrc522_dev);

success ? printf("SUCCESS\n") : printf("FAILED\n");

/* After self-test the device is unusable => repeat the initialization routine */
int rc = 0;
if ((rc = mfrc522_pcd_init(&mfrc522_dev, &mfrc522_params[0])) != 0) {
printf("Initialization failed! rc = %d", rc);
return 1;
}

return 0;
}

int reset(int argc, char **argv)
{
(void) argc;
(void) argv;

mfrc522_pcd_reset(&mfrc522_dev);

return 0;
}

int antenna_on(int argc, char **argv)
{
(void) argc;
(void) argv;

mfrc522_pcd_antenna_on(&mfrc522_dev);

return 0;
}

int antenna_off(int argc, char **argv)
{
(void) argc;
(void) argv;

mfrc522_pcd_antenna_off(&mfrc522_dev);

return 0;
}

int set_antenna_gain(int argc, char **argv)
{
(void) argc;
(void) argv;

if (argc != 2) {
puts("usage: set_antenna_gain <gain (0-5)>");
puts(" 0: 18db, 1: 23db, 2: 33db, 3: 38db, 4: 43db, 5: 48db");
return 1;
}
else {
uint8_t input = atoi(argv[1]);
mfrc522_pcd_rx_gain_t gain;

switch (input) {
case 0:
gain = MFRC522_RXGAIN_18_DB;
break;
case 1:
gain = MFRC522_RXGAIN_23_DB;
break;
case 2:
gain = MFRC522_RXGAIN_33_DB;
break;
case 3:
gain = MFRC522_RXGAIN_38_DB;
break;
case 4:
gain = MFRC522_RXGAIN_43_DB;
break;
case 5:
gain = MFRC522_RXGAIN_48_DB;
break;
default:
puts("gain needs to be one of [0-5]");
puts("0: 18db, 1: 23db, 2: 33db, 3: 38db, 4: 43db, 5: 48db");
return 1;
}

mfrc522_pcd_set_antenna_gain(&mfrc522_dev, gain);
}

return 0;
}

int get_antenna_gain(int argc, char **argv)
{
(void) argc;
(void) argv;

mfrc522_pcd_rx_gain_t gain = mfrc522_pcd_get_antenna_gain(&mfrc522_dev);

switch (gain) {
case MFRC522_RXGAIN_18_DB:
/* fall-through */
case MFRC522_RXGAIN_18_DB_2:
printf("gain = MFRC522_RXGAIN_18_DB\n");
break;
case MFRC522_RXGAIN_23_DB:
/* fall-through */
case MFRC522_RXGAIN_23_DB_2:
printf("gain = MFRC522_RXGAIN_23_DB\n");
break;
case MFRC522_RXGAIN_33_DB:
printf("gain = MFRC522_RXGAIN_33_DB\n");
break;
case MFRC522_RXGAIN_38_DB:
printf("gain = MFRC522_RXGAIN_38_DB\n");
break;
case MFRC522_RXGAIN_43_DB:
printf("gain = MFRC522_RXGAIN_43_DB\n");
break;
case MFRC522_RXGAIN_48_DB:
printf("gain = MFRC522_RXGAIN_48_DB\n");
break;
default:
printf("gain = UNKNOWN\n");
break;
}

return 0;
}

int firmware_version(int argc, char **argv)
{
(void) argc;
(void) argv;

mfrc522_pcd_dump_version_to_serial(&mfrc522_dev);

return 0;
}

int picc_dump(int argc, char **argv)
{
(void) argc;
(void) argv;

mfrc522_uid_t uid;
if (get_uid(&uid, false) != 1) {
return 1;
}

mfrc522_picc_dump_to_serial(&mfrc522_dev, &uid);

return 0;
}

int set_uid(int argc, char **argv)
{
(void) argc;
(void) argv;

if (argc != 5) {
puts("usage: set_uid <byte1> <byte2> <byte3> <byte4>");
puts(" <byte> as hex value (e.g. 0xA9 or A9)");
return 1;
}
else {
mfrc522_uid_t uid;
if (get_uid(&uid, false) != 1) {
return 1;
}

uint8_t byte_1 = (uint8_t) strtol(argv[1], NULL, 16);
uint8_t byte_2 = (uint8_t) strtol(argv[2], NULL, 16);
uint8_t byte_3 = (uint8_t) strtol(argv[3], NULL, 16);
uint8_t byte_4 = (uint8_t) strtol(argv[4], NULL, 16);

uint8_t uid_buf[4] = { byte_1, byte_2, byte_3, byte_4 };

mfrc522_status_code_t status = mfrc522_mifare_set_uid(&mfrc522_dev, &uid, uid_buf, 4);
printf("status = %s\n", mfrc522_get_status_code_string(status));
}

return 0;
}

static const shell_command_t shell_commands[] = {
{ "reset", "Reset the device.", reset },
{ "antenna_on", "Turn the antenna on.", antenna_on },
{ "antenna_off", "Turn the antenna off.", antenna_off },
{ "set_antenna_gain", "Set antenna gain.", set_antenna_gain },
{ "get_antenna_gain", "Get antenna gain.", get_antenna_gain },
{ "firmware_version", "Print the firmware version.", firmware_version },
{ "picc_dump", "Dumps debug info about a scanned PICC.", picc_dump },
{ "scan_uid", "Scan repeatedly until a PICC's UID is scanned.", scan_uid },
{ "set_uid", "Set the UID of a scanned PICC.", set_uid },
{ "self_test", "Run the self test.", self_test },
{ NULL, NULL, NULL }
};

int main(void)
{
int rc = 0;
if ((rc = mfrc522_pcd_init(&mfrc522_dev, &mfrc522_params[0])) != 0) {
printf("Initialization failed! rc = %d", rc);
return 1;
}

char line_buf[SHELL_DEFAULT_BUFSIZE];
shell_run(shell_commands, line_buf, SHELL_DEFAULT_BUFSIZE);

return 0;
}

0 comments on commit 05a6622

Please sign in to comment.