コード例 #1
0
ファイル: serial_if_mac.c プロジェクト: thegeek82000/asf
/**
 * \internal
 * \brief This function extracts the MAC SAP Release.Request.
 *
 * \note This function extracts the MAC SAP Release.Request from the
 * received packet and stores the data in the circular buffer if possible.
 *
 * \retval 0 primitive stored
 * \retval -1 primitive could not be stored
 */
static int _serial_if_mac_unpack_release_req(void)
{
	uint8_t *puc_rx_buff;

	/* Extract MAC primitive */
	puc_rx_buff = puc_rx;
	newMacCallBackCmd->handler = (((uint16_t)puc_rx_buff[0]) << 8) +
			(uint16_t)puc_rx_buff[1];

	/* Store the primitive in the circular buffer */
	return(prime_MAC_RELEASE_request(newMacCallBackCmd->handler));
}
コード例 #2
0
ファイル: app_emu_service.c プロジェクト: Realtime-7/asf
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
	}
}