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