Exemple #1
0
size_t rc522_uart_scan(const nfc_context * context, nfc_connstring connstrings[], const size_t connstrings_len) {
	size_t device_found = 0;
	char ** acPorts = uart_list_ports();
	const char * acPort;
	size_t iDevice = 0;

	while ((acPort = acPorts[iDevice++])) {
		nfc_connstring connstring;
		snprintf(connstring, sizeof(nfc_connstring), "%s:%s:%"PRIu32, DRIVER_NAME, acPort, DEFAULT_BAUD_RATE);

		nfc_device * pnd;
		int ret = rc522_uart_create(context, connstring, acPort, DEFAULT_BAUD_RATE, &pnd);
		if (ret == NFC_ESOFT) {
			uart_list_free(acPorts);
			return 0;
		}
		if (ret != NFC_SUCCESS) {
			continue;
		}
		rc522_uart_close(pnd);

		memcpy(connstrings[device_found], connstring, sizeof(nfc_connstring));
		device_found++;

		// Test if we reach the maximum "wanted" devices
		if (device_found >= connstrings_len)
			break;
    }

	uart_list_free(acPorts);
	return device_found;
}
Exemple #2
0
static size_t
pn532_uart_scan(const nfc_context *context, nfc_connstring connstrings[], const size_t connstrings_len)
{
    size_t device_found = 0;
    serial_port sp;
    char **acPorts = uart_list_ports();
    const char *acPort;
    int     iDevice = 0;

    while ((acPort = acPorts[iDevice++])) {
        sp = uart_open(acPort);
        log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "Trying to find PN532 device on serial port: %s at %d baud.", acPort, PN532_UART_DEFAULT_SPEED);

        if ((sp != INVALID_SERIAL_PORT) && (sp != CLAIMED_SERIAL_PORT)) {
            // We need to flush input to be sure first reply does not comes from older byte transceive
            uart_flush_input(sp, true);
            // Serial port claimed but we need to check if a PN532_UART is opened.
            uart_set_speed(sp, PN532_UART_DEFAULT_SPEED);

            nfc_connstring connstring;
            snprintf(connstring, sizeof(nfc_connstring), "%s:%s:%"PRIu32, PN532_UART_DRIVER_NAME, acPort, PN532_UART_DEFAULT_SPEED);
            nfc_device *pnd = nfc_device_new(context, connstring);
            if (!pnd) {
                perror("nfc_device_new");
                uart_close(sp);
                uart_list_free(acPorts);
                return 0;
            }
            pnd->driver = &pn532_uart_driver;
            pnd->driver_data = malloc(sizeof(struct pn532_uart_data));
            if (!pnd->driver_data) {
                perror("malloc");
                uart_close(sp);
                nfc_device_free(pnd);
                uart_list_free(acPorts);
                return 0;
            }
            DRIVER_DATA(pnd)->port = sp;

            // Alloc and init chip's data
            if (pn53x_data_new(pnd, &pn532_uart_io) == NULL) {
                perror("pn53x_data_new");
                uart_close(DRIVER_DATA(pnd)->port);
                nfc_device_free(pnd);
                uart_list_free(acPorts);
                return 0;
            }
            // SAMConfiguration command if needed to wakeup the chip and pn53x_SAMConfiguration check if the chip is a PN532
            CHIP_DATA(pnd)->type = PN532;
            // This device starts in LowVBat power mode
            CHIP_DATA(pnd)->power_mode = LOWVBAT;

#ifndef WIN32
            // pipe-based abort mecanism
            if (pipe(DRIVER_DATA(pnd)->iAbortFds) < 0) {
                uart_close(DRIVER_DATA(pnd)->port);
                pn53x_data_free(pnd);
                nfc_device_free(pnd);
                uart_list_free(acPorts);
                return 0;
            }
#else
            DRIVER_DATA(pnd)->abort_flag = false;
#endif

            // Check communication using "Diagnose" command, with "Communication test" (0x00)
            int res = pn53x_check_communication(pnd);
            uart_close(DRIVER_DATA(pnd)->port);
            pn53x_data_free(pnd);
            nfc_device_free(pnd);
            if (res < 0) {
                continue;
            }

            memcpy(connstrings[device_found], connstring, sizeof(nfc_connstring));
            device_found++;

            // Test if we reach the maximum "wanted" devices
            if (device_found >= connstrings_len)
                break;
        }
    }
    uart_list_free(acPorts);
    return device_found;
}