// MAIN =======================================================================================================================
void WashingMachineController::main() {
	for (;;) {
		wait(program_ready_flag);
		getProgram();

		wait(response_flag);						// wachten op signaal van de uart dat machine gestart is:
		
		webcontroller->setStatus(WACHTEN);			// sending status
		while (!getDoorStatus()) {					// wachten tot deur wasmachine is gesloten
			wait(interval_clock);
		}
		doorlock(1);
		
		startWasprogramma();
	}
}
// MAIN =======================================================================================================================
void WashingMachineController::main() {
	for (;;) {
		// wachten tot wasprogramma aanwezig is
		wait(program_ready_flag);
		getProgram();
		
		std::cout << "starting washing program\n";
		// wachten op signaal van de uart dat machine gestart is:
		wait(response_flag);
		
		while (!getDoorStatus()) {		// wachten tot deur wasmachine is gesloten
			wait(interval_clock);
		}
		doorlock(1);
		
		startWasprogramma();		// wasprogramma starten
	}
}
Esempio n. 3
0
void nfcProtocol() {
    char message[1024];
    char UAFMessage[2048];
    memoryStruct chunk;

    uint8_t capdu[264];
    size_t capdulen;
    uint8_t rapdu[264];
    size_t rapdulen;
    char *response = 0;


    const nfc_modulation nmMifare = {
        .nmt = NMT_ISO14443A,
        .nbr = NBR_106,
    };

    printf("Polling for target...\n");
    while (nfc_initiator_select_passive_target(pnd, nmMifare, NULL, 0, &nt) <= 0);
    printf("Target detected!\n");


    // Select application
    memcpy(capdu, APDU, sizeof (APDU));
    capdulen = sizeof (APDU); // 13
    rapdulen = sizeof (rapdu);
    if (CardTransmit(pnd, capdu, capdulen, rapdu, &rapdulen) < 0)
        exit(EXIT_FAILURE);
    printf("Application selected!\n");

    if (strncmp(rapdu, DOOR_HELLO, (int) rapdulen)) {
        printf("** Opss ** I'm expecting HELLO msg, but card sent to me: %s. len: %d\n", response, (int) rapdulen);
        return;
    }

    // FIDO Auth Request Message
    printf("Doing AuthRequest to FIDO UAF Server\n");
    sprintf(UAFMessage, AUTH_REQUEST_MSG, SCHEME, HOSTNAME, PORT, AUTH_REQUEST_ENDPOINT);
    chunk = getHttpRequest(UAFMessage);

    if (chunk.size <= 0) {
        printf("** Opss ** Error to connect to FIDO Server\n");
        memcpy(capdu, "ERROR", 5);
        capdulen = 5;
        rapdulen = sizeof (rapdu);
        if (CardTransmit(pnd, capdu, capdulen, rapdu, &rapdulen) < 0) {
            printf("Error to sent error message to card...\n");
        }
        return;
    }

    size_t blocks = (chunk.size / BLOCK_SIZE) + 1;

    char *buffer[blocks];
    blockSplit(chunk.memory, buffer, blocks);
    sprintf(message, "BLOCK:%ld", blocks);
    printf("Sending number of blocks: %s\n", message);
    free(chunk.memory);

    memcpy(capdu, message, strlen(message));
    capdulen = strlen(message);
    rapdulen = sizeof (rapdu);
    if (CardTransmit(pnd, capdu, capdulen, rapdu, &rapdulen) < 0) {
        printf("Error to send number of blocks\n");
        return;
    }

    int totalSent = 0;

    if (strncmp(rapdu, DOOR_NEXT, (int) rapdulen)) {
        printf("** Opss ** I'm expecting NEXT msg, but card sent to me: %s. len: %d", response, (int) rapdulen);
        return;
    }

    response = NULL;
    do { // Sending UAFRequestMessage to card
        memcpy(capdu, buffer[totalSent], strlen(buffer[totalSent]));
        capdulen = strlen(buffer[totalSent]);
        rapdulen = sizeof (rapdu);
        if (CardTransmit(pnd, capdu, capdulen, rapdu, &rapdulen) < 0) {
            int i = strlen(buffer[totalSent]);
            printf("error to send UAFRequestMessage to card. Message size: %d, message: %s\n", i, buffer[totalSent]);
            return;
        }

        if (strncmp(rapdu, DOOR_OK, (int) rapdulen)) {
            printf("** Opss ** I'm expecting OK msg, but card sent to me: %s. len: %d", response, (int) rapdulen);
            return;
        }
        response = NULL;
        free(buffer[totalSent]);
        totalSent++;
    } while (totalSent < blocks);


    printf("Sending READY!\n");
    memcpy(capdu, DOOR_READY, sizeof (DOOR_READY));
    capdulen = strlen(DOOR_READY);
    rapdulen = sizeof (rapdu);
    unsigned long timeout = LONG_MAX;
    do {
        if (CardTransmit(pnd, capdu, capdulen, rapdu, &rapdulen) < 0) {
            printf("Error to received WAIT\n");
            return;
        }

        if (strncmp(rapdu, DOOR_WAIT, (int) rapdulen) == 0) {
            continue;
        }

        if (strncmp(rapdu, DOOR_DONE, (int) rapdulen) == 0) {
            printf("Sending RESPONSE!\n");
            memcpy(capdu, DOOR_RESPONSE, sizeof (DOOR_RESPONSE));
            capdulen = strlen(DOOR_RESPONSE);
            rapdulen = sizeof (rapdu);
            if (CardTransmit(pnd, capdu, capdulen, rapdu, &rapdulen) < 0) {
                printf("Error RESPONSE...\n");
                return;
            }
            break;
        }
        timeout--;
    } while (timeout > 0);

    if (timeout == 0) {
        printf("Error. Client is not responding...\n");
        return;
    }

    strncpy(message, rapdu, (int) rapdulen);
    char *p = strtok(message, ":");
    char *endptr;
    long val;
    if (strcmp(p, "BLOCK") == 0) {
        p = strtok(NULL, ":");
        val = strtol(p, &endptr, 10);
        char *UAFmsg = malloc(sizeof (char) * BLOCK_SIZE * val + 1);
        UAFmsg[0] = '\0';
        do {
            printf("Sending NEXT!\n");
            memcpy(capdu, DOOR_NEXT, sizeof (DOOR_NEXT));
            capdulen = strlen(DOOR_NEXT);
            rapdulen = sizeof (rapdu);
            if (CardTransmit(pnd, capdu, capdulen, rapdu, &rapdulen) < 0) {
                printf("Error NEXT\n");
                return;
            }
            strncat(UAFmsg, rapdu, (int) rapdulen);
            val--;
        } while (val > 0);
        // FIDO Auth Request Message
        printf("Forwarding card response to FIDO UAF Server: \n");
        sprintf(UAFMessage, AUTH_REQUEST_MSG, SCHEME, HOSTNAME, PORT, AUTH_RESPONSE_ENDPOINT);
        //curlFetchStruct *result = postHttpRequest(UAFMessage, UAFmsg);
        json_object *result = postHttpRequest(UAFMessage, UAFmsg);
        free(UAFmsg);

        //        if (result->size <= 0) {
        if (result == NULL) {
            printf("Error to connect to FIDO Server\n");
            memcpy(capdu, "ERROR", 5);
            capdulen = 5;
            rapdulen = sizeof (rapdu);
            if (CardTransmit(pnd, capdu, capdulen, rapdu, &rapdulen) < 0) {
                printf("Error to send response to card\n");
            }
            return;
        }
        printf("Resul payload: %s \n", json_object_to_json_string(result));
        const char *resultStr = json_object_to_json_string(result);

        
        if (strstr(resultStr, "SUCCESS") == NULL) {
            printf("Access denied!\n");
            memcpy(capdu, DOOR_DENY, sizeof (DOOR_DENY));
            capdulen = strlen(DOOR_DENY);
            rapdulen = sizeof (rapdu);
            if (CardTransmit(pnd, capdu, capdulen, rapdu, &rapdulen) < 0) {
                return;
            }
        } else {
            printf("Access granted!\n");
            memcpy(capdu, DOOR_GRANTED, sizeof (DOOR_GRANTED));
            capdulen = strlen(DOOR_GRANTED);
            rapdulen = sizeof (rapdu);
            if (CardTransmit(pnd, capdu, capdulen, rapdu, &rapdulen) < 0) {
                return;
            }
            doorlock(1);
            doorlock(0);
        }
        /* free json object */
        json_object_put(result);
        
        strncpy(message, rapdu, (int) rapdulen);
        if (strstr(message, "BYE") != NULL) {
            printf("bye!\n");
        } else {
            printf(":-(\n");
        }
    }
}
void WashingMachineController::startWasprogramma() {
	webcontroller->setStatus(STARTEN);												// sending status
	signalLed(0);																	// signaalled uit

	// voorwas (zonder zeep!):
	std::cout << "---START VOORWAS---\n";
	webcontroller->setStatus(VOORWAS);												// sending status
	std::cout << "water toevoegen\n";
	watercontroller->startWaterController();
	watercontroller->setWaterLevel(wasprogramma->getLevel() / 2);					// water erbij
	wait(level_reached_flag);														// wachten tot voldoende water (flag)
	std::cout << "verwarmen\n";
	tempcontroller->startTempController();
	tempcontroller->setTemp(wasprogramma->getTemp());								// verwarmen
	wait(temp_reached_flag);														// wachten tot temp is bereikt
	std::cout << "draaien\n";
	motorcontroller->startMotorController();
	motorcontroller->setMotorJobTime(wasprogramma->getTime());						// draaien
	wait(motor_done_flag);															// wachten tot motor klaar is
	std::cout << "water wegpompen\n";
	watercontroller->setWaterLevel(0);												// water weg
	wait(level_reached_flag);														
	wait(level_reached_flag);														// wachten tot water weg is (flag)

	//hoofdwas:
	std::cout << "---START HOOFDWAS---\n";
	webcontroller->setStatus(HOOFDWAS);												// sending status
	std::cout << "water toevoegen\n";
	watercontroller->setWaterLevel(wasprogramma->getLevel());						// water erbij
	wait(level_reached_flag);														
	wait(level_reached_flag);														// wachten tot voldoende water (flag)
	std::cout << "verwarmen\n";
	tempcontroller->setTemp(wasprogramma->getTemp());								// verwarmen
	wait(temp_reached_flag);														// wachten tot temp is bereikt
	std::cout << "zeep toevoegen\n";
	dispendSoap();																	// zeep erbij
	std::cout << "draaien\n";
	motorcontroller->setMotorJobTime(wasprogramma->getTime());						// draaien
	wait(motor_done_flag);															// wachten tot motor klaar is
	std::cout << "water wegpompen\n";
	watercontroller->setWaterLevel(0);												// water weg
	wait(level_reached_flag);														
	wait(level_reached_flag);														// wachten tot water weg is (flag)

	// spoelen:
	std::cout << "---START SPOELEN---\n";
	webcontroller->setStatus(SPOELEN);												// sending status
	std::cout << "water toevoegen\n";
	watercontroller->setWaterLevel(wasprogramma->getLevel() / 2);					// water erbij
	wait(level_reached_flag);														
	wait(level_reached_flag);														// wachten tot voldoende water (flag)
	std::cout << "draaien\n";
	motorcontroller->setMotorJobTime(wasprogramma->getTime());						// draaien
	wait(motor_done_flag);															// wachten tot motor klaar is
	std::cout << "water wegpompen en heater uitzetten\n";
	watercontroller->setWaterLevel(0);												// water weg
	tempcontroller->setTemp(0);														// verwarming uitzetten
	wait(level_reached_flag);														
	wait(level_reached_flag);														// wachten tot water weg is (flag)

	// centrifugeren:
	std::cout << "---START CENTRIFUGEREN---\n";
	webcontroller->setStatus(CENTRIFUGE);											// sending status
	std::cout << "draaien\n";
	motorcontroller->setMotorJobTime(wasprogramma->getTime());						// draaien
	wait(motor_done_flag);															// wachten tot motor klaar is
	wait(level_reached_flag);														// wachten tot water weg is (flag)

	std::cout << "deur ontgrendelen\n";
	doorlock(0);																	// deur ontgrendelen
	signalLed(1);																	// signaalled aan
	std::cout << "---WAS IS KLAAR---\n";
	webcontroller->setStatus(KLAAR);												// sending status
}
void WashingMachineController::startWasprogramma() {
	signalLed(0);																	// signaalled uit

	// voorwas (zonder zeep!):
	std::cout << "START VOORWAS\n";
	std::cout << "water toevoegen\n";
	watercontroller->startWaterController();
	watercontroller->setWaterLevel(wasprogramma->getLevel());						// water erbij
	wait(level_reached_flag);														// wachten tot voldoende water (flag)
	std::cout << "verwarmen\n";
	tempcontroller->startTempController();
	tempcontroller->setTemp(wasprogramma->getTemp());								// verwarmen
	wait(temp_reached_flag);														// wachten tot temp is bereikt
	std::cout << "draaien\n";
	motorcontroller->startMotorController();
	motorcontroller->setMotorJob(wasprogramma->getJob(), wasprogramma->getTime());	// draaien
	wait(motor_done_flag);															// wachten tot motor klaar is
	std::cout << "water weg gaan pompen\n";
	watercontroller->setWaterLevel(0);												// water weg
	wait(level_reached_flag);														// wachten tot water weg is (flag)

	//hoofdwas:
	std::cout << "START HOOFDWAS\n";
	std::cout << "water toevoegen\n";
	watercontroller->setWaterLevel(wasprogramma->getLevel());						// water erbij
	wait(level_reached_flag);														// wachten tot voldoende water (flag)
	std::cout << "verwarmen\n";
	tempcontroller->setTemp(wasprogramma->getTemp());								// verwarmen
	wait(temp_reached_flag);														// wachten tot temp is bereikt
	std::cout << "zeep toevoegen\n";
	dispendSoap();																	// zeep erbij    //========================================================!!!
	std::cout << "draaien\n";
	motorcontroller->setMotorJob(wasprogramma->getJob(), wasprogramma->getTime());	// draaien
	wait(motor_done_flag);															// wachten tot motor klaar is
	std::cout << "water wegpompen\n";
	watercontroller->setWaterLevel(0);												// water weg
	wait(level_reached_flag);														// wachten tot water weg is (flag)

	// spoelen:
	std::cout << "START SPOELEN\n";
	std::cout << "water toevoegen\n";
	watercontroller->setWaterLevel(wasprogramma->getLevel());						// water erbij
	wait(level_reached_flag);														// wachten tot voldoende water (flag)
	std::cout << "draaien\n";
	motorcontroller->setMotorJob(wasprogramma->getJob(), wasprogramma->getTime());	// draaien
	wait(motor_done_flag);															// wachten tot motor klaar is
	std::cout << "water wegpompen\n";
	watercontroller->setWaterLevel(0);												// water weg
	wait(level_reached_flag);														// wachten tot water weg is (flag)

	// centrifugeren:
	std::cout << "START CENTRIFUGEREN\n";
	std::cout << "draaien\n";
	motorcontroller->setMotorJob(wasprogramma->getJob(), wasprogramma->getTime());	// draaien
	wait(motor_done_flag);															// wachten tot motor klaar is

	// temp en waterlevel op 0 zetten voor volgende wasbeurt:
	tempcontroller->setTemp(0);
	watercontroller->setWaterLevel(0);

	std::cout << "deur ontgrendelen\n";
	doorlock(0);																	// deur ontgrendelen
	signalLed(1);																	// signaalled aan
	std::cout << "WAS IS KLAAR\n";
}