const int NR_DC = 2;
const int NR_DP = 1;
const int DC_TIME = 8;
const int DP_TIME = 15;
const int FIRST_DC = 0;
const int FIRST_DP = 5;
int memory = 96;
int dc_scanner_turn = FIRST_DC;
int dc_ip1_turn = FIRST_DC;
int dc_ip2_turn = FIRST_DC;
int scan_time;
int recover_time;
int no_recover_time=0;
int ip1_time;
int ip2_time;
int print_ip_time;
int totalMB;
bool firstCopyProcessed = false;
bool printArriving = false;
bool printerClaimedByCopy = false;
const int n=8; //n specify the number of concurrent pages
urgent chan start_scanner;
urgent chan start_scan_ip;
urgent chan start_ip1;
urgent chan start_ip2;
urgent chan start_print_ip;
urgent chan start_up;
urgent chan start_down;
broadcast chan end_scanner;
broadcast chan end_scan_ip;
broadcast chan end_ip1;
broadcast chan end_ip2;
broadcast chan end_print_ip;
broadcast chan end_up;
broadcast chan end_down;
chan printing_claimed[n];
chan usb_transfer_claimed[n];
urgent chan printing_finished[n];
urgent chan usb_transfer_finished[n];
urgent chan observe_dc;
//clock time;
void setScannerTime()
{
scan_time = 6;
recover_time = 1;
}
int getIp1Time()
{
return 3;
}
void setIp1Time()
{
ip1_time = 3;
}
void setIp2Time()
{
ip2_time = 3;
}
void setPrintTime()
{
print_ip_time = 4;
}
int nextTurnDC(int i)
{
return ((i-FIRST_DC+1) % NR_DC) + FIRST_DC;
}RESOURCEurgent chan &start_resource,broadcast chan &end_resource, int &execution_time, int &recover_timeclock x;
RECOVERINGRUNNINGIDLEUSB_BUSclock x_up, x_down;
//int MB_up=12, MB_down=12;
int MB_up, MB_down;
const int high_speed=3;
//divide function for rounding up in case of not null remainder
int divide(int a, int b)
{
if ((a % b) == 0)
{return a/b; }
{return (a/b) + 1;}
}
DOWNUP_AND_DOWNUPINITAGENT_AUTOMATONchan &resource_claimed,urgent chan &resource_released, urgent chan &start_resource, broadcast chan &end_resourceUSE_CASE_DIRECT_COPYint i, int dataToBeTransfered, int memory_ip2, int memory_usb, urgent chan &observeclock x;INITUSE_CASE_PRINT_FROM_CONTROLLERint i, int dataToBeTransfered, int memory_printerclock x;
clock timeSinceArrival;INITOBSERVERurgent chan &observeclock x;INITSCANNER=RESOURCE(start_scanner, end_scanner, scan_time, recover_time);
SCAN_IP=RESOURCE(start_scan_ip, end_scan_ip, scan_time, no_recover_time);
IP1=RESOURCE(start_ip1, end_ip1, ip1_time, no_recover_time);
IP2=RESOURCE(start_ip2, end_ip2, ip2_time, no_recover_time);
PRINTER=RESOURCE(start_print_ip, end_print_ip, print_ip_time, no_recover_time);
PA5=AGENT_AUTOMATON(printing_claimed[5], printing_finished[5], start_print_ip, end_print_ip);
PA0=AGENT_AUTOMATON(printing_claimed[0], printing_finished[0], start_print_ip, end_print_ip);
UBA0=AGENT_AUTOMATON(usb_transfer_claimed[0], usb_transfer_finished[0], start_up, end_up);
PA1=AGENT_AUTOMATON(printing_claimed[1], printing_finished[1], start_print_ip, end_print_ip);
UBA1=AGENT_AUTOMATON(usb_transfer_claimed[1], usb_transfer_finished[1], start_up, end_up);
DC_OBSERVER=OBSERVER(observe_dc);
DP0=USE_CASE_PRINT_FROM_CONTROLLER(5, 12, 12);
DC0=USE_CASE_DIRECT_COPY(0, 12, 12, 12, observe_dc);
DC1=USE_CASE_DIRECT_COPY(1, 12, 12, 12, observe_dc);
system PA0, UBA0, PA1, UBA1, PA5, SCANNER, SCAN_IP, IP1, IP2, PRINTER, USB_BUS, DC0, DC1, DP0, DC_OBSERVER;