====== quadricone zurich noservo py ====== import subprocess, glob, time, csv, random ''' some naming clarifications: Servo is a class for motors, where movement is defined Servos is a dictionary of servo names and positions servo is used in the while loop to refer to an item of the Servos dictionary ''' ### the moving part ------------------- class Servo: def __init__(self, servoID): self.servoID=servoID self.startPos() # when initiated, go to zero def move(self, position): self.position=position print self.servoID, "\'s given position is", self.position if (10 <= self.position <= 120): print "everything OK, will write", self.position elif 120 < self.position < 170: print "will adjust to 160", self.position self.position=160 elif self.position > 170: print "MAX", self.servoID, "is in maximum position" self.position=180 print "MAX: Servo will now go to", self.position elif self.position<10: print "MIN", self.servoID, "is in minimum position" self.position=0 print "MIN: Servo will now go to", self.position else: print "how did this happen?" def startPos(self): self.move(0) ## initiate the morots and put them all in the start (0) position ## alternative Servos={"raja":0, "gaja":0, "vlaja":0, "zlaja":0} for i,servo in enumerate(Servos): globals()[servo]=Servo(i+1) globals()[servo].startPos() #key_pos=[0, 0, 0, 0] ### the scanning part ----------------- # airodump-ng is running and logging the results into a csv file # with the following command: sudo airodump-ng -o csv -w manuf mon0 # subprocess looks for the last edited csv file in current folder # this file is parsed by the csv module to find the number of data packets that have passed through the network since the last check csvs=subprocess.Popen("ls -t1 *csv | head -1", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) csv_last=csvs.communicate()[0].strip() key_value=(' # IV') # look up this value in the scan dump def lookup(dump): datas=[] results=[] scan=open(dump, "rU") next(scan) scanDict=csv.DictReader((line.replace('\0','') for line in scan), delimiter=',') for adict in scanDict: if adict.has_key(key_value) and adict.get(key_value)!=None: try: datas.append(int(adict.get(key_value))) except: pass datas.sort(reverse=True) for i in range(4): results.append(datas[i]) return results ### the main loop ---------------------- packet_list=lookup(csv_last) print 'packet_list', packet_list #random.shuffle(servo_list) #print 'servo_list', servo_list time.sleep(3) while True: new_packet_list=lookup(csv_last) print "//////////////////////" print "..." print 'new_packet_list', new_packet_list print 'calculating the movements...' print "starting key positions: ", Servos for i,servo in enumerate(Servos): print "i!!!!i!!!!i!!!!!" print 'servo:', servo pos=Servos.get(servo) packet_diff=new_packet_list[i]-packet_list[i] print 'packet_diff:', packet_diff if packet_diff==0: new_pos=pos-10 print 'go down', new_pos globals()[servo].move(new_pos) time.sleep(0.2) if new_pos<0: Servos[servo]=0 else: Servos[servo]=new_pos elif 12 > packet_diff >= 1: new_pos=Servos.get(servo)+5 if new_pos < 10: new_pos=10 print 'go up very small', new_pos globals()[servo].move(new_pos) time.sleep(0.2) Servos[servo]=new_pos # update key position for the next round elif 36 > packet_diff >= 12: new_pos=Servos.get(servo)+8 if new_pos < 10: new_pos=10 print 'go up small', new_pos globals()[servo].move(new_pos) time.sleep(0.2) Servos[servo]=new_pos # update key position for the next round elif 80 > packet_diff >= 36: new_pos=Servos.get(servo)+10 print 'go up middle', new_pos globals()[servo].move(new_pos) time.sleep(0.2) Servos[servo]=new_pos # update key position for the next round elif 180 > packet_diff >= 80: new_pos=Servos.get(servo)+20 print 'go up big', new_pos globals()[servo].move(new_pos) time.sleep(0.2) if new_pos > 180: Servos[servo]=180 else: Servos[servo]=new_pos # update key position for the next round elif packet_diff >= 180: new_pos=Servos.get(servo)+50 print 'go up very big', new_pos globals()[servo].move(new_pos) time.sleep(0.2) if new_pos > 180: Servos[servo]=180 else: Servos[servo]=new_pos # update key position for the next round else: print 'key_pos:', Servos.get(servo) , 'packet_diff:', packet_diff, 'and i am out of options' print "!!!!!!!!!!!!!!!!!!!!" print "new list of key pos", Servos packet_list=new_packet_list # update packet list time.sleep(10)