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 } }
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; }