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