// 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 } }
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"; }