1 // 2 // Copyright (c) 2010-2018 Antmicro 3 // Copyright (c) 2011-2015 Realtime Embedded 4 // 5 // This file is licensed under the MIT License. 6 // Full license text is available in 'licenses/MIT.txt'. 7 // 8 using System; 9 using System.Collections.Generic; 10 using Antmicro.Renode.Core; 11 using Antmicro.Renode.Logging; 12 using Antmicro.Renode.Peripherals.Bus; 13 using System.Linq; 14 15 namespace Antmicro.Renode.Peripherals.Input 16 { 17 public class AntMouse : IDoubleWordPeripheral 18 { AntMouse()19 public AntMouse() 20 { 21 IRQ = new GPIO(); 22 } 23 ReadDoubleWord(long offset)24 public uint ReadDoubleWord(long offset) 25 { 26 switch((Registers)offset) 27 { 28 case Registers.X: 29 return (uint)x; 30 case Registers.Y: 31 return (uint)y; 32 case Registers.LeftButton: 33 return leftButton ? 1u : 0u; 34 default: 35 this.LogUnhandledRead(offset); 36 return 0; 37 } 38 } 39 40 public GPIO IRQ { get; private set; } 41 WriteDoubleWord(long offset, uint value)42 public void WriteDoubleWord(long offset, uint value) 43 { 44 switch((Registers)offset) 45 { 46 case Registers.InterruptHandled: 47 IRQ.Unset(); 48 return; 49 } 50 this.LogUnhandledWrite(offset, value); 51 } 52 Reset()53 public void Reset() 54 { 55 x = 0; 56 y = 0; 57 leftButton = false; 58 Refresh(); 59 } 60 Move(int newx, int newy)61 public void Move(int newx, int newy) 62 { 63 x = newx; 64 y = newy; 65 if(leftButton) 66 { 67 Refresh(); 68 } 69 } 70 MouseDown()71 public void MouseDown() 72 { 73 leftButton = true; 74 Refresh(); 75 } 76 MouseUp()77 public void MouseUp() 78 { 79 leftButton = false; 80 Refresh(); 81 } 82 Refresh()83 private void Refresh() 84 { 85 IRQ.Set(); 86 } 87 88 private enum Registers 89 { 90 X = 0, 91 Y = 4, 92 LeftButton = 8, 93 InterruptHandled = 12 94 } 95 96 private int x; 97 private int y; 98 private bool leftButton; 99 } 100 } 101 102