Exemplo n.º 1
0
void app_emu_process(void)
{
	uint8_t uc_num_test;

	static uint16_t us_len_rcv;
	static uint16_t us_len_tx;

	Bool new_command = false;

	/* Reception of Mac primitives */
	if (_node_connected() && prime_MAC_callback(&tmp_new_cmd, us_meter_handler, CON_TYPE)) {
		counter_new_cmd = &tmp_new_cmd;
		new_command = true;
		switch (counter_new_cmd->command) {
		case PRIME_MACSAP_RELEASE_INDICATION:
			prime_MAC_RELEASE_response(us_meter_handler, PRIME_MACSAP_RESULT_ACCEPT);
			uc_app_emu_st = APPEMU_TIMETO_RECONNECT;
			ul_time_app_emu = TIMETO_RECONNECT + (uint32_t)app_emu_random();
#ifdef APPEMU_DEBUG
#ifdef __GNUC__
			printf("Connection closed with Concentrator. Reconnecting in %lu milliseconds\n",
					ul_time_app_emu);
#endif
#ifdef __ICCARM__
			printf("Connection closed with Concentrator. Reconnecting in %u milliseconds\n",
					ul_time_app_emu);
#endif
#endif
			break;

		/* Ensure that connection is closed (If connection is already
		 * closed, no packet will be sent to network) */
		case PRIME_MACSAP_RELEASE_CONFIRM:
			uc_app_emu_st = APPEMU_WAIT_REGISTER;
#ifdef APPEMU_DEBUG
			printf("Release Confirm\n");
#endif
			break;

		default:
			break;
		}
	}

	switch (uc_app_emu_st) {
	case APPEMU_GET_SERIAL:
		if (_get_serial(pc_serial)) {
			uc_app_emu_st = APPEMU_WAIT_REGISTER;
		}

		break;

	case APPEMU_WAIT_REGISTER:
		if (_service_node_registered()) {
			uc_app_emu_st = APPEMU_CONNECT_REQUEST;
			ul_time_app_emu = TIME_OUT_CONNECTION;
		}

		break;

	case APPEMU_CONNECT_REQUEST:
#ifdef APPEMU_DEBUG
		printf("Serial: %s\n", pc_serial);
#endif
		prime_MAC_ESTABLISH_request(NULL, CON_TYPE, (unsigned char *)pc_serial, SERIAL_SIZE, 0, 0);
		uc_app_emu_st = APPEMU_WAIT_RESPONSE_CONNECT;
		ul_time_app_emu = TIME_OUT_CONNECTION;
		break;

	case APPEMU_WAIT_RESPONSE_CONNECT:
		if (new_command) {
			new_command = false;
			if (counter_new_cmd->command ==	PRIME_MACSAP_ESTABLISH_CONFIRM) {
				if (counter_new_cmd->answer == PRIME_MACSAP_RESULT_SUCCESS) {
					us_meter_handler = counter_new_cmd->handler;
#ifdef APPEMU_DEBUG
					printf("Connection opened with Concentrator (handler: %i)\n",
							us_meter_handler);
#endif
					counter_new_cmd->buf[counter_new_cmd->bufLength] = '\0';
#ifdef APPEMU_DEBUG
					printf("Connection data : %s\n", &counter_new_cmd->buf[0]);
#endif
					/* Start Test */
					uc_app_emu_st = APPEMU_WAIT_MESSAGE;
				} else {
					uc_app_emu_st = APPEMU_TIMETO_RECONNECT;
#ifdef APPEMU_DEBUG
#ifdef __GNUC__
					printf("Connection rejected. Reconnecting in %lu milliseconds\n",
							ul_time_app_emu);
#endif
#ifdef __ICCARM__
					printf("Connection rejected. Reconnecting in %u milliseconds\n",
							ul_time_app_emu);
#endif
#endif
				}

				ul_time_app_emu = TIME_OUT_TEST + (uint32_t)app_emu_random();
			}
		}

		break;

	/* It will be always in this state waiting to receive message until */
	/* a PRIME_MACSAP_RELEASE_INDICATION is received */
	case APPEMU_WAIT_MESSAGE:
		if (new_command) {
			new_command = false;
			if (counter_new_cmd->command == PRIME_MACSAP_DATA_INDICATION) {
				us_len_tx = _get_len_answer_msg(counter_new_cmd, &us_len_rcv, &uc_num_test);

				if (us_len_tx) {
#ifdef APPEMU_DEBUG
					printf("Received %i bytes\t Test:%i\t\n", us_len_rcv, (uint16_t)uc_num_test);
#endif
					app_emu_copy_timestamp(pc_timestamp, counter_new_cmd->buf);
					app_emu_fill_string((char *)pc_request, us_len_tx, UP_MSG, uc_num_test, pc_timestamp);
					uc_app_emu_st = APPEMU_SEND_RESPONSE;
				} else {
#ifdef APPEMU_DEBUG
					printf("Wrong Message received\n");
#endif
				}
			}
		}

		break;

	case APPEMU_SEND_RESPONSE:
		prime_MAC_DATA_request(us_meter_handler, pc_request, us_len_tx, 1);
#ifdef APPEMU_DEBUG
		printf("Sent:%i\n", us_len_tx);
#endif
		uc_app_emu_st = APPEMU_WAIT_MESSAGE;
		break;

	case APPEMU_TIMETO_RECONNECT:
		break;
	}

	if ((uc_app_emu_st != APPEMU_GET_SERIAL) && (!ul_time_app_emu)) {
		/* Ensure that connection is closed (If connection is already
		 * closed, no packet will be sent to network) */
		prime_MAC_RELEASE_request(us_meter_handler);
		uc_app_emu_st = APPEMU_WAIT_REGISTER;
		ul_time_app_emu = TIMETO_RECONNECT + (uint32_t)app_emu_random();
#ifdef APPEMU_DEBUG
#ifdef __GNUC__
		printf("Connection timeout. Reconnecting in %lu milliseconds\n",
				ul_time_app_emu);
#endif
#ifdef __ICCARM__
		printf("Connection timeout. Reconnecting in %u milliseconds\n",
				ul_time_app_emu);
#endif
#endif
	}
}
Exemplo n.º 2
0
/**
 * \brief Function to encapsulate MAC Tx Control Process.
 *
 * \note This function will be called using a pointer.
 *
 * \retval 0 if the request has been made to the CS layer
 * \retval -1 if it was unable to pass the request to the CS layer
 */
int8_t serial_if_mac_process(void)
{
	int8_t c_result = -1;
	x_usi_serial_cmd_params_t x_pkt_usi;

	if (newMacCallBackCmd != NULL) {
		/* Extracts everything Non Reserved */
		if (prime_MAC_callback(newMacCallBackCmd,
				GENERIC_CALLBACK_HANDLER,
				GENERIC_CALLBACK_TYPE)) {
			/* Extract the data before packing and sending the
			 * primitive */
			switch (newMacCallBackCmd->command) {
			case PRIME_MACSAP_ESTABLISH_INDICATION:
				c_result = _serial_if_mac_pack_establish_ind(newMacCallBackCmd->handler,
						newMacCallBackCmd->macAddr,
						newMacCallBackCmd->type,
						newMacCallBackCmd->buf,
						newMacCallBackCmd->bufLength,
						newMacCallBackCmd->cfpBytes,
						newMacCallBackCmd->errorType);
				break;

			case PRIME_MACSAP_ESTABLISH_CONFIRM:
				c_result = _serial_if_mac_pack_establish_conf(newMacCallBackCmd->handler,
						newMacCallBackCmd->answer,
						newMacCallBackCmd->macAddr,
						newMacCallBackCmd->type,
						newMacCallBackCmd->buf,
						newMacCallBackCmd->bufLength,
						newMacCallBackCmd->errorType);
				break;

			case PRIME_MACSAP_RELEASE_INDICATION:
				c_result = _serial_if_mac_pack_release_ind(newMacCallBackCmd->handler,
						newMacCallBackCmd->answer,
						newMacCallBackCmd->type,
						newMacCallBackCmd->errorType);
				break;

			case PRIME_MACSAP_RELEASE_CONFIRM:
				c_result = _serial_if_mac_pack_release_conf(newMacCallBackCmd->handler,
						newMacCallBackCmd->answer,
						newMacCallBackCmd->type,
						newMacCallBackCmd->errorType);
				break;

			case PRIME_MACSAP_JOIN_CONFIRM:
				c_result = _serial_if_mac_pack_join_conf(newMacCallBackCmd->handler,
						newMacCallBackCmd->answer,
						newMacCallBackCmd->type,
						newMacCallBackCmd->errorType);
				break;

			case PRIME_MACSAP_JOIN_INDICATION_BASE:
				c_result = _serial_if_mac_pack_join_ind_base(newMacCallBackCmd->handler,
						newMacCallBackCmd->macAddr,
						newMacCallBackCmd->type,
						newMacCallBackCmd->buf,
						newMacCallBackCmd->bufLength,
						newMacCallBackCmd->errorType);
				break;

			case PRIME_MACSAP_JOIN_INDICATION_SERVICE:
				c_result = _serial_if_mac_pack_join_ind_service(newMacCallBackCmd->handler,
						newMacCallBackCmd->buf,
						newMacCallBackCmd->bufLength,
						newMacCallBackCmd->type,
						newMacCallBackCmd->errorType);
				break;

			case PRIME_MACSAP_LEAVE_CONFIRM:
				c_result = _serial_if_mac_pack_leave_conf(newMacCallBackCmd->handler,
						newMacCallBackCmd->answer,
						newMacCallBackCmd->type,
						newMacCallBackCmd->errorType);
				break;

			case PRIME_MACSAP_LEAVE_INDICATION_BASE:
				c_result = _serial_if_mac_pack_leave_ind_base(newMacCallBackCmd->handler,
						newMacCallBackCmd->macAddr,
						newMacCallBackCmd->type,
						newMacCallBackCmd->errorType);
				break;

			case PRIME_MACSAP_LEAVE_INDICATION_SERVICE:
				c_result = _serial_if_mac_pack_leave_ind_service(newMacCallBackCmd->handler,
						newMacCallBackCmd->type,
						newMacCallBackCmd->errorType);
				break;

			case PRIME_MACSAP_DATA_CONFIRM:
				c_result = _serial_if_mac_pack_data_conf(newMacCallBackCmd->handler,
						newMacCallBackCmd->buf,
						newMacCallBackCmd->answer,
						newMacCallBackCmd->type,
						newMacCallBackCmd->errorType);
				break;

			case PRIME_MACSAP_DATA_INDICATION:
				c_result = _serial_if_mac_pack_data_ind(newMacCallBackCmd->handler,
						newMacCallBackCmd->buf,
						newMacCallBackCmd->bufLength,
						newMacCallBackCmd->type,
						newMacCallBackCmd->errorType);
				break;

			default:
				c_result = -1;
				break;
			}

			if (c_result == 0) {
				/* Pack and send the primitive */
				x_pkt_usi.uc_protocol_type = PROTOCOL_MAC_PRIME;
				x_pkt_usi.ptr_buf = (uint8_t *)&commandMacToPack[0];
				x_pkt_usi.us_len = us_tx_len;
				c_result = usi_send_cmd(&x_pkt_usi);
			}
		}
	}

	return(c_result);
}