Skip to content
main.c 2.51 KiB
Newer Older
#include <mutek/startup.h>
#include <mutek/thread.h>
#include <mutek/printk.h>
Nicolas Pouillon's avatar
Nicolas Pouillon committed
#include <stdio.h>

#include <device/class/nfc.h>
Nicolas Pouillon's avatar
Nicolas Pouillon committed
#include <device/class/char.h>
#include <device/class/timer.h>
#include <device/class/pwm.h>

#define BACKLIGHT 12

static CONTEXT_ENTRY(nfc_main)
{
    error_t err;
Nicolas Pouillon's avatar
Nicolas Pouillon committed
    struct device_char_s lcd;
    struct device_timer_s timer;
    struct device_pwm_s pwm;
    dev_timer_delay_t sec;
    struct dev_pwm_config_s pwm_config;
    struct device_nfc_s nfc;
    struct dev_nfc_rq_s req;
    struct dev_nfc_peer_s peer;
Nicolas Pouillon's avatar
Nicolas Pouillon committed
    char buffer[64];

    pwm_config.freq.num = 16000;
    pwm_config.freq.denom = 1;
    pwm_config.duty.num = 0;
    pwm_config.duty.denom = 16;
    pwm_config.pol = DEV_PWM_POL_HIGH;

    req.peer = &peer;
    peer.side = DEV_NFC_PASSIVE_PICC;
    peer.protocol = DEV_NFC_14443A;
    peer.atqa = 0;

    err = device_get_accessor_by_path(&nfc.base, NULL, "/nfc0", DRIVER_CLASS_NFC);
    assert(!err);

Nicolas Pouillon's avatar
Nicolas Pouillon committed
    err = device_get_accessor_by_path(&lcd.base, NULL, "/lcd*", DRIVER_CLASS_CHAR);
    assert(!err);

Nicolas Pouillon's avatar
Nicolas Pouillon committed
    err = device_get_accessor_by_path(&pwm.base, NULL, "/pwm*", DRIVER_CLASS_PWM);
    assert(!err);
Nicolas Pouillon's avatar
Nicolas Pouillon committed

    err = device_get_accessor_by_path(&timer.base, NULL, "/rtc* /timer*", DRIVER_CLASS_TIMER);
    assert(!err);

    device_start(&pwm.base);
    dev_pwm_wait_config(&pwm, &pwm_config,
                        DEV_PWM_MASK_DUTY|DEV_PWM_MASK_FREQ|DEV_PWM_MASK_POL);
    dev_timer_init_sec(&timer, &sec, 0, 1, 10);

    while (1) {
      size_t n;

      req.type = DEV_NFC_FIND_ANY;
      err = dev_nfc_wait_request(&nfc, &req);

      n = snprintf(buffer, sizeof(buffer), "\x1b[2J" "\x1b[0;0H" "Please put a tag",
                   peer.uid, peer.uid_size, peer.sak, peer.atqa);
      dev_char_wait_op(&lcd, DEV_CHAR_WRITE_FLUSH, (void *)buffer, n);

      if (err == 0) {
        pwm_config.duty.num = 16;
        dev_pwm_wait_config(&pwm, &pwm_config, DEV_PWM_MASK_DUTY);

        n = snprintf(buffer, sizeof(buffer),
                     "\x1b[2J" "\x1b[0;0H" "UID %08x"
                               "\x1b[1;0H" "SAK %02x ATQA %04x",
                 endian_le32_na_load(peer.uid),
                 peer.sak,
                 peer.atqa);
        dev_char_wait_op(&lcd, DEV_CHAR_WRITE_FLUSH, (void *)buffer, n);
        dev_timer_wait_delay(&timer, sec, 0);
      } else {
        pwm_config.duty.num = 1;
        dev_pwm_wait_config(&pwm, &pwm_config, DEV_PWM_MASK_DUTY);
      }
    }
}

void app_start(void)
{
  struct thread_attr_s attr = {
Nicolas Pouillon's avatar
Nicolas Pouillon committed
    .stack_size = 2048,
  };

  thread_create(nfc_main, 0, &attr);
}