⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tdma3.pr.c

📁 网络仿真软件OPNET TDMA的模型文件
💻 C
📖 第 1 页 / 共 2 页
字号:

			/** 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 + -