static void start_sync(void) { int rxlev = -128; int i, dist = 0; char dist_str[32] = ""; arfcn = 0xffff; for (i = 0; i <= 1023; i++) { if ((pm[i].flags & INFO_FLG_PM) && !(pm[i].flags & INFO_FLG_SYNC)) { if (pm[i].rxlev > rxlev) { rxlev = pm[i].rxlev; arfcn = i; } } } /* if GPS becomes valid, like after exitting a tunnel */ if (!pm_gps_valid && g.valid) { pm_gps_valid = 1; geo2space(&pm_gps_x, &pm_gps_y, &pm_gps_z, g.longitude, g.latitude); } if (pm_gps_valid && g.valid) { double x, y, z; geo2space(&x, &y, &z, g.longitude, g.latitude); dist = distinspace(pm_gps_x, pm_gps_y, pm_gps_z, x, y, z); sprintf(dist_str, " dist %d", (int)dist); } if (dist > MAX_DIST || arfcn == 0xffff || rxlev < min_rxlev) { memset(pm, 0, sizeof(pm)); pm_index = 0; sync_count = 0; start_pm(); return; } pm[arfcn].flags |= INFO_FLG_SYNC; LOGP(DSUM, LOGL_INFO, "Sync ARFCN %d (rxlev %d, %d syncs " "left)%s\n", arfcn, pm[arfcn].rxlev, sync_count--, dist_str); memset(&sysinfo, 0, sizeof(sysinfo)); sysinfo.arfcn = arfcn; state = SCAN_STATE_SYNC; l1ctl_tx_reset_req(ms, L1CTL_RES_T_FULL); l1ctl_tx_fbsb_req(ms, arfcn, L1CTL_FBSB_F_FB01SB, 100, 0, CCCH_MODE_NONE); }
static int signal_cb(unsigned int subsys, unsigned int signal, void *handler_data, void *signal_data) { struct osmocom_ms *ms; if (subsys != SS_L1CTL) return 0; switch (signal) { case S_L1CTL_RESET: ms = signal_data; layer3_app_reset(); return l1ctl_tx_fbsb_req(ms, ms->test_arfcn, L1CTL_FBSB_F_FB01SB, 100, 0, CCCH_MODE_NONE); break; } return 0; }
static int signal_cb(unsigned int subsys, unsigned int signal, void *handler_data, void *signal_data) { struct osmocom_ms *ms; if (subsys != SS_L1CTL) return 0; switch (signal) { case S_L1CTL_RESET: case S_L1CTL_FBSB_ERR: ms = g_ms; return l1ctl_tx_fbsb_req(ms, ms->test_arfcn, L1CTL_FBSB_F_FB01SB, 100, 0, CCCH_MODE_COMBINED); case S_L1CTL_FBSB_RESP: return 0; } return 0; }
/* start to scan for one ARFCN */ static int _cinfo_start_arfcn(unsigned int band_arfcn) { int rc; /* ask L1 to try to tune to new ARFCN */ /* FIXME: decode band */ rc = l1ctl_tx_fbsb_req(fps.ms, band_arfcn, L1CTL_FBSB_F_FB01SB, 100, 0, CCCH_MODE_COMBINED); if (rc < 0) return rc; /* allocate new cell info structure */ fps.cur_cell = cell_info_alloc(); fps.cur_arfcn = band_arfcn; fps.cur_cell->band_arfcn = band_arfcn; /* FIXME: start timer in case we never get a sync */ fps.state = BSCAN_S_WAIT_DATA; osmo_timer_schedule(&fps.timer, 2, 0); return 0; }