array(), 'selected' => array()); $nmealist['options'][0] = gettext('All'); $nmealist['options'][1] = gettext('RMC'); $nmealist['options'][2] = gettext('GGA'); $nmealist['options'][4] = gettext('GLL'); $nmealist['options'][8] = gettext('ZDA or ZDG'); if (!$pconfig['nmea']) { array_push($nmealist['selected'], 0); } foreach ($nmealist['options'] as $val => $opt) { if ($pconfig['nmea'] & $val) { array_push($nmealist['selected'], $val); } } return($nmealist); } $pconfig = &$config['ntpd']['gps']; $pgtitle = array(gettext("Services"), gettext("NTP"), gettext("Serial GPS")); $shortcut_section = "ntp"; include("head.inc"); $tab_array = array(); $tab_array[] = array(gettext("Settings"), false, "services_ntpd.php"); $tab_array[] = array(gettext("ACLs"), false, "services_ntpd_acls.php"); $tab_array[] = array(gettext("Serial GPS"), true, "services_ntpd_gps.php"); $tab_array[] = array(gettext("PPS"), false, "services_ntpd_pps.php"); display_top_tabs($tab_array); $form = new Form; $section = new Form_Section('NTP Serial GPS Configuration'); $section->addInput(new Form_StaticText( 'Notes', 'A GPS connected via a serial port may be used as a reference clock for NTP. If the GPS also supports PPS and is properly configured, ' . 'and connected, that GPS may also be used as a Pulse Per Second clock reference. NOTE: A USB GPS may work, but is not recommended due to USB bus timing issues.' . '
' . 'For the best results, NTP should have at least three sources of time. So it is best to configure at least 2 servers under ' . 'Services > NTP > Settings' . ' to minimize clock drift if the GPS data is not valid over time. Otherwise ntpd may only use values from the unsynchronized local clock when providing time to clients.' )); $gpstypes = array(gettext('Custom'), gettext('Default'), 'Generic', 'Garmin', 'MediaTek', 'SiRF', 'U-Blox', 'SureGPS'); $section->addInput(new Form_Select( 'gpstype', 'GPS Type', $pconfig['type'], array_combine($gpstypes, $gpstypes) ))->setHelp('This option allows a predefined configuration to be selected. ' . 'Default is the configuration of pfSense 2.1 and earlier (not recommended). Select Generic if the GPS is not listed.' . '

' . 'The predefined configurations assume the GPS has already been set to NMEA mode.'); $serialports = glob("/dev/cua?[0-9]{,.[0-9]}", GLOB_BRACE); if (!empty($serialports)) { $splist = array(); foreach ($serialports as $port) { $shortport = substr($port, 5); $splist[$shortport] = $shortport; } $section->addInput(new Form_Select( 'gpsport', 'Serial Port', $pconfig['port'], ['' => gettext('None')] + $splist ))->setHelp('All serial ports are listed, be sure to pick the port with the GPS attached. '); $section->addInput(new Form_Select( 'gpsspeed', null, $pconfig['speed'], [0 => '4800', 16 => '9600', 32 => '19200', 48 => '38400', 64 => '57600', 80 => '115200'] ))->setHelp('A higher baud rate is generally only helpful if the GPS is sending too many sentences. ' . 'It is recommended to configure the GPS to send only one sentence at a baud rate of 4800 or 9600.'); } $nmealist = build_nmea_list(); $section->addInput(new Form_Select( 'gpsnmea', 'NMEA Sentences', $nmealist['selected'], $nmealist['options'], true ))->setHelp('By default NTP will listen for all supported NMEA sentences. One or more sentences to listen for may be specified.'); $section->addInput(new Form_Input( 'gpsfudge1', 'Fudge Time 1', 'text', $pconfig['fudge1'] ))->setHelp('Fudge time 1 is used to specify the GPS PPS signal offset (default: 0.0).'); $section->addInput(new Form_Input( 'gpsfudge2', 'Fudge Time 2', 'text', $pconfig['fudge2'] ))->setHelp('Fudge time 2 is used to specify the GPS time offset (default: 0.0).'); $section->addInput(new Form_Input( 'gpsstratum', 'Stratum (0-16)', 'text', $pconfig['stratum'] ))->setHelp('This may be used to change the GPS Clock stratum (default: 0). This may be useful to, for some reason, have ntpd prefer a different clock.'); $section->addInput(new Form_Checkbox( 'gpsprefer', 'Flags', 'Prefer this clock (default: checked).', !$pconfig['prefer'] )); $section->addInput(new Form_Checkbox( 'gpsnoselect', null, 'Do not use this clock, display for reference only (default: unchecked).', $pconfig['noselect'] )); $section->addInput(new Form_Checkbox( 'gpsflag1', null, 'Enable PPS signal processing (default: checked).', $pconfig['flag1'] )); $section->addInput(new Form_Checkbox( 'gpsflag2', null, 'Enable falling edge PPS signal processing (default: unchecked, rising edge).', $pconfig['flag2'] )); $section->addInput(new Form_Checkbox( 'gpsflag3', null, 'Enable kernel PPS clock discipline (default: checked).', $pconfig['flag3'] )); $section->addInput(new Form_Checkbox( 'gpsflag4', null, 'Obscure location in timestamp (default: unchecked, unobscured).', $pconfig['flag4'] )); $section->addInput(new Form_Checkbox( 'gpssubsec', null, 'Log the sub-second fraction of the received time stamp (default: unchecked, not logged).', $pconfig['subsec'] ))->setHelp('Enabling this will rapidly fill the log, but is useful for tuning Fudge time 2.'); $section->addInput(new Form_Input( 'gpsrefid', 'Clock ID', 'text', $pconfig['refid'], ['placeholder' => '1 to 4 characters'] ))->setHelp('This may be used to change the GPS Clock ID (default: GPS).'); // Statistics logging section $btnadv = new Form_Button( 'btnadvgps', 'Display Advanced', null, 'fa-cog' ); $btnadv->setAttribute('type','button')->addClass('btn-info btn-sm'); $section->addInput(new Form_StaticText( 'GPS Initialization', $btnadv )); $section->addInput(new Form_Textarea( 'gpsinitcmd', null, base64_decode($pconfig['initcmd']) ))->setHelp('Commands entered here will be sent to the GPS during initialization. Please read and understand the GPS documentation before making any changes here.'); $group = new Form_Group('NMEA Checksum Calculator'); $group->add(new Form_Input( 'nmeastring', null )); $btncalc = new Form_Button( 'btncalc', 'Calculate', null, 'fa-calculator' ); $btncalc->setAttribute('type','button')->removeClass('btn-primary')->addClass('btn-success btn-sm'); $group->add($btncalc); $group->add(new Form_Input( 'result', null, 'text', null, ['placeholder' => 'Result'] )); $group->setHelp('Enter the text between "$" and "*" of a NMEA command string:'); $group->addClass('calculator'); $section->add($group); $form->add($section); print($form); ?>