• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""Python module for Spectracom/Orolia GSG-6 GNSS simulator."""
2
3from acts.controllers import abstract_inst
4
5
6class GSG6Error(abstract_inst.SocketInstrumentError):
7    """GSG-6 Instrument Error Class."""
8
9
10class GSG6(abstract_inst.SocketInstrument):
11    """GSG-6 Class, inherted from abstract_inst SocketInstrument."""
12
13    def __init__(self, ip_addr, ip_port):
14        """Init method for GSG-6.
15
16        Args:
17            ip_addr: IP Address.
18                Type, str.
19            ip_port: TCPIP Port.
20                Type, str.
21        """
22        super(GSG6, self).__init__(ip_addr, ip_port)
23
24        self.idn = ''
25
26    def connect(self):
27        """Init and Connect to GSG-6."""
28        self._connect_socket()
29
30        self.get_idn()
31
32        infmsg = 'Connected to GSG-6, with ID: {}'.format(self.idn)
33        self._logger.debug(infmsg)
34
35    def close(self):
36        """Close GSG-6."""
37        self._close_socket()
38
39        self._logger.debug('Closed connection to GSG-6')
40
41    def get_idn(self):
42        """Get the Idenification of GSG-6.
43
44        Returns:
45            GSG-6 Identifier
46        """
47        self.idn = self._query('*IDN?')
48
49        return self.idn
50
51    def start_scenario(self, scenario=''):
52        """Start to run scenario.
53
54        Args:
55            scenario: Scenario to run.
56                Type, str.
57                Default, '', which will run current selected one.
58        """
59        if scenario:
60            cmd = 'SOUR:SCEN:LOAD ' + scenario
61            self._send(cmd)
62
63        self._send('SOUR:SCEN:CONT START')
64
65        if scenario:
66            infmsg = 'Started running scenario {}'.format(scenario)
67        else:
68            infmsg = 'Started running current scenario'
69
70        self._logger.debug(infmsg)
71
72    def stop_scenario(self):
73        """Stop the running scenario."""
74
75        self._send('SOUR:SCEN:CONT STOP')
76
77        self._logger.debug('Stopped running scenario')
78
79    def preset(self):
80        """Preset GSG-6 to default status."""
81        self._send('*RST')
82
83        self._logger.debug('Reset GSG-6')
84
85    def set_power(self, power_level):
86        """set GSG-6 transmit power on all bands.
87
88        Args:
89            power_level: transmit power level
90                Type, float.
91                Decimal, unit [dBm]
92
93        Raises:
94            GSG6Error: raise when power level is not in [-160, -65] range.
95        """
96        if not -160 <= power_level <= -65:
97            errmsg = ('"power_level" must be within [-160, -65], '
98                      'current input is {}').format(str(power_level))
99            raise GSG6Error(error=errmsg, command='set_power')
100
101        self._send(':SOUR:POW ' + str(round(power_level, 1)))
102
103        infmsg = 'Set GSG-6 transmit power to "{}"'.format(round(
104            power_level, 1))
105        self._logger.debug(infmsg)
106
107    def get_nmealog(self):
108        """Get GSG6 NMEA data.
109
110        Returns:
111            GSG6's NMEA data
112        """
113        nmea_data = self._query('SOUR:SCEN:LOG?')
114
115        return nmea_data
116
117    def toggle_scenario_power(self,
118                              toggle_onoff='ON',
119                              sat_id='',
120                              sat_system=''):
121        """Toggle ON OFF scenario.
122
123        Args:
124            toggle_onoff: turn on or off the satellites
125                Type, str. Option ON/OFF
126                Default, 'ON'
127            sat_id: satellite identifiers
128                Type, str.
129                Option 'Gxx/Rxx/Exx/Cxx/Jxx/Ixx/Sxxx'
130                where xx is satellite identifiers no.
131                e.g.: G10
132            sat_system: to toggle On/OFF for all Satellites
133                Type, str
134                Option [GPS, GLO, GAL, BDS, QZSS, IRNSS, SBAS]
135        Raises:
136            GSG6Error: raise when toggle is not set.
137        """
138        if not sat_id and not sat_system:
139            self._send(':SOUR:SCEN:POW ' + str(toggle_onoff))
140            infmsg = 'Set GSG-6 Power to "{}"'.format(toggle_onoff)
141            self._logger.debug(infmsg)
142
143        elif sat_id and not sat_system:
144            self._send(':SOUR:SCEN:POW ' + str(sat_id) + ',' +
145                       str(toggle_onoff))
146            infmsg = ('Set GSG-6 Power to "{}" for "{}" satellite '
147                      'identifiers').format(toggle_onoff, sat_id)
148            self._logger.debug(infmsg)
149
150        elif not sat_id and sat_system:
151            self._send(':SOUR:SCEN:POW ' + str(sat_system) + ',' +
152                       str(toggle_onoff))
153            infmsg = 'Set GSG-6 Power to "{}" for "{}" satellite system'.format(
154                toggle_onoff, sat_system)
155            self._logger.debug(infmsg)
156
157        else:
158            errmsg = ('"toggle power" must have either of these value [ON/OFF],'
159                      ' current input is {}').format(str(toggle_onoff))
160            raise GSG6Error(error=errmsg, command='toggle_scenario_power')
161
162    def set_scenario_power(self,
163                           power_level,
164                           sat_id='',
165                           sat_system='',
166                           freq_band=''):
167        """Set dynamic power for the running scenario.
168
169        Args:
170            power_level: transmit power level
171                Type, float.
172                Decimal, unit [dBm]
173            sat_id: set power level for specific satellite identifiers
174                Type, str. Option
175                'Gxx/Rxx/Exx/Cxx/Jxx/Ixx/Sxxx'
176                where xx is satellite identifiers number
177                e.g.: G10
178            sat_system: to set power level for all Satellites
179                Type, str
180                Option [GPS, GLO, GAL, BDS, QZSS, IRNSS, SBAS]
181            freq_band: Frequency band to set the power level
182                Type, str
183                Option  [L1, L2, L5, ALL]
184                Default, '', assumed to be L1.
185        Raises:
186            GSG6Error: raise when power level is not in [-160, -65] range.
187        """
188        if freq_band == 'ALL':
189            if not -100 <= power_level <= 100:
190                errmsg = ('"power_level" must be within [-100, 100], for '
191                          '"freq_band"="ALL", current input is {}').format(
192                              str(power_level))
193                raise GSG6Error(error=errmsg, command='set_scenario_power')
194        else:
195            if not -160 <= power_level <= -65:
196                errmsg = ('"power_level" must be within [-160, -65], for '
197                          '"freq_band" != "ALL", current input is {}').format(
198                              str(power_level))
199                raise GSG6Error(error=errmsg, command='set_scenario_power')
200
201        if sat_id and not sat_system:
202            self._send(':SOUR:SCEN:POW ' + str(sat_id) + ',' +
203                       str(round(power_level, 1)) + ',' + str(freq_band))
204            infmsg = ('Set GSG-6 transmit power to "{}" for "{}" '
205                      'satellite id').format(round(power_level, 1), sat_id)
206            self._logger.debug(infmsg)
207
208        elif not sat_id and sat_system:
209            self._send(':SOUR:SCEN:POW ' + str(sat_system) + ',' +
210                       str(round(power_level, 1)) + ',' + str(freq_band))
211            infmsg = ('Set GSG-6 transmit power to "{}" for "{}" '
212                      'satellite system').format(round(power_level, 1),
213                                                 sat_system)
214            self._logger.debug(infmsg)
215
216        else:
217            errmsg = ('sat_id or sat_system must have value, current input of '
218                      'sat_id {} and sat_system {}').format(sat_id, sat_system)
219            raise GSG6Error(error=errmsg, command='set_scenario_power')
220