Commit abe27803 authored by jiangx's avatar jiangx

reactivated EMOS


git-svn-id: http://svn.eurecom.fr/openair4G/trunk@6734 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent 26e4747f
...@@ -369,7 +369,7 @@ int16_t get_target_ul_rx_power(module_id_t module_idP, uint8_t CC_id) { ...@@ -369,7 +369,7 @@ int16_t get_target_ul_rx_power(module_id_t module_idP, uint8_t CC_id) {
} }
#ifdef EMOS #ifdef EMOS
void phy_procedures_emos_eNB_TX(unsigned char next_slot, PHY_VARS_eNB *phy_vars_eNB) { void phy_procedures_emos_eNB_TX(unsigned char subframe, PHY_VARS_eNB *phy_vars_eNB) {
} }
#endif #endif
...@@ -482,7 +482,7 @@ void phy_procedures_emos_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eN ...@@ -482,7 +482,7 @@ void phy_procedures_emos_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eN
if (subframe==4) { if (subframe==4) {
emos_dump_eNB.timestamp = rt_get_time_ns(); emos_dump_eNB.timestamp = rt_get_time_ns();
emos_dump_eNB.frame_tx = phy_vars_eNB->proc[subframe].frame; emos_dump_eNB.frame_tx = phy_vars_eNB->proc[subframe].frame_rx;
emos_dump_eNB.rx_total_gain_dB = phy_vars_eNB->rx_total_gain_eNB_dB; emos_dump_eNB.rx_total_gain_dB = phy_vars_eNB->rx_total_gain_eNB_dB;
emos_dump_eNB.mimo_mode = phy_vars_eNB->transmission_mode[0]; emos_dump_eNB.mimo_mode = phy_vars_eNB->transmission_mode[0];
memcpy(&emos_dump_eNB.PHY_measurements_eNB, memcpy(&emos_dump_eNB.PHY_measurements_eNB,
...@@ -494,12 +494,12 @@ void phy_procedures_emos_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eN ...@@ -494,12 +494,12 @@ void phy_procedures_emos_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eN
//bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, "test", sizeof("test")); //bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, "test", sizeof("test"));
if (bytes!=sizeof(fifo_dump_emos_eNB)) { if (bytes!=sizeof(fifo_dump_emos_eNB)) {
LOG_W(PHY,"[eNB %d] Frame %d, subframe %d, Problem writing EMOS data to FIFO (bytes=%d, size=%d)\n", LOG_W(PHY,"[eNB %d] Frame %d, subframe %d, Problem writing EMOS data to FIFO (bytes=%d, size=%d)\n",
phy_vars_eNB->Mod_id,phy_vars_eNB->frame, subframe,bytes,sizeof(fifo_dump_emos_eNB)); phy_vars_eNB->Mod_id,phy_vars_eNB->proc[(subframe+1)%10].frame_rx, subframe,bytes,sizeof(fifo_dump_emos_eNB));
} }
else { else {
if (phy_vars_eNB->proc[(subframe+1)%10].frame_tx%100==0) { if (phy_vars_eNB->proc[(subframe+1)%10].frame_tx%100==0) {
LOG_I(PHY,"[eNB %d] Frame %d (%d), subframe %d, Writing %d bytes EMOS data to FIFO\n", LOG_I(PHY,"[eNB %d] Frame %d (%d), subframe %d, Writing %d bytes EMOS data to FIFO\n",
phy_vars_eNB->Mod_id,phy_vars_eNB->proc[(subframe+1)%10]->frame_tx, ((fifo_dump_emos_eNB*)&emos_dump_eNB)->frame_tx, subframe, bytes); phy_vars_eNB->Mod_id,phy_vars_eNB->proc[(subframe+1)%10].frame_rx, ((fifo_dump_emos_eNB*)&emos_dump_eNB)->frame_tx, subframe, bytes);
} }
} }
} }
...@@ -2399,7 +2399,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e ...@@ -2399,7 +2399,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
#ifdef EMOS #ifdef EMOS
phy_procedures_emos_eNB_TX(next_slot, phy_vars_eNB); phy_procedures_emos_eNB_TX(subframe, phy_vars_eNB);
#endif #endif
#ifndef EXMIMO #ifndef EXMIMO
......
...@@ -1589,7 +1589,7 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_ ...@@ -1589,7 +1589,7 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_
if (last_slot==0) { if (last_slot==0) {
emos_dump_UE.timestamp = rt_get_time_ns(); emos_dump_UE.timestamp = rt_get_time_ns();
emos_dump_UE.frame_rx = phy_vars_ue->frame; emos_dump_UE.frame_rx = phy_vars_ue->frame_rx;
emos_dump_UE.UE_mode = phy_vars_ue->UE_mode[eNB_id]; emos_dump_UE.UE_mode = phy_vars_ue->UE_mode[eNB_id];
emos_dump_UE.mimo_mode = phy_vars_ue->transmission_mode[eNB_id]; emos_dump_UE.mimo_mode = phy_vars_ue->transmission_mode[eNB_id];
emos_dump_UE.freq_offset = phy_vars_ue->lte_ue_common_vars.freq_offset; emos_dump_UE.freq_offset = phy_vars_ue->lte_ue_common_vars.freq_offset;
...@@ -1623,11 +1623,11 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_ ...@@ -1623,11 +1623,11 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t last_slot,uint8_
bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_UE, sizeof(fifo_dump_emos_UE)); bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_UE, sizeof(fifo_dump_emos_UE));
if (bytes!=sizeof(fifo_dump_emos_UE)) { if (bytes!=sizeof(fifo_dump_emos_UE)) {
LOG_W(PHY,"[UE %d] frame %d, slot %d, Problem writing EMOS data to FIFO\n",Mod_id,phy_vars_ue->frame, last_slot); LOG_W(PHY,"[UE %d] frame %d, slot %d, Problem writing EMOS data to FIFO\n",Mod_id,phy_vars_ue->frame_rx, last_slot);
} }
else { else {
if (phy_vars_ue->frame%100==0) { if (phy_vars_ue->frame_rx%100==0) {
LOG_I(PHY,"[UE %d] frame %d, slot %d, Writing %d bytes EMOS data to FIFO\n",Mod_id,phy_vars_ue->frame, last_slot, bytes); LOG_I(PHY,"[UE %d] frame %d, slot %d, Writing %d bytes EMOS data to FIFO\n",Mod_id,phy_vars_ue->frame_rx, last_slot, bytes);
} }
} }
} }
...@@ -3281,6 +3281,11 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst ...@@ -3281,6 +3281,11 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
} }
} }
} }
#ifdef EMOS
phy_procedures_emos_UE_RX(phy_vars_ue,slot_rx,eNB_id);
#endif
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
stop_meas(&phy_vars_ue->phy_proc_rx); stop_meas(&phy_vars_ue->phy_proc_rx);
return (0); return (0);
...@@ -3617,9 +3622,6 @@ void phy_UE_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold ...@@ -3617,9 +3622,6 @@ void phy_UE_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold
if (phy_procedures_RN_UE_RX(slot_rx, slot_tx, r_type) != 0 ) if (phy_procedures_RN_UE_RX(slot_rx, slot_tx, r_type) != 0 )
#endif #endif
phy_procedures_UE_RX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn); phy_procedures_UE_RX(phy_vars_ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn);
#ifdef EMOS
phy_procedures_emos_UE_RX(phy_vars_ue,slot_rx,eNB_id);
#endif
} }
if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx)==SF_S) && if ((subframe_select(&phy_vars_ue->lte_frame_parms,subframe_tx)==SF_S) &&
((slot_tx&1)==1)) { ((slot_tx&1)==1)) {
......
...@@ -65,6 +65,7 @@ static int hw_subframe; ...@@ -65,6 +65,7 @@ static int hw_subframe;
#ifdef EMOS #ifdef EMOS
#include <gps.h> #include <gps.h>
struct gps_fix_t dummy_gps_data;
#endif #endif
#include "PHY/types.h" #include "PHY/types.h"
...@@ -205,6 +206,7 @@ static pthread_t forms_thread; //xforms ...@@ -205,6 +206,7 @@ static pthread_t forms_thread; //xforms
#endif #endif
#ifdef EMOS #ifdef EMOS
static pthread_t thread3; //emos static pthread_t thread3; //emos
static pthread_t thread4; //GPS
#endif #endif
openair0_device openair0; openair0_device openair0;
...@@ -555,6 +557,73 @@ static void *scope_thread(void *arg) { ...@@ -555,6 +557,73 @@ static void *scope_thread(void *arg) {
#ifdef EMOS #ifdef EMOS
#define NO_ESTIMATES_DISK 100 //No. of estimates that are aquired before dumped to disk #define NO_ESTIMATES_DISK 100 //No. of estimates that are aquired before dumped to disk
void* gps_thread (void *arg)
{
struct gps_data_t gps_data;
struct gps_data_t *gps_data_ptr = &gps_data;
struct sched_param sched_param;
int ret;
sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO)+1;
sched_setscheduler(0, SCHED_FIFO,&sched_param);
printf("GPS thread has priority %d\n",sched_param.sched_priority);
memset(&dummy_gps_data,0,sizeof(struct gps_fix_t));
#if GPSD_API_MAJOR_VERSION>=5
ret = gps_open("127.0.0.1","2947",gps_data_ptr);
if (ret!=0)
#else
gps_data_ptr = gps_open("127.0.0.1","2947");
if (gps_data_ptr == NULL)
#endif
{
printf("[EMOS] Could not open GPS\n");
pthread_exit((void*)arg);
}
#if GPSD_API_MAJOR_VERSION>=4
else if (gps_stream(gps_data_ptr, WATCH_ENABLE,NULL) != 0)
#else
else if (gps_query(gps_data_ptr, "w+x") != 0)
#endif
{
printf("[EMOS] Error sending command to GPS\n");
pthread_exit((void*) arg);
}
else
printf("[EMOS] Opened GPS, gps_data=%p\n", gps_data_ptr);
while (!oai_exit)
{
printf("[EMOS] polling data from gps\n");
#if GPSD_API_MAJOR_VERSION>=5
if (gps_waiting(gps_data_ptr,500)) {
if (gps_read(gps_data_ptr) <= 0) {
#else
if (gps_waiting(gps_data_ptr)) {
if (gps_poll(gps_data_ptr) != 0) {
#endif
printf("[EMOS] problem polling data from gps\n");
}
else {
memcpy(&dummy_gps_data,&(gps_data_ptr->fix),sizeof(struct gps_fix_t));
printf("[EMOS] lat %g, lon %g\n",gps_data_ptr->fix.latitude,gps_data_ptr->fix.longitude);
}
} //gps_waiting
else {
printf("[EMOS] WARNING: No GPS data available, storing dummy packet\n");
}
//rt_sleep_ns(1000000000LL);
sleep(1);
} //oai_exit
pthread_exit((void*) arg);
}
void *emos_thread (void *arg) void *emos_thread (void *arg)
{ {
char c; char c;
...@@ -567,14 +636,11 @@ void *emos_thread (void *arg) ...@@ -567,14 +636,11 @@ void *emos_thread (void *arg)
time_t starttime_tmp; time_t starttime_tmp;
struct tm starttime; struct tm starttime;
int channel_buffer_size; int channel_buffer_size,ret;
time_t timer; time_t timer;
struct tm *now; struct tm *now;
struct gps_data_t *gps_data = NULL;
struct gps_fix_t dummy_gps_data;
struct sched_param sched_param; struct sched_param sched_param;
sched_param.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; sched_param.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
...@@ -585,27 +651,6 @@ void *emos_thread (void *arg) ...@@ -585,27 +651,6 @@ void *emos_thread (void *arg)
timer = time(NULL); timer = time(NULL);
now = localtime(&timer); now = localtime(&timer);
memset(&dummy_gps_data,1,sizeof(struct gps_fix_t));
gps_data = gps_open("127.0.0.1","2947");
if (gps_data == NULL)
{
printf("[EMOS] Could not open GPS\n");
//exit(-1);
}
#if GPSD_API_MAJOR_VERSION>=4
else if (gps_stream(gps_data, WATCH_ENABLE,NULL) != 0)
#else
else if (gps_query(gps_data, "w+x") != 0)
#endif
{
//sprintf(tmptxt,"Error sending command to GPS, gps_data = %x", gps_data);
printf("[EMOS] Error sending command to GPS\n");
//exit(-1);
}
else
printf("[EMOS] Opened GPS, gps_data=%p\n");
if (UE_flag==0) if (UE_flag==0)
channel_buffer_size = sizeof(fifo_dump_emos_eNB); channel_buffer_size = sizeof(fifo_dump_emos_eNB);
else else
...@@ -642,13 +687,22 @@ void *emos_thread (void *arg) ...@@ -642,13 +687,22 @@ void *emos_thread (void *arg)
} }
printf("[EMOS] starting dump, channel_buffer_size=%d ...\n",channel_buffer_size); printf("[EMOS] starting dump, channel_buffer_size=%d, fifo %d\n",channel_buffer_size,fifo);
while (!oai_exit) while (!oai_exit)
{ {
/*
bytes = rtf_read_timed(fifo, fifo2file_ptr, channel_buffer_size,100); bytes = rtf_read_timed(fifo, fifo2file_ptr, channel_buffer_size,100);
if (bytes==0) if (bytes==0)
continue; continue;
*/
bytes = rtf_read_all_at_once(fifo, fifo2file_ptr, channel_buffer_size);
if (bytes<=0) {
usleep(100);
continue;
}
if (bytes != channel_buffer_size) {
printf("[EMOS] ERROR! Only got %d bytes instead of %d!\n",bytes,channel_buffer_size);
}
/* /*
if (UE_flag==0) if (UE_flag==0)
printf("eNB: count %d, frame %d, read: %d bytes from the fifo\n",counter, ((fifo_dump_emos_eNB*)fifo2file_ptr)->frame_tx,bytes); printf("eNB: count %d, frame %d, read: %d bytes from the fifo\n",counter, ((fifo_dump_emos_eNB*)fifo2file_ptr)->frame_tx,bytes);
...@@ -679,31 +733,14 @@ void *emos_thread (void *arg) ...@@ -679,31 +733,14 @@ void *emos_thread (void *arg)
fprintf(stderr, "[EMOS] Error writing to dumpfile\n"); fprintf(stderr, "[EMOS] Error writing to dumpfile\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (gps_data)
{ if (fwrite(&dummy_gps_data, sizeof(char), sizeof(struct gps_fix_t), dumpfile_id) != sizeof(struct gps_fix_t))
if (gps_poll(gps_data) != 0) {
printf("[EMOS] problem polling data from gps\n");
}
else {
printf("[EMOS] lat %g, lon %g\n",gps_data->fix.latitude,gps_data->fix.longitude);
}
if (fwrite(&(gps_data->fix), sizeof(char), sizeof(struct gps_fix_t), dumpfile_id) != sizeof(struct gps_fix_t))
{
printf("[EMOS] Error writing to dumpfile, stopping recording\n");
exit(EXIT_FAILURE);
}
}
else
{
printf("[EMOS] WARNING: No GPS data available, storing dummy packet\n");
if (fwrite(&(dummy_gps_data), sizeof(char), sizeof(struct gps_fix_t), dumpfile_id) != sizeof(struct gps_fix_t))
{ {
printf("[EMOS] Error writing to dumpfile, stopping recording\n"); printf("[EMOS] Error writing to dumpfile, stopping recording\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }
} }
}
free(fifo2file_buffer); free(fifo2file_buffer);
fclose(dumpfile_id); fclose(dumpfile_id);
...@@ -2756,6 +2793,8 @@ int main(int argc, char **argv) { ...@@ -2756,6 +2793,8 @@ int main(int argc, char **argv) {
#ifdef EMOS #ifdef EMOS
ret = pthread_create(&thread3, NULL, emos_thread, NULL); ret = pthread_create(&thread3, NULL, emos_thread, NULL);
printf("EMOS thread created, ret=%d\n",ret); printf("EMOS thread created, ret=%d\n",ret);
ret = pthread_create(&thread4, NULL, gps_thread, NULL);
printf("GPS thread created, ret=%d\n",ret);
#endif #endif
rt_sleep_ns(10*FRAME_PERIOD); rt_sleep_ns(10*FRAME_PERIOD);
...@@ -2938,6 +2977,9 @@ int main(int argc, char **argv) { ...@@ -2938,6 +2977,9 @@ int main(int argc, char **argv) {
printf("waiting for EMOS thread\n"); printf("waiting for EMOS thread\n");
pthread_cancel(thread3); pthread_cancel(thread3);
pthread_join(thread3,&status); pthread_join(thread3,&status);
printf("waiting for GPS thread\n");
pthread_cancel(thread4);
pthread_join(thread4,&status);
#endif #endif
#ifdef EMOS #ifdef EMOS
......
...@@ -312,7 +312,7 @@ static void *UE_thread_synch(void *arg) { ...@@ -312,7 +312,7 @@ static void *UE_thread_synch(void *arg) {
} // mutex_lock } // mutex_lock
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH,1); vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SYNCH,1);
printf("Sync_mode %d\n",sync_mode); //printf("Sync_mode %d\n",sync_mode);
switch (sync_mode) { switch (sync_mode) {
case pss: case pss:
...@@ -640,7 +640,7 @@ static void *UE_thread_rx(void *arg) { ...@@ -640,7 +640,7 @@ static void *UE_thread_rx(void *arg) {
UE->instance_cnt_rx=-1; UE->instance_cnt_rx=-1;
#ifdef RTAI #ifdef RTAI
task = rt_task_init_schmod(nam2num("UE Thread RX"), 0, 0, 0, SCHED_FIFO, 0xF); task = rt_task_init_schmod(nam2num("UE RX Thread"), 0, 0, 0, SCHED_FIFO, 0xF);
if (task==NULL) { if (task==NULL) {
LOG_E(PHY,"[SCHED][UE] Problem starting UE RX thread!!!!\n"); LOG_E(PHY,"[SCHED][UE] Problem starting UE RX thread!!!!\n");
return 0; return 0;
...@@ -1343,13 +1343,13 @@ void *UE_thread(void *arg) { ...@@ -1343,13 +1343,13 @@ void *UE_thread(void *arg) {
// wait until we can lock mutex_synch // wait until we can lock mutex_synch
printf("Locking mutex_synch (UE_thread)\n"); //printf("Locking mutex_synch (UE_thread)\n");
if (pthread_mutex_lock(&UE->mutex_synch) != 0) { if (pthread_mutex_lock(&UE->mutex_synch) != 0) {
LOG_E(PHY,"[SCHED][UE] error locking mutex for UE initial synch thread\n"); LOG_E(PHY,"[SCHED][UE] error locking mutex for UE initial synch thread\n");
exit_fun("noting to add"); exit_fun("noting to add");
} }
else { else {
printf("Before getting frame IC %d (UE_thread)\n",UE->instance_cnt_synch); //printf("Before getting frame IC %d (UE_thread)\n",UE->instance_cnt_synch);
if (UE->instance_cnt_synch < 0) { if (UE->instance_cnt_synch < 0) {
wait_sync_cnt=0; wait_sync_cnt=0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment