diff --git a/Development/FortiusANT CreateWindowsExecutable.bat b/Development/FortiusANT CreateWindowsExecutable.bat index a7dd033c..4b5cb91e 100644 --- a/Development/FortiusANT CreateWindowsExecutable.bat +++ b/Development/FortiusANT CreateWindowsExecutable.bat @@ -1,3 +1,6 @@ +@echo pyinstaller is documented: https://pyinstaller.readthedocs.io/en/stable/ +@echo the .exe is "unpacked" into C:\Users\%username%\AppData\Local\Temp + cd ..\pythoncode del dist\FortiusANT.exe pyinstaller --clean MakeFortiusANT.spec diff --git a/StartUp/ExplorAnt (simulate).bat b/StartUp/ExplorAnt (simulate).bat new file mode 100644 index 00000000..7295b99b --- /dev/null +++ b/StartUp/ExplorAnt (simulate).bat @@ -0,0 +1,2 @@ +..\pythoncode\ExplorAnt.py -d127 -s -H12345 +pause \ No newline at end of file diff --git a/WindowsExecutable/FortiusANT.exe b/WindowsExecutable/FortiusANT.exe index 81f56e31..ad76bdb1 100644 Binary files a/WindowsExecutable/FortiusANT.exe and b/WindowsExecutable/FortiusANT.exe differ diff --git a/pythoncode/FortiusAntCommand.py b/pythoncode/FortiusAntCommand.py index 2777e16f..7a5e8fd9 100644 --- a/pythoncode/FortiusAntCommand.py +++ b/pythoncode/FortiusAntCommand.py @@ -1,7 +1,10 @@ #------------------------------------------------------------------------------- # Version info #------------------------------------------------------------------------------- -__version__ = "2021-04-13" +__version__ = "2021-12-02" +# 2021-12-02 default command line value for HRM was False, changed to None +# HRM=0 has another meaning than "HRM not specified" +# same applied to all other integer command-line variables # 2021-04-13 added: mph # 2021-04-13 If AntRequired and self.antDeviceID == -1, a message is given # 2021-03-24 changed: command line help + validation @@ -205,12 +208,12 @@ def __init__(self): parser.add_argument('-b', dest='ble', help=constants.help_b, required=False, action='store_true') else: pass # If -b is requested but not available, then an error is appropriate - parser.add_argument ('-B', dest='DeviceNumberBase', metavar='0...65535', help=constants.help_B, required=False, default=False, type=int) - parser.add_argument ('-c', dest='CalibrateRR', metavar='0...100', help=constants.help_c, required=False, default=False, type=int) + parser.add_argument ('-B', dest='DeviceNumberBase', metavar='0...65535', help=constants.help_B, required=False, default=None, type=int) + parser.add_argument ('-c', dest='CalibrateRR', metavar='0...100', help=constants.help_c, required=False, default=None, type=int) # parser.add_argument ('-C', dest='CtrlCommand', metavar='ANT+DeviceID', help=constants.help_C, required=False, default=False, type=int) parser.add_argument ('-C', dest='CtrlCommand', metavar='ANT+DeviceID', help=argparse.SUPPRESS, required=False, default=False, type=int) - parser.add_argument ('-d', dest='debug', metavar='0...255', help=constants.help_d, required=False, default=False, type=int) - parser.add_argument ('-D', dest='antDeviceID', metavar='USB-DeviceID', help=constants.help_D, required=False, default=False, type=int) + parser.add_argument ('-d', dest='debug', metavar='0...255', help=constants.help_d, required=False, default=None, type=int) + parser.add_argument ('-D', dest='antDeviceID', metavar='USB-DeviceID', help=constants.help_D, required=False, default=None, type=int) parser.add_argument ('-e', dest='homeTrainer', help=constants.help_e, required=False, action='store_true') # -h help!! if UseGui: @@ -218,7 +221,7 @@ def __init__(self): else: parser.add_argument('-g', dest='g_IgnoredIfDefined', help=argparse.SUPPRESS, required=False, action='store_true') parser.add_argument ('-G', dest='GradeAdjust', metavar='% / % / %', help=constants.help_G, required=False, default=False) - parser.add_argument ('-H', dest='hrm', metavar='ANT+DeviceID', help=constants.help_H, required=False, default=False, type=int) + parser.add_argument ('-H', dest='hrm', metavar='ANT+DeviceID', help=constants.help_H, required=False, default=None, type=int) parser.add_argument ('-i', dest='imperial', help=constants.help_i, required=False, action='store_true') if UseGui or OnRaspberry: parser.add_argument('-l', dest='StatusLeds', help=constants.help_l, required=False, action='store_true') @@ -235,12 +238,12 @@ def __init__(self): parser.add_argument('-O', dest='OutputDisplay', metavar='see text', help=constants.help_O, required=False, default=False) else: parser.add_argument('-O', dest='O_IgnoredIfDefined', help=argparse.SUPPRESS, required=False, default=False) - parser.add_argument ('-p', dest='factor', metavar='%', help=constants.help_p, required=False, default=False, type=int) + parser.add_argument ('-p', dest='factor', metavar='%', help=constants.help_p, required=False, default=None, type=int) parser.add_argument ('-P', dest='PowerMode', help=constants.help_P, required=False, action='store_true') parser.add_argument ('-r', dest='Resistance', help=constants.help_r, required=False, action='store_true') parser.add_argument ('-R', dest='Runoff', metavar='see text', help=constants.help_R, required=False, default=False) parser.add_argument ('-s', dest='simulate', help=constants.help_s, required=False, action='store_true') -#scs parser.add_argument ('-S', dest='scs', metavar='ANT+ DeviceID',help=constants.help_S, required=False, default=False, type=int) +#scs parser.add_argument ('-S', dest='scs', metavar='ANT+ DeviceID',help=constants.help_S, required=False, default=None, type=int) parser.add_argument ('-T', dest='Transmission', metavar='see text', help=constants.help_T, required=False, default=False) self.ant_tacx_models = ['Bushido', 'Genius', 'Vortex', 'Magneticbrake', 'Motorbrake'] parser.add_argument ('-t', dest='TacxType', help=constants.help_t, required=False, default=False, \ @@ -331,7 +334,7 @@ def __init__(self): #----------------------------------------------------------------------- # Get DeviceNumberBase #----------------------------------------------------------------------- - if self.args.DeviceNumberBase: + if self.args.DeviceNumberBase != None: try: self.DeviceNumberBase = int(self.args.DeviceNumberBase) except: @@ -342,7 +345,7 @@ def __init__(self): # Not limitted to a range here, because can be different for different # types of brakes, although initially only used for Magnetic Brake #----------------------------------------------------------------------- - if self.args.CalibrateRR: + if self.args.CalibrateRR != None: try: self.CalibrateRR = float(self.args.CalibrateRR.replace(',', '.')) except: @@ -434,7 +437,7 @@ def __init__(self): #----------------------------------------------------------------------- # Get debug-flags, used in debug module #----------------------------------------------------------------------- - if self.args.debug: + if self.args.debug != None: try: self.debug = int(self.args.debug) except: @@ -443,7 +446,7 @@ def __init__(self): #----------------------------------------------------------------------- # Get antDeviceID #----------------------------------------------------------------------- - if self.args.antDeviceID: + if self.args.antDeviceID != None: try: self.antDeviceID = int(self.args.antDeviceID) except: @@ -457,7 +460,10 @@ def __init__(self): # - next: pair with the defined ANT+ HRM monitor # the number can be found with ExplorANT #----------------------------------------------------------------------- - if self.args.hrm: + # 2021-12-02 False==0 and therefore False is a bad default if zero is + # a valid value. Therefore default changed to None + #----------------------------------------------------------------------- + if self.args.hrm != None: try: self.hrm = int(self.args.hrm) except: @@ -470,7 +476,7 @@ def __init__(self): # - next: pair with the defined ANT+ SCS # the number can be found with ExplorANT #----------------------------------------------------------------------- -#scs if self.args.scs: +#scs if self.args.scs != None: #scs try: #scs self.scs = int(self.args.scs) #scs except: @@ -479,7 +485,7 @@ def __init__(self): #----------------------------------------------------------------------- # Get powerfactor #----------------------------------------------------------------------- - if self.args.factor: + if self.args.factor != None: try: self.PowerFactor = int(self.args.factor) / 100 # I would expect +/- 15% would be enough for compensation, but @@ -650,48 +656,47 @@ def __init__(self): def print(self): try: v = self.debug # Verbose: print all command-line variables with values - if self.autostart: logfile.Console("-a") - if self.PedalStrokeAnalysis:logfile.Console("-A") - if self.ble: logfile.Console("-b") - if v or self.args.DeviceNumberBase: logfile.Console("-B %s" % self.DeviceNumberBase ) - if v or self.args.CalibrateRR: logfile.Console("-c %s" % self.CalibrateRR ) + if self.autostart: logfile.Console("-a") + if self.PedalStrokeAnalysis: logfile.Console("-A") + if self.ble: logfile.Console("-b") + if v or self.args.DeviceNumberBase != None: logfile.Console("-B %s" % self.DeviceNumberBase ) + if v or self.args.CalibrateRR != None: logfile.Console("-c %s" % self.CalibrateRR ) if v or self.CTRL_SerialL or self.CTRL_SerialR: logfile.Console("-C %s/%s" % (self.CTRL_SerialL, self.CTRL_SerialR ) ) - if v or self.args.debug: logfile.Console("-d %s (%s)" % (self.debug, bin(self.debug) ) ) - if v or self.args.antDeviceID: logfile.Console("-D %s" % self.antDeviceID ) + if v or self.args.debug != None: logfile.Console("-d %s (%s)" % (self.debug, bin(self.debug) ) ) + if v or self.args.antDeviceID != None: logfile.Console("-D %s" % self.antDeviceID ) if v or self.args.GradeAdjust: - if self.GradeAdjust == 1: logfile.Console("-G defines Grade = antGrade * %s" \ - % (self.GradeFactor ) ) - if self.GradeAdjust == 2: logfile.Console("-G defines Grade = antGrade * %s [* %s (downhill)]" \ - % (self.GradeFactor, self.GradeFactorDH) ) - if self.GradeAdjust == 3: logfile.Console("-G defines Grade = (antGrade - %s) * %s [* %s (downhill)]" \ - % (self.GradeShift, self.GradeFactor, self.GradeFactorDH) ) - if self.gui: logfile.Console("-g") - if self.homeTrainer: logfile.Console("-e") - if v or self.args.hrm: logfile.Console("-H %s" % self.hrm ) - if self.StatusLeds: logfile.Console("-l") + if self.GradeAdjust == 1: logfile.Console("-G defines Grade = antGrade * %s" \ + % (self.GradeFactor ) ) + if self.GradeAdjust == 2: logfile.Console("-G defines Grade = antGrade * %s [* %s (downhill)]" \ + % (self.GradeFactor, self.GradeFactorDH) ) + if self.GradeAdjust == 3: logfile.Console("-G defines Grade = (antGrade - %s) * %s [* %s (downhill)]" \ + % (self.GradeShift, self.GradeFactor, self.GradeFactorDH) ) + if self.gui: logfile.Console("-g") + if self.homeTrainer: logfile.Console("-e") + if v or self.args.hrm != None: logfile.Console("-H %s" % self.hrm ) + if self.StatusLeds: logfile.Console("-l") if OnRaspberry and (v or self.args.gpioLayout): logfile.Console("-L %s/%s/%s/%s/%s/%s" % (self.rpiButton, self.rpiTacx, self.rpiShutdown, self.rpiCadence, self.rpiBLE, self.rpiANT) ) - if self.manual: logfile.Console("-m") - if self.manualGrade: logfile.Console("-M") - if self.imperial: logfile.Console("-i") - if not self.args.calibrate: logfile.Console("-n") - if v or self.args.factor: logfile.Console("-p %s" % self.PowerFactor ) - if v or self.args.OutputDisplay: logfile.Console("-O %s" % self.OutputDisplay) - if self.args.PowerMode: logfile.Console("-P") - if self.args.Resistance: logfile.Console("-r") - if v or self.args.Runoff: logfile.Console("-R defines Runoff: maxSpeed=%s dip=%s minSpeed=%s targetTime=%s power=%s" % \ + if self.manual: logfile.Console("-m") + if self.manualGrade: logfile.Console("-M") + if self.imperial: logfile.Console("-i") + if not self.args.calibrate: logfile.Console("-n") + if v or self.args.factor != None: logfile.Console("-p %s" % self.PowerFactor ) + if v or self.args.OutputDisplay: logfile.Console("-O %s" % self.OutputDisplay) + if self.args.PowerMode: logfile.Console("-P") + if self.args.Resistance: logfile.Console("-r") + if v or self.args.Runoff: logfile.Console("-R defines Runoff: maxSpeed=%s dip=%s minSpeed=%s targetTime=%s power=%s" % \ (self.RunoffMaxSpeed, self.RunoffDip, self.RunoffMinSpeed, self.RunoffTime, self.RunoffPower) ) - if self.args.simulate: logfile.Console("-s") -#scs if v or self.args.scs: logfile.Console("-S %s" % self.scs ) - if v or self.args.TacxType: logfile.Console("-t %s" % self.TacxType) -# if v or self.args.Transmission != constants.Transmission: + if self.args.simulate: logfile.Console("-s") +#scs if v or self.args.scs != None: logfile.Console("-S %s" % self.scs ) + if v or self.args.TacxType: logfile.Console("-t %s" % self.TacxType) if v or self.args.Transmission: - logfile.Console('-T %s x %s (start=%sx%s)' % \ + logfile.Console('-T %s x %s (start=%sx%s)' % \ (self.Cranckset, self.Cassette, \ self.Cranckset[self.CrancksetStart], \ self.Cassette [self.CassetteStart]) ) - if self.exportTCX: logfile.Console("-x") + if self.exportTCX: logfile.Console("-x") except: pass # May occur when incorrect command line parameters, error already given before diff --git a/pythoncode/FortiusAntGui.py b/pythoncode/FortiusAntGui.py index 2d6d172a..62e7e76a 100644 --- a/pythoncode/FortiusAntGui.py +++ b/pythoncode/FortiusAntGui.py @@ -1,7 +1,9 @@ #------------------------------------------------------------------------------- # Version info #------------------------------------------------------------------------------- -__version__ = "2021-04-22" +__version__ = "2022-01-04" +# 2022-01-04 text-fields on top of other controls were flickering, because +# the parent was not the on-top control #353 # 2021-04-22 centre() done when all controls created # 2021-04-13 clv.imperial: speed in mph # 2021-04-12 Status leds are fixed part of GUI, clv.StatusLeds is for Raspberry only @@ -168,7 +170,7 @@ def __init__(self, parent, pclv): self.panel = self # Controls directly on the frame window # ---------------------------------------------------------------------- - # Save Command Line Variables in tge GUI-context + # Save Command Line Variables in the GUI-context # ---------------------------------------------------------------------- self.clv = pclv @@ -503,21 +505,21 @@ def __init__(self, parent, pclv): _TextCtrlW2 = int(SpeedWH/2) # ---------------------------------------------------------------------- - # self.Speed label & text; speed in km/h or mph + # self.Speed value; speed in km/h or mph (On top of self.Speed) # ---------------------------------------------------------------------- self.txtSpeed = wx.TextCtrl(self.Speed, value="99.9", size=(int(TextCtrlW * 1.2),TextCtrlH), style=wx.TE_CENTER | wx.TE_READONLY | wx.BORDER_NONE) self.txtSpeed.SetBackgroundColour(bg) self.txtSpeed.SetPosition(((self.Speed.Width - self.txtSpeed.MinWidth) / 2, self.Speed.Height - self.txtSpeed.MinHeight)) # ---------------------------------------------------------------------- - # self.Revs + # self.Revs value; (On top of self.Revs) # ---------------------------------------------------------------------- self.txtRevs = wx.TextCtrl(self.Revs, value="999/min", size=(int(TextCtrlW * 1.2),TextCtrlH), style=wx.TE_CENTER | wx.TE_READONLY | wx.BORDER_NONE) self.txtRevs.SetBackgroundColour(bg) self.txtRevs.SetPosition(((self.Revs.Width - self.txtRevs.MinWidth) / 2, self.Revs.Height - self.txtRevs.MinHeight)) # ---------------------------------------------------------------------- - # self.Power + # self.Power values; (On top of self.Power) # ---------------------------------------------------------------------- self.txtPower = wx.TextCtrl(self.Power, value="999 Watt", size=(TextCtrlW,TextCtrlH), style=wx.TE_CENTER | wx.TE_READONLY | wx.BORDER_NONE) self.txtPower.SetBackgroundColour(bg) diff --git a/pythoncode/FortiusAntTitle.py b/pythoncode/FortiusAntTitle.py index 2442fc21..3ed35121 100644 --- a/pythoncode/FortiusAntTitle.py +++ b/pythoncode/FortiusAntTitle.py @@ -1,17 +1,18 @@ #------------------------------------------------------------------------------- # Version info #------------------------------------------------------------------------------- -WindowTitle = "Fortius Antifier v6.2" # Double quotes, see below! -# 2020-03-23 Version 6.2 Leds also for GUI, Raspberry TFT display -# 2020-03-17 Version 6.1 Vortex Quality Improvement -# 2020-03-17 Version 6.0 major change: Raspberry integrated! -# 2020-01-25 Version 5.2 Issues #189, #216, #222 -# 2020-01-21 Version 5.1 Published +WindowTitle = "Fortius Antifier v6.3" # Double quotes, see below! +# 2022-01-04 Version 6.3 Issues 340, 342, 353 implemented +# 2021-03-23 Version 6.2 Leds also for GUI, Raspberry TFT display +# 2021-03-17 Version 6.1 Vortex Quality Improvement +# 2021-03-17 Version 6.0 major change: Raspberry integrated! +# 2021-01-25 Version 5.2 Issues #189, #216, #222 +# 2021-01-21 Version 5.1 Published # settings can be modified interactively # #120 font/rear changing # #195 power changing from headunit -# 2020-01-04 master branch (5.0) merged into 4.2 Quality upgrade branch -# 2020-01-04 Version 5.0 #117 Tacx Bushido and #101 Genius implemented +# 2021-01-04 master branch (5.0) merged into 4.2 Quality upgrade branch +# 2021-01-04 Version 5.0 #117 Tacx Bushido and #101 Genius implemented # 2020-12-20 Version 4.2 #173 Version 4.0 Communicates Much Higher Power vs. 3.8 # #184 Power in Rouvy issue # 2020-12-20 Version 4.1.1 #137 Improvements for Raspberry PI diff --git a/pythoncode/antDongle.py b/pythoncode/antDongle.py index 795ae6ec..e2bc3fdc 100644 --- a/pythoncode/antDongle.py +++ b/pythoncode/antDongle.py @@ -1,7 +1,15 @@ #--------------------------------------------------------------------------- # Version info #--------------------------------------------------------------------------- -__version__ = "2021-04-15" +__version__ = "2021-12-03" +# 2021-12-03 When pairing, TransmissionType must be zero (TransmissionType_Pairing) +# this became apparent when using another make of HRM, returning +# a TransmissionType=207, not being found using TransmissionType_IC. +# When using Garmin HRM, there was not problem. +# This is applied to SlaveHRM_ChannelConfig (and SCS, Trainer). +# It's not applied to for VTX, GNS, VTU, since cannot be tested, +# avoiding to cause side-effects. +# Most likely, those devices always match the used TransmissionType. # 2021-04-15 flush improved, #286 # 2021-04-01 DongleReconnected WAS initially True but should be False # (Although the field should only be used when AntDongle.OK = True) @@ -355,6 +363,9 @@ def DeviceNumberBase(base): DeviceTypeID_VHU = 0x3e # Thanks again to TotalReverse # /~https://github.com/WouterJD/FortiusANT/issues/46#issuecomment-616838329 +TransmissionType_Pairing= 0 # See ANT+ HRM Device Profile D00000693 5.1 + # See ANT+ FE-C Device Profile D00001231 7.1 + # See ANT+ FE-C Device Profile D00001163 7.1.1 TransmissionType_IC = 0x01 # 5.2.3.1 Transmission Type TransmissionType_IC_GDP = 0x05 # 0x01 = Independant Channel # 0x04 = Global datapages used @@ -844,7 +855,7 @@ def SlaveTrainer_ChannelConfig(self, DeviceNumber): if debug.on(debug.Data1): logfile.Write ("SlaveTrainer_ChannelConfig()") messages=[ msg42_AssignChannel (channel_FE_s, ChannelType_BidirectionalReceive, NetworkNumber=0x00), - msg51_ChannelID (channel_FE_s, DeviceNumber, DeviceTypeID_FE, TransmissionType_IC_GDP), + msg51_ChannelID (channel_FE_s, DeviceNumber, DeviceTypeID_FE, TransmissionType_Pairing), msg45_ChannelRfFrequency (channel_FE_s, RfFrequency_2457Mhz), msg43_ChannelPeriod (channel_FE_s, ChannelPeriod=8192), # 4 Hz msg60_ChannelTransmitPower (channel_FE_s, TransmitPower_0dBm), @@ -875,9 +886,11 @@ def SlaveHRM_ChannelConfig(self, DeviceNumber): if self.ConfigMsg: logfile.Console ('FortiusANT receives data from an ANT+ Heart Rate Monitor (HRM display)' + s) if debug.on(debug.Data1): logfile.Write ("SlaveHRM_ChannelConfig()") + + # 2021-12-03 Pairing must be done with TransmissionType=TransmissionType_Pairing (0)!! messages=[ msg42_AssignChannel (channel_HRM_s, ChannelType_BidirectionalReceive, NetworkNumber=0x00), - msg51_ChannelID (channel_HRM_s, DeviceNumber, DeviceTypeID_HRM, TransmissionType_IC), + msg51_ChannelID (channel_HRM_s, DeviceNumber, DeviceTypeID_HRM, TransmissionType_Pairing), msg45_ChannelRfFrequency (channel_HRM_s, RfFrequency_2457Mhz), msg43_ChannelPeriod (channel_HRM_s, ChannelPeriod=8070), # 4,06 Hz msg60_ChannelTransmitPower (channel_HRM_s, TransmitPower_0dBm), @@ -925,7 +938,7 @@ def SlaveSCS_ChannelConfig(self, DeviceNumber): if debug.on(debug.Data1): logfile.Write ("SlaveSCS_ChannelConfig()") messages=[ msg42_AssignChannel (channel_SCS_s, ChannelType_BidirectionalReceive, NetworkNumber=0x00), - msg51_ChannelID (channel_SCS_s, DeviceNumber, DeviceTypeID_SCS, TransmissionType_IC), + msg51_ChannelID (channel_SCS_s, DeviceNumber, DeviceTypeID_SCS, TransmissionType_Pairing), msg45_ChannelRfFrequency (channel_SCS_s, RfFrequency_2457Mhz), msg43_ChannelPeriod (channel_SCS_s, ChannelPeriod=8086), # 4,05 Hz msg60_ChannelTransmitPower (channel_SCS_s, TransmitPower_0dBm), diff --git a/pythoncode/usbTrainer.py b/pythoncode/usbTrainer.py index f9582d78..9c87dd8c 100644 --- a/pythoncode/usbTrainer.py +++ b/pythoncode/usbTrainer.py @@ -1,7 +1,9 @@ #------------------------------------------------------------------------------- # Version info #------------------------------------------------------------------------------- -__version__ = "2021-04-29" +__version__ = "2021-11-15" +# 2021-11-15 "Steering axis = " commented code added for investigation +# 2021-05-18 TargetResistanceFT used in logfile (instead of TargetResistance) # 2021-04-29 Short message warning message comment added for Raspberry # 2021-04-20 DisplayStateTable() added, for raspberry status display # Operational attribute added @@ -3227,9 +3229,11 @@ def _ReceiveFromTrainer(self): self.Wheel2Speed() self.CurrentResistance2Power() + # print('Steering axis = ', self.Axis) # To investigate steering behaviour + if debug.on(debug.Function): logfile.Write ("ReceiveFromTrainer() = hr=%s Buttons=%s Cadence=%s Speed=%s TargetRes=%s CurrentRes=%s CurrentPower=%s, pe=%s hdr=%s %s" % \ - ( self.HeartRate, self.Buttons, self.Cadence, self.SpeedKmh, self.TargetResistance, self.CurrentResistance, self.CurrentPower, self.PedalEcho, hex(self.Header), self.Message) \ + ( self.HeartRate, self.Buttons, self.Cadence, self.SpeedKmh, self.TargetResistanceFT, self.CurrentResistance, self.CurrentPower, self.PedalEcho, hex(self.Header), self.Message) \ ) #--------------------------------------------------------------------------- # R e c e i v e F r o m T r a i n e r diff --git a/raspberry/Edit Wifi Configuration.sh b/raspberry/Edit Wifi Configuration.sh new file mode 100644 index 00000000..d9c497a7 --- /dev/null +++ b/raspberry/Edit Wifi Configuration.sh @@ -0,0 +1 @@ +sudo nano /etc/wpa_supplicant/wpa_supplicant.conf \ No newline at end of file