#include rtx51tny.h
#include reg51.h
#define MOTOR     0x01  // Motor connected to P2.0
#define WATER_PUMP 0x02 // Water pump connected to P2.1
#define BUZZER    0x04  // Buzzer connected to P2.2

void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++) {
        for (j = 0; j < 120; j++);  // Approximate 1ms delay at 12MHz
    }
}
void job0 (void) _task_ 0  {                   
  os_create_task (1);
  os_create_task (2);
  os_create_task (3);
	P2 = 0x00;
	os_delete_task (0);
} 
// Task 1: Filling Water
void task_water_fill(void) _task_ 1 {
    while (1) {
        P2 |= WATER_PUMP;  // Turn on water pump
        delay_ms(5000);    // Fill water for 5 seconds (simulate enough water)
        P2 &= ~WATER_PUMP; // Turn off water pump

        os_send_signal(2); // Signal Task 2 to start washing
        os_wait(0x01);     // Wait for signal from Task 2
    }
}
// Task 2: Washing and Rinsing
void task_washing(void) _task_ 2 {
    while (1) {
        os_wait(0x01);     // Wait for signal from Task 1
        // Start washing process
        P2 |= MOTOR;       // Turn on motor
        delay_ms(7000);    // Simulate washing for 7 seconds
        P2 &= ~MOTOR;      // Turn off motor
        // Drain old water
        delay_ms(3000);    // Simulate water draining for 3 seconds
        // Rinse process
        P2 |= WATER_PUMP;  // Turn on water pump to add fresh water
        delay_ms(5000);    // Fill water for 5 seconds
        P2 &= ~WATER_PUMP; // Turn off water pump

        // Start rinsing process
        P2 |= MOTOR;       // Turn on motor
        delay_ms(5000);    // Simulate rinsing for 5 seconds
        P2 &= ~MOTOR;      // Turn off motor

        // Drain water again
        delay_ms(3000);    // Simulate water draining for 3 seconds

        os_send_signal(3); // Signal Task 3 to start drying
    }
}
// Task 3: Drying and Buzzer
void task_drying(void) _task_ 3 {
    while (1) {
        os_wait(0x01);     // Wait for signal from Task 2
        // Start drying process
        P2 |= MOTOR;       // Turn on dryer (reusing motor)
        delay_ms(5000);    // Simulate drying for 5 seconds
        P2 &= ~MOTOR;      // Turn off dryer

        // End process with buzzer
        P2 |= BUZZER;      // Turn on buzzer
        delay_ms(2000);    // Buzzer sound for 2 seconds
        P2 &= ~BUZZER;     // Turn off buzzer

        os_send_signal(1); // Signal Task 1 to repeat the process
    }
}