예제 #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
	}
}
예제 #2
0
파일: encode.c 프로젝트: miksago/icecast
encoder_state *encode_initialise(int channels, int rate, int managed,
        int min_br, int nom_br, int max_br, float quality, vorbis_comment *vc)
{
    encoder_state *s = calloc(1, sizeof(encoder_state));
    ogg_packet h1,h2,h3;

    /* Have vorbisenc choose a mode for us */
    vorbis_info_init(&s->vi);

    if (max_br < 0 && nom_br < 0 && min_br < 0)
       managed = 0;
    if (managed == 0 && nom_br >= 0)
        if (min_br >= 0 || max_br >= 0)
            managed = 1;
    do
    {
        if (managed)
        {
            LOG_INFO5("Encoder initialising with bitrate management: %d "
                    "channels, %d Hz, minimum bitrate %d, nominal %d, "
                    "maximum %d", channels, rate, min_br, nom_br, max_br);

            if (vorbis_encode_setup_managed (&s->vi, channels,
                        rate, max_br, nom_br, min_br))
                break;
        }
        else
        {
            if (nom_br < 0)
            {
                LOG_INFO3("Encoder initialising in VBR mode: %d channel(s), "
                        "%d Hz, quality %f", channels, rate, quality);
                if (min_br > 0 || max_br > 0)
                    LOG_INFO0("ignoring min/max bitrate, not supported in VBR "
                            "mode, use nominal-bitrate instead");
                if (vorbis_encode_setup_vbr(&s->vi, channels, rate, quality*0.1))
                    break;

#if 0
                if (max_br > 0 || min_br > 0)
                {
                    struct ovectl_ratemanage_arg ai;
                    if (vorbis_encode_ctl(&s->vi, OV_ECTL_RATEMANAGE_GET, &ai))
                        break;
                    ai.bitrate_hard_min = min_br;
                    ai.bitrate_hard_max = max_br;
                    ai.management_active = 1;
                    if (vorbis_encode_ctl(&s->vi, OV_ECTL_RATEMANAGE_SET, &ai))
                        break;
                }
#endif
            }
            else
            {
                LOG_INFO3("Encoder initialising in VBR mode: %d "
                        "channels, %d Hz, nominal %d", channels, rate, nom_br);
                if (vorbis_encode_setup_managed (&s->vi, channels,
                            rate, max_br, nom_br, max_br))
                    break;
                if (vorbis_encode_ctl (&s->vi, OV_ECTL_RATEMANAGE_SET, NULL))
                    break;
            }
        }
        if (vorbis_encode_setup_init(&s->vi))
            break;

        vorbis_analysis_init(&s->vd, &s->vi);
        vorbis_block_init(&s->vd, &s->vb);

        ogg_stream_init(&s->os, _get_serial());

        vorbis_analysis_headerout(&s->vd, vc, &h1,&h2,&h3);
        ogg_stream_packetin(&s->os, &h1);
        ogg_stream_packetin(&s->os, &h2);
        ogg_stream_packetin(&s->os, &h3);

        s->in_header = 1;
        s->samplerate = rate;
        s->samples_in_current_page = 0;
        s->prevgranulepos = 0;

        return s;
    } while (0);

    LOG_INFO0("Failed to configure encoder, verify settings");
    vorbis_info_clear(&s->vi);
    free (s);
    return NULL;
}