def simulate(self): elf = self.cc.output # run firmware = Firmware(elf) avr = Avr(mcu=self.cc.mcu, f_cpu=self.cc.f_cpu) avr.load_firmware(firmware) # udpReader = UdpReader() # udp = Udp(avr) # udp.connect() # udpReader.start() simvcd = None if self.vcd: simvcd = VcdFile(avr, period=1000, filename=self.vcd) connect_pins_by_rule(''' avr.D0 ==> vcd avr.D1 ==> vcd avr.D2 ==> vcd avr.D3 ==> vcd avr.D4 ==> vcd avr.D5 ==> vcd avr.D6 ==> vcd avr.D7 ==> vcd avr.B0 ==> vcd avr.B1 ==> vcd avr.B2 ==> vcd avr.B3 ==> vcd avr.B4 ==> vcd avr.B5 ==> vcd ''', dict( avr=avr, ), vcd=simvcd, ) simvcd.start() # not working # if self.serial_in: # avr.uart.send_string(self.serial_in) avr.move_time_marker(self.timespan) while avr.time_passed() < self.timespan * 0.99: time.sleep(0.05) if simvcd: simvcd.terminate() # udpReader.terminate() log.debug('cycles=%s' % avr.cycle) log.debug('mcu time=%s' % avr.time_passed()) # time.sleep(1) self.serial_data = avr.uart.buffer self.serial = ''.join(self.serial_data) avr.terminate()
def run_sim(vcdfile='lcd.vcd', speed=0.1, fps=20, timeout=0.0, visible=1, image_file=''): firmware = Firmware(path(__file__).dirname() / 'lcd.elf') avr = Avr(firmware, f_cpu=16000000) lcd = Lcd(avr) ledrow = LedRow(avr, size=7) # period=1000 -> vcd error vcd = VcdFile(avr, period=10, filename=vcdfile) def state_func(i): return (ledrow.pinstate(i), ledrow.reset_dirty(i)) led_game = LedRowGame(state_func=state_func, labels='D4 D5 D6 D7 RS E RW'.split() ) ac = Ac(avr) connect_pins_by_rule(''' avr.B0 <=> lcd.D4 -> vcd avr.B1 <=> lcd.D5 -> vcd avr.B2 <=> lcd.D6 -> vcd avr.B3 <=> lcd.D7 -> vcd avr.B4 ==> lcd.RS -> vcd avr.B5 ==> lcd.E -> vcd avr.B6 ==> lcd.RW -> vcd vcd <- ac.OUT -> avr.D2 lcd.D4 -> led.0 lcd.D5 -> led.1 lcd.D6 -> led.2 lcd.D7 -> led.3 lcd.RS -> led.4 lcd.E -> led.5 lcd.RW -> led.6 ''', dict( avr=avr, led=ledrow, lcd=lcd, ac=ac ), vcd=vcd, ) dev = CompositeGame([ CompositeGame( [LcdGame( lambda x, y:lcd.get_char(x, y), (20, 2)), led_game, ], align=1), InfoGame(avr), ]) scrshot_by_exit = [(dev, image_file)] if image_file else None AvrSimMain( avr, dev, vcd, speed=speed, fps=fps, visible=visible, timeout=timeout, scrshot_by_exit=scrshot_by_exit).run_game()
def connect_vcd(self): self.vcd = VcdFile(self.mcu, filename='out' + str(self.version)) connect_pins_by_rule(''' avr.D0 ==> vcd avr.D1 ==> vcd avr.D2 ==> vcd avr.D3 ==> vcd avr.D4 ==> vcd avr.D5 ==> vcd avr.D6 ==> vcd avr.D7 ==> vcd avr.B0 ==> vcd avr.B1 ==> vcd avr.B2 ==> vcd avr.B3 ==> vcd avr.B4 ==> vcd avr.B5 ==> vcd ''', dict(avr=self.mcu), vcd=self.vcd)
def run_sim(vcdfile='ledramp.vcd', speed=0.1, fps=20, timeout=0.0, visible=1, image_file=''): firmware = Firmware(path(__file__).dirname() / 'ledramp.elf') avr = Avr(firmware, f_cpu=8000000, mcu='atmega48') vcd = VcdFile(avr, period=1000, filename=vcdfile) ledrow = LedRow(avr) connect_pins_by_rule( ''' avr.B0 ==> led.0 -> vcd avr.B1 ==> led.1 -> vcd avr.B2 ==> led.2 -> vcd avr.B3 ==> led.3 -> vcd avr.B4 ==> led.4 -> vcd avr.B5 ==> led.5 -> vcd avr.B6 ==> led.6 -> vcd avr.B7 ==> led.7 -> vcd ''', dict( avr=avr, led=ledrow, ), vcd=vcd, ) def state_func(i): return (ledrow.pinstate(i), ledrow.reset_dirty(i)) led_game = LedRowGame(state_func=state_func, labels=['B' + str(x) for x in range(8)]) dev = CompositeGame([ led_game, InfoGame(avr), ]) scrshot_by_exit = [(dev, image_file)] if image_file else None AvrSimMain(avr, dev, vcd, speed=speed, fps=fps, visible=visible, timeout=timeout, scrshot_by_exit=scrshot_by_exit).run_game()
def run_sim(vcdfile='spk.vcd', speed=0.5, fps=20, timeout=0.0, visible=1, image_file='', rate=11025): firmware = Firmware(path(__file__).dirname() / 'spk.elf') avr = Avr( firmware=firmware, mcu="atmega168", f_cpu=16000000, ) ledrow = LedRow(avr, size=1) # period=1000 -> vcd error vcd = VcdFile(avr, period=10, filename=vcdfile) spk = Spk(avr, rate=rate, speed=speed) connect_pins_by_rule( ''' led.0 <-- avr.B5 --> spk.IN -> vcd ''', dict( avr=avr, spk=spk, led=ledrow, ), vcd=vcd, ) #################################### ) # GUI def spk_func(size): return spk.read() spk_game = SpkGame(spk_func, rate=rate) def state_func(i): return (ledrow.pinstate(i), ledrow.reset_dirty(i)) led_game = LedRowGame(state_func=state_func, labels=['SPK']) dev = CompositeGame([ CompositeGame([ led_game, ], align=1), InfoGame(avr), ]) scrshot_by_exit = [(dev, image_file)] if image_file else None AvrSimMain(avr, dev, vcd, speed=speed, fps=fps, visible=visible, timeout=timeout, scrshot_by_exit=scrshot_by_exit).run_game() spk_game.terminate()
def simulate(self): if not self.external_elf: elf = self.cc.output else: elf = self.external_elf # run firmware = Firmware(elf) avr = Avr(mcu=self.cc.mcu, f_cpu=self.cc.f_cpu) avr.uart.char_logger = self.serial_char_logger avr.uart.line_logger = self.serial_line_logger avr.load_firmware(firmware) # udpReader = UdpReader() # udp = Udp(avr) # udp.connect() # udpReader.start() simvcd = None if self.vcd: simvcd = VcdFile(avr, period=1000, filename=self.vcd) connect_pins_by_rule(''' avr.D0 ==> vcd avr.D1 ==> vcd avr.D2 ==> vcd avr.D3 ==> vcd avr.D4 ==> vcd avr.D5 ==> vcd avr.D6 ==> vcd avr.D7 ==> vcd avr.B0 ==> vcd avr.B1 ==> vcd avr.B2 ==> vcd avr.B3 ==> vcd avr.B4 ==> vcd avr.B5 ==> vcd ''', dict( avr=avr, ), vcd=simvcd, ) simvcd.start() # not working # if self.serial_in: # avr.uart.send_string(self.serial_in) if self.fps: dt_real = 1. / self.fps dt_mcu = dt_real * self.speed count = int(self.timespan * self.fps / self.speed) for _ in range(count): time.sleep(dt_real) avr.goto_time(self.timespan) while avr.time_passed() < self.timespan * 0.99: time.sleep(0.05) if simvcd: simvcd.terminate() # udpReader.terminate() log.debug('cycles=%s' % avr.cycle) log.debug('mcu time=%s' % avr.time_passed()) # time.sleep(1) self.serial_data = avr.uart.buffer self.serial = ''.join(self.serial_data) avr.terminate()
def simulate(self): if not self.external_elf: elf = self.cc.output else: elf = self.external_elf # run firmware = Firmware(elf) avr = Avr(mcu=self.cc.mcu, f_cpu=self.cc.f_cpu) avr.uart.char_logger = self.serial_char_logger avr.uart.line_logger = self.serial_line_logger avr.load_firmware(firmware) # udpReader = UdpReader() # udp = Udp(avr) # udp.connect() # udpReader.start() simvcd = None if self.vcd: simvcd = VcdFile(avr, period=1000, filename=self.vcd) connect_pins_by_rule( ''' avr.D0 ==> vcd avr.D1 ==> vcd avr.D2 ==> vcd avr.D3 ==> vcd avr.D4 ==> vcd avr.D5 ==> vcd avr.D6 ==> vcd avr.D7 ==> vcd avr.B0 ==> vcd avr.B1 ==> vcd avr.B2 ==> vcd avr.B3 ==> vcd avr.B4 ==> vcd avr.B5 ==> vcd ''', dict(avr=avr, ), vcd=simvcd, ) simvcd.start() # not working # if self.serial_in: # avr.uart.send_string(self.serial_in) if self.fps: dt_real = 1. / self.fps dt_mcu = dt_real * self.speed count = int(self.timespan * self.fps / self.speed) for _ in range(count): time.sleep(dt_real) avr.goto_time(self.timespan) while avr.time_passed() < self.timespan * 0.99: time.sleep(0.05) if simvcd: simvcd.terminate() # udpReader.terminate() log.debug('cycles=%s' % avr.cycle) log.debug('mcu time=%s' % avr.time_passed()) # time.sleep(1) self.serial_data = avr.uart.buffer self.serial = ''.join(self.serial_data) avr.terminate()
class Controller: def __init__(self, sock, mcu_name, freq=16000000, version=1): self.mcu_name = mcu_name self.mcu = Avr(mcu=mcu_name, f_cpu=freq) self.socket = sock self.fw_path = None self.version = version self.bind_callback_for_digit_pins(atmega_328_digit_pin_table) self.vcd = None self.connect_vcd() def upload_firmware(self, fw_path): self.fw_path = fw_path fw = Firmware(fw_path) self.mcu.load_firmware(fw) def connect_vcd(self): self.vcd = VcdFile(self.mcu, filename='out' + str(self.version)) connect_pins_by_rule(''' avr.D0 ==> vcd avr.D1 ==> vcd avr.D2 ==> vcd avr.D3 ==> vcd avr.D4 ==> vcd avr.D5 ==> vcd avr.D6 ==> vcd avr.D7 ==> vcd avr.B0 ==> vcd avr.B1 ==> vcd avr.B2 ==> vcd avr.B3 ==> vcd avr.B4 ==> vcd avr.B5 ==> vcd ''', dict(avr=self.mcu), vcd=self.vcd) def bind_callback_for_digit_pins(self, ports): def port_callback(irq, new_val): msg = "change " + self.mcu_name + ' ' + irq.name[ 0] + " " + irq.name[1] + " " + str(new_val) self.socket.send_msg(msg) callback = Mock(side_effect=port_callback) for port in ports: p = self.mcu.irq.ioport_register_notify(callback, (port[0], int(port[1:]))) p.get_irq().name = port def new_pin_val(self, port_pin, new_val): # type: ((str, int), int) -> None irq = self.mcu.irq.getioport(port_pin) avr_raise_irq(irq, new_val) def run(self): self.vcd.start() self.mcu.run() def pause(self): self.vcd.stop() self.mcu.pause() def terminate(self): if self.vcd: self.vcd.terminate() self.mcu.terminate()
def run_sim(vcdfile='sgm7.vcd', speed=0.001, fps=20, timeout=0.0, visible=1, image_file=''): firmware = Firmware(path(__file__).dirname() / 'sgm7.elf') firmware.f_cpu = 8000000 firmware.mcu = "atmega168" avr = Avr(firmware) vcd = VcdFile(avr, period=1000, filename=vcdfile) #################################################### # ledrow ledrow = LedRow(avr, size=12) #################################################### # ledrow game def state_func_seg(i): return (ledrow.pinstate(i), ledrow.reset_dirty(i)) led_game_seg = LedRowGame(state_func=state_func_seg, disp_size=8, labels=['B' + str(x) for x in range(8)]) def state_func_dig(i): return (ledrow.pinstate(i + 8), ledrow.reset_dirty(i + 8)) led_game_dig = LedRowGame(state_func=state_func_dig, disp_size=4, labels=['C' + str(x) for x in range(4)]) #################################################### # sgm7 sgm7 = Sgm7(avr, size=4) inv = [Inverter(avr) for x in range(4)] connect_pins_by_rule( ''' ledrow.0 <== avr.B0 ==> sgm7.A -> vcd ledrow.1 <== avr.B1 ==> sgm7.B -> vcd ledrow.2 <== avr.B2 ==> sgm7.C -> vcd ledrow.3 <== avr.B3 ==> sgm7.D -> vcd ledrow.4 <== avr.B4 ==> sgm7.E -> vcd ledrow.5 <== avr.B5 ==> sgm7.F -> vcd ledrow.6 <== avr.B6 ==> sgm7.G -> vcd ledrow.7 <== avr.B7 ==> sgm7.P -> vcd ledrow.8 <== avr.C0 ==> inv0.IN | inv0.OUT -> sgm7.D0 -> vcd ledrow.9 <== avr.C1 ==> inv1.IN | inv1.OUT -> sgm7.D1 -> vcd ledrow.10<== avr.C2 ==> inv2.IN | inv2.OUT -> sgm7.D2 -> vcd ledrow.11<== avr.C3 ==> inv3.IN | inv3.OUT -> sgm7.D3 -> vcd ''', dict( avr=avr, sgm7=sgm7, ledrow=ledrow, inv0=inv[0], inv1=inv[1], inv2=inv[2], inv3=inv[3], ), vcd=vcd, ) #################################################### # sgm7 game def segments_func(digit_index): return (sgm7.digit_segments(digit_index), sgm7.reset_dirty(digit_index)) sgm7_game = Sgm7Game(segments_func=segments_func, disp_size=4) #################################################### # compose game dev = CompositeGame([ CompositeGame([ sgm7_game, led_game_seg, led_game_dig, ], align=1), InfoGame(avr), ]) scrshot_by_exit = [(dev, image_file)] if image_file else None AvrSimMain(avr, dev, vcd, speed=speed, fps=fps, visible=visible, timeout=timeout, scrshot_by_exit=scrshot_by_exit).run_game()
def arduino_sim( elf='', mcu='atmega328', f_cpu=16000000, vcdfile='arduino.vcd', speed=0.5, fps=20, timeout=0.0, visible=1, image_file='', rate=11025, buttons_enable=1, vcd_enable=0, spk_enable=0, # udp_enable=1, avcc=5000, vcc=5000, code=None, ): ''' MCU: - atmega168 OK - atmega328p OK - atmega2560 NO - atmega1280 NO :param mcu: :param avcc: AVcc in mV :param vcc: Vcc in mV ''' if code and pyavrutils: cc = pyavrutils.Arduino() cc.build(code) elf = cc.output if not elf: elf = find_elf() firmware = Firmware(elf) avr = Avr(mcu=mcu, f_cpu=f_cpu, vcc=vcc / 1000.0, avcc=avcc / 1000.0) avr.load_firmware(firmware) # udpReader = UdpReader() # if udp_enable: # udp = Udp(avr) # udp.connect() # udpReader.start() lcd = Lcd(avr) vcd = VcdFile(avr, period=1000, filename=vcdfile) if vcd_enable else None ledrow = LedRow(avr, size=14) buttons = [Button(avr, pullup=0) for x in range(14)] if buttons_enable else 14 * [None] spk = Spk(avr, rate=rate, speed=speed) if spk_enable else None connect_pins_by_rule( ''' but0 .OUT ==> avr.D0 ==> dig.0 -> vcd but1 .OUT ==> avr.D1 ==> dig.1 -> vcd but2 .OUT ==> avr.D2 ==> dig.2 -> vcd but3 .OUT ==> avr.D3 ==> dig.3 -> vcd but4 .OUT ==> avr.D4 ==> dig.4 -> vcd but5 .OUT ==> avr.D5 ==> dig.5 -> vcd but6 .OUT ==> avr.D6 ==> dig.6 -> vcd but7 .OUT ==> avr.D7 ==> dig.7 -> vcd but8 .OUT ==> avr.B0 ==> dig.8 -> vcd but9 .OUT ==> avr.B1 ==> dig.9 -> vcd but10.OUT ==> avr.B2 ==> dig.10 -> vcd but11.OUT ==> avr.B3 ==> dig.11 -> vcd but12.OUT ==> avr.B4 ==> dig.12 -> vcd but13.OUT ==> avr.B5 ==> dig.13 -> vcd dig.13 --> spk.IN -> vcd dig.5 <=> lcd.D4 -> vcd dig.4 <=> lcd.D5 -> vcd dig.3 <=> lcd.D6 -> vcd dig.2 <=> lcd.D7 -> vcd dig.12 ==> lcd.RS -> vcd dig.11 ==> lcd.RW -> vcd dig.10 ==> lcd.E -> vcd ''', dict(avr=avr, dig=ledrow, lcd=lcd, spk=spk, **dict([('but' + str(i), b) for i, b in enumerate(buttons)])), vcd=vcd, ) ################# # GUI ################# if spk_enable: def spk_func(size): return spk.read() spk_game = SpkGame(spk_func, rate=rate) def state_func(i): return (ledrow.pinstate(i), ledrow.reset_dirty(i)) led_game = LedRowGame( state_func=state_func, labels=[str(x) for x in range(14)], align=1, ) but_guis = [ ButtonGame( label=label, shortcut=shortcut, hook=dict(up=x.up, down=x.down) if x else {}, size=(50, 30), ) for x, label, shortcut in zip( buttons, '0 1 2 3 4 5 6 7 8 9 10 11 12 13'.split(), '0 1 2 3 4 5 6 7 8 9 a b c d'.split(), ) ] info = InfoGame(avr) def reload_firmware(): firmware = Firmware(find_elf()) avr.load_firmware(firmware) lcd.reset() info.reload() class MyFloat(object): def __init__(self, value=0.0): self.value = value def __float__(self): return float(self.value) def inc(self): self.value *= 10.0 def dec(self): self.value /= 10.0 speed = MyFloat(speed) # def udp_read(): # if not hasattr(udp_read, 'display'): # udp_read.display = '' # if not hasattr(udp_read, 'lastline'): # udp_read.lastline = '' # s = udpReader.read() # if s: # sys.stdout.write(s) # udp_read.lastline += s # udp_read.lastline = lastline(udp_read.lastline) # udp_read.display = udp_read.lastline.replace( # '\n', '\\n').replace('\r', '\\r') # return udp_read.display def uart_read(): return avr.uart.last_line.replace('\n', '\\n').replace('\r', '\\r') dev = CompositeGame([ CompositeGame([ led_game, CompositeGame(but_guis, align=1), ], align=0), info, CompositeGame([ CompositeGame([ ButtonGame(label='reload', shortcut='r', hook=dict(down=reload_firmware)), ButtonGame( label='speed up', shortcut='+', hook=dict(down=speed.inc)), ButtonGame(label='speed down', shortcut='-', hook=dict(down=speed.dec)), TextGame((lambda: "speed set= %fx" % float(speed))), ], align=1), LcdGame(lambda x, y: lcd.get_char(x, y), (16, 2)), TextGame((lambda: 'ser=' + uart_read())), ], align=1) ]) scrshot_by_exit = [(dev, image_file)] if image_file else None class ArduinoMain(AvrSimMain): bufpos = 0 def cb_loop(self): AvrSimMain.cb_loop(self) # if len(udpReader.buffer) > self.bufpos: # sys.stdout.write(''.join(udpReader.buffer[self.bufpos:])) # self.bufpos = len(udpReader.buffer) sim = ArduinoMain(avr, dev, vcd, speed=speed, fps=fps, visible=visible, timeout=timeout, scrshot_by_exit=scrshot_by_exit) sim.run_game() time.sleep(1) if spk_enable: spk_game.terminate()