summaryrefslogtreecommitdiff
path: root/mcast/client/satlists.c
blob: 6dccb3956b2ca324a18f5aaf370f408ba66adf35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 * (c) BayCom GmbH, http://www.baycom.de, info@baycom.de
 *
 * See the COPYING file for copyright information and
 * how to reach the author.
 *
 */

#include "headers.h"

int satellite_find_by_diseqc (satellite_reference_t * ref, recv_sec_t *sec, struct dvb_frontend_parameters *fep, int mode)
{
	int i, j, k, l;
	netceiver_info_list_t *nc_list=nc_get_list();
	char buf[6];
	memcpy(buf,"\xe0\x10\x6f\x0\x0\x0",6);
	int freq = fep->frequency/1000;
	int ret=0;
	int explicit_position=NO_SAT_POS;

	if (sec->diseqc_cmd.msg_len > 6 || !ref || !freq) {
		return 0;
	}

	for (l = 0; l < nc_list->nci_num; l++) {
		netceiver_info_t *nci = nc_list->nci + l;

		for (i = 0; i < nci->sat_list_num; i++) {
			satellite_list_t *sat_list = nci->sat_list + i;

			for (j = 0; j < sat_list->sat_num; j++) {
				satellite_info_t *sat = sat_list->sat + j;

				for (k = 0; k < sat->comp_num; k++) {
					satellite_component_t *comp = sat->comp + k;
					int oldpos=sat->SatPos^1800;
					int newpos=(sec->diseqc_cmd.msg[3]+(sec->diseqc_cmd.msg[4]<<8))^1800;
					// prepare synthetic messsage from satpos and pol./volt.
					buf[3]=oldpos;
					buf[4]=oldpos>>8;
					buf[5]=(comp->Polarisation&1)<<1 | !(comp->sec.tone_mode&1);
					dbg("compare: old/new %i/%i, %02x %02x %02x %02x %02x %02x <-> %02x %02x %02x %02x %02x %02x\n", oldpos, newpos,
					     buf[0]&0xff,buf[1]&0xff,buf[2]&0xff,buf[3]&0xff, buf[4]&0xff, buf[5]&0xff,
					     sec->diseqc_cmd.msg[0], sec->diseqc_cmd.msg[1], sec->diseqc_cmd.msg[2],
					     sec->diseqc_cmd.msg[3], sec->diseqc_cmd.msg[4], sec->diseqc_cmd.msg[5]);

					dbg("%i mode %i, len %i, %i > %i , %i < %i, %i < %i, %i > %i\n",sat->type,
					     mode, sec->diseqc_cmd.msg_len, freq,  comp->RangeMin, freq, comp->RangeMax,
					     sat->SatPosMin, newpos ,  sat->SatPosMax, newpos);

					// Check if coded sat pos matches
					if ((sat->type==SAT_SRC_LNB || sat->type==SAT_SRC_UNI)  && mode == 0 &&  sec->diseqc_cmd.msg_len>0 && 
					    (freq >= comp->RangeMin) && (freq <= comp->RangeMax) && 
					    !memcmp (buf, &sec->diseqc_cmd.msg, sec->diseqc_cmd.msg_len)) {
						dbg("Satpos MATCH\n");
						ret=1;
					}
					// check for rotor
					else if (sat->type==SAT_SRC_ROTOR && mode == 0 &&  sec->diseqc_cmd.msg_len>0 && 
						 (freq >= comp->RangeMin) && (freq <= comp->RangeMax) &&
						 (buf[5]==sec->diseqc_cmd.msg[5]) &&
						 (sat->SatPosMin<=newpos && sat->SatPosMax>=newpos)) {
						dbg("ROTOR MATCH %i\n",newpos);
						explicit_position=newpos;
						ret=1;						
					}
					// check if given diseqc matches raw tuner diseqc
					else if (mode == 1 && sec->diseqc_cmd.msg_len>0 && !memcmp (&comp->sec.diseqc_cmd.msg, &sec->diseqc_cmd.msg, sec->diseqc_cmd.msg_len)) {
						dbg("Diseqc 1.0 Match  %02x %02x %02x %02x %02x %02x\n",
						       comp->sec.diseqc_cmd.msg[0], comp->sec.diseqc_cmd.msg[1], comp->sec.diseqc_cmd.msg[2],
						       comp->sec.diseqc_cmd.msg[3], comp->sec.diseqc_cmd.msg[4], comp->sec.diseqc_cmd.msg[5]);
						ret=1;
					}else if (mode == 2 && (fe_sec_voltage_t)comp->Polarisation == sec->voltage && comp->sec.tone_mode== sec->tone_mode && comp->sec.mini_cmd == sec->mini_cmd) {
						dbg("Legacy Match, pol %i, tone %i, cmd %i\n",comp->Polarisation,comp->sec.tone_mode,comp->sec.mini_cmd);
						ret=1;
					}
					if (ret) {
						ref->netceiver = l;
						ref->sat_list = i;
						ref->sat = j;
						ref->comp = k;
						ref->position=explicit_position;
						info("Sat found: %d %d %d  %d, rotor %d\n",l,i,j,k, explicit_position);
						return ret;
					}
				}
			}
		}
	}
	return ret;
}

int satellite_get_pos_by_ref (satellite_reference_t * ref)
{
	netceiver_info_list_t *nc_list=nc_get_list();
	netceiver_info_t *nci = nc_list->nci + ref->netceiver;
	satellite_list_t *sat_list = nci->sat_list + ref->sat_list;
	satellite_info_t *sat = sat_list->sat + ref->sat;
	if (sat->type==SAT_SRC_ROTOR && ref->position!=NO_SAT_POS) {
		return ref->position;
	}
	return sat->SatPos;
}

int satellite_get_lof_by_ref (satellite_reference_t * ref)
{
	netceiver_info_list_t *nc_list=nc_get_list();
	netceiver_info_t *nci = nc_list->nci + ref->netceiver;
	satellite_list_t *sat_list = nci->sat_list + ref->sat_list;
	satellite_info_t *sat = sat_list->sat + ref->sat;
	satellite_component_t *comp = sat->comp + ref->comp;
	return comp->LOF;
}

recv_sec_t *satellite_find_sec_by_ref (satellite_reference_t * ref)
{
	netceiver_info_list_t *nc_list=nc_get_list();
	netceiver_info_t *nci = nc_list->nci + ref->netceiver;
	satellite_list_t *sat_list = nci->sat_list + ref->sat_list;
	satellite_info_t *sat = sat_list->sat + ref->sat;
	satellite_component_t *comp = sat->comp + ref->comp;
	return &comp->sec;
}

polarisation_t satellite_find_pol_by_ref (satellite_reference_t * ref)
{
	netceiver_info_list_t *nc_list=nc_get_list();
	netceiver_info_t *nci = nc_list->nci + ref->netceiver;
	satellite_list_t *sat_list = nci->sat_list + ref->sat_list;
	satellite_info_t *sat = sat_list->sat + ref->sat;
	satellite_component_t *comp = sat->comp + ref->comp;
	return comp->Polarisation;
}