📄 tdma3.pr.c
字号:
/** state (fr_src) transition processing **/
FSM_PROFILE_SECTION_IN (tdma3 [fr_src trans conditions], state3_trans_conds)
FSM_INIT_COND (TRANSMITTING)
FSM_TEST_COND (!TRANSMITTING)
FSM_TEST_LOGIC ("fr_src")
FSM_PROFILE_SECTION_OUT (tdma3 [fr_src trans conditions], state3_trans_conds)
FSM_TRANSIT_SWITCH
{
FSM_CASE_TRANSIT (0, 1, state1_enter_exec, ;, "TRANSMITTING", "", "fr_src", "idle")
FSM_CASE_TRANSIT (1, 4, state4_enter_exec, ;, "!TRANSMITTING", "", "fr_src", "tx")
}
/*---------------------------------------------------------*/
/** state (tx) enter executives **/
FSM_STATE_ENTER_FORCED (4, "tx", state4_enter_exec, "tdma3 [tx enter execs]")
FSM_PROFILE_SECTION_IN (tdma3 [tx enter execs], state4_enter_exec)
{
current_time = op_sim_time();
/* Determine if currently my slot. */
/* EPSILON accounts for rounding error */
used_slots = (int) floor ((current_time / slot_length) + EPSILON);
current_offset = used_slots % num_slots;
/* See if there is time left in the current slot to transmit */
/* the packet at the top of the queue */
time_left_in_slot = ((used_slots + 1)*slot_length) - current_time;
pk_len = (double) op_pk_total_size_get (op_subq_pk_access (0, OPC_QPOS_HEAD));
pk_time = (double) pk_len / tx_data_rate;
/* If this is my slot and I have enough time to transmit the */
/* entire packet then transmit. Otherwise set a self intrpt */
/* for the beginning of my next slot. */
if ((current_offset == my_offset) && (pk_time < time_left_in_slot))
{
/* dequeue the packet and send it */
pkptr = op_subq_pk_remove (0, OPC_QPOS_HEAD);
/* reset the flag to schedule a self interrupt */
/* for packets arriving subsequent to this one */
intrpt_flag = 0;
if (op_prg_odb_ltrace_active ("tdma"))
{
printf ("TDMA Node %d is transmitting at time: %f\n", my_node_id, op_sim_time ());
printf ("\n");
}
pk_len = (double) op_pk_total_size_get (pkptr);
/** Record Statistics **/
/** The bits/sec or packets/sec statistics are recorded in **/
/** bits and packets, and then the OPNET statistic "capture **/
/** mode" is used to obtain a bucketized sum over time. **/
/** Record extra 0.0 data-points to enable proper computation **/
/** of the "sum/time" based statistics. **/
op_stat_write (num_pk_sent_stat, 1.0);
op_stat_write (pk_sec_sent_stat, 1.0);
op_stat_write (pk_sec_sent_stat, 0.0);
op_stat_write (global_pk_sent_stat, 1.0);
op_stat_write (global_pk_sec_sent_stat, 1.0);
op_stat_write (global_pk_sec_sent_stat, 0.0);
op_stat_write (num_bits_sent_stat, pk_len);
op_stat_write (bits_sec_sent_stat, pk_len);
op_stat_write (bits_sec_sent_stat, 0.0);
op_stat_write (global_bits_sent_stat, pk_len);
op_stat_write (global_bits_sec_sent_stat, pk_len);
op_stat_write (global_bits_sec_sent_stat, 0.0);
op_pk_send (pkptr, TX_OUT_STRM);
} /* End if */
else
{
next_offset = my_offset - current_offset;
if (next_offset <= 0)
{
next_offset += num_slots;
}
my_next_slot_time = (double) (used_slots + next_offset) * slot_length;
/* schedule a self interrupt only if one has not */
/* been already scheduled for the next slot time */
if (!SELF_INTRPT_SCHLD)
{
op_intrpt_schedule_self (my_next_slot_time, 0);
intrpt_flag = 1;
}
} /* End else */
}
FSM_PROFILE_SECTION_OUT (tdma3 [tx enter execs], state4_enter_exec)
/** state (tx) exit executives **/
FSM_STATE_EXIT_FORCED (4, "tx", "tdma3 [tx exit execs]")
FSM_PROFILE_SECTION_IN (tdma3 [tx exit execs], state4_exit_exec)
{
}
FSM_PROFILE_SECTION_OUT (tdma3 [tx exit execs], state4_exit_exec)
/** state (tx) transition processing **/
FSM_TRANSIT_FORCE (1, state1_enter_exec, ;, "default", "", "tx", "idle")
/*---------------------------------------------------------*/
}
FSM_EXIT (0,"tdma3")
}
}
void
tdma3_diag (OP_SIM_CONTEXT_ARG_OPT)
{
#if !defined (VOSD_NO_FIN)
int _op_block_origin = __LINE__;
#endif
FIN_MT (tdma3_diag ())
if (1)
{
Packet* pkptr;
Objid current_node_id,
tx_id, comp_id, tx_ch_id;
double floor();
double fmod();
int used_slots;
int current_offset;
int next_offset;
int i;
double current_time;
double time_left_in_slot;
double pk_len;
double pk_time;
double my_next_slot_time;
int current_intrpt_type;
int num_fixed, num_mobile, num_sat;
/* Diagnostic Block */
BINIT
printf ("Object ID = %d Current Sim Time = %g\n", my_id, op_sim_time ());
printf ("My TDMA Offset = %d\n", my_offset);
printf ("Number of TDMA Slots = %d\n", num_slots);
printf ("Number of Packets Received = %d\n", num_pk_rcvd);
printf ("Number of Bits Received = %d\n", num_bits_rcvd);
printf ("Number of Packets Sent = %d\n", num_pk_sent);
printf ("Number of Bits Sent = %d\n", num_bits_sent);
/* End of Diagnostic Block */
}
FOUT
}
void
tdma3_terminate (OP_SIM_CONTEXT_ARG_OPT)
{
#if !defined (VOSD_NO_FIN)
int _op_block_origin = __LINE__;
#endif
FIN_MT (tdma3_terminate ())
Vos_Poolmem_Dealloc_MT (OP_SIM_CONTEXT_THREAD_INDEX_COMMA pr_state_ptr);
FOUT
}
/* Undefine shortcuts to state variables to avoid */
/* syntax error in direct access to fields of */
/* local variable prs_ptr in tdma3_svar function. */
#undef my_offset
#undef slot_length
#undef tx_data_rate
#undef intrpt_flag
#undef num_pk_sent
#undef num_pk_rcvd
#undef num_bits_sent
#undef num_bits_rcvd
#undef num_pk_sent_stat
#undef global_pk_sent_stat
#undef num_pk_rcvd_stat
#undef global_pk_rcvd_stat
#undef my_node_id
#undef my_id
#undef num_bits_sent_stat
#undef global_bits_sent_stat
#undef num_bits_rcvd_stat
#undef global_bits_rcvd_stat
#undef bits_sec_rcvd_stat
#undef bits_sec_sent_stat
#undef pk_sec_rcvd_stat
#undef pk_sec_sent_stat
#undef global_bits_sec_rcvd_stat
#undef global_bits_sec_sent_stat
#undef global_pk_sec_rcvd_stat
#undef global_pk_sec_sent_stat
#undef FIN_PREAMBLE_DEC
#undef FIN_PREAMBLE_CODE
#define FIN_PREAMBLE_DEC
#define FIN_PREAMBLE_CODE
VosT_Obtype
tdma3_init (int * init_block_ptr)
{
#if !defined (VOSD_NO_FIN)
int _op_block_origin = 0;
#endif
VosT_Obtype obtype = OPC_NIL;
FIN_MT (tdma3_init (init_block_ptr))
Vos_Define_Object (&obtype, "proc state vars (tdma3)",
sizeof (tdma3_state), 0, 20);
*init_block_ptr = 0;
FRET (obtype)
}
VosT_Address
tdma3_alloc (VOS_THREAD_INDEX_ARG_COMMA VosT_Obtype obtype, int init_block)
{
#if !defined (VOSD_NO_FIN)
int _op_block_origin = 0;
#endif
tdma3_state * ptr;
FIN_MT (tdma3_alloc (obtype))
ptr = (tdma3_state *)Vos_Alloc_Object_MT (VOS_THREAD_INDEX_COMMA obtype);
if (ptr != OPC_NIL)
ptr->_op_current_block = init_block;
FRET ((VosT_Address)ptr)
}
void
tdma3_svar (void * gen_ptr, const char * var_name, void ** var_p_ptr)
{
tdma3_state *prs_ptr;
FIN_MT (tdma3_svar (gen_ptr, var_name, var_p_ptr))
if (var_name == OPC_NIL)
{
*var_p_ptr = (void *)OPC_NIL;
FOUT
}
prs_ptr = (tdma3_state *)gen_ptr;
if (strcmp ("my_offset" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->my_offset);
FOUT
}
if (strcmp ("slot_length" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->slot_length);
FOUT
}
if (strcmp ("tx_data_rate" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->tx_data_rate);
FOUT
}
if (strcmp ("intrpt_flag" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->intrpt_flag);
FOUT
}
if (strcmp ("num_pk_sent" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->num_pk_sent);
FOUT
}
if (strcmp ("num_pk_rcvd" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->num_pk_rcvd);
FOUT
}
if (strcmp ("num_bits_sent" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->num_bits_sent);
FOUT
}
if (strcmp ("num_bits_rcvd" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->num_bits_rcvd);
FOUT
}
if (strcmp ("num_pk_sent_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->num_pk_sent_stat);
FOUT
}
if (strcmp ("global_pk_sent_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->global_pk_sent_stat);
FOUT
}
if (strcmp ("num_pk_rcvd_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->num_pk_rcvd_stat);
FOUT
}
if (strcmp ("global_pk_rcvd_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->global_pk_rcvd_stat);
FOUT
}
if (strcmp ("my_node_id" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->my_node_id);
FOUT
}
if (strcmp ("my_id" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->my_id);
FOUT
}
if (strcmp ("num_bits_sent_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->num_bits_sent_stat);
FOUT
}
if (strcmp ("global_bits_sent_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->global_bits_sent_stat);
FOUT
}
if (strcmp ("num_bits_rcvd_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->num_bits_rcvd_stat);
FOUT
}
if (strcmp ("global_bits_rcvd_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->global_bits_rcvd_stat);
FOUT
}
if (strcmp ("bits_sec_rcvd_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->bits_sec_rcvd_stat);
FOUT
}
if (strcmp ("bits_sec_sent_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->bits_sec_sent_stat);
FOUT
}
if (strcmp ("pk_sec_rcvd_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->pk_sec_rcvd_stat);
FOUT
}
if (strcmp ("pk_sec_sent_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->pk_sec_sent_stat);
FOUT
}
if (strcmp ("global_bits_sec_rcvd_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->global_bits_sec_rcvd_stat);
FOUT
}
if (strcmp ("global_bits_sec_sent_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->global_bits_sec_sent_stat);
FOUT
}
if (strcmp ("global_pk_sec_rcvd_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->global_pk_sec_rcvd_stat);
FOUT
}
if (strcmp ("global_pk_sec_sent_stat" , var_name) == 0)
{
*var_p_ptr = (void *) (&prs_ptr->global_pk_sec_sent_stat);
FOUT
}
*var_p_ptr = (void *)OPC_NIL;
FOUT
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -