Remove intermediate buffer
[gnuk/neug.git] / tool / neug_check.py
1 #! /usr/bin/python
2
3 """
4 neug_check.py - a tool to check NeuG device
5
6 Copyright (C) 2012 Free Software Initiative of Japan
7 Author: NIIBE Yutaka <gniibe@fsij.org>
8
9 This file is a part of NeuG, a TRNG implementation.
10
11 NeuG is free software: you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by
13 the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
15
16 NeuG is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
19 License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program.  If not, see <http://www.gnu.org/licenses/>.
23 """
24
25 from struct import *
26 import sys, time, os, string
27
28 # Assume only single NeuG device is attached to computer
29
30 import usb
31
32 # USB class, subclass, protocol
33 COM_CLASS = 0x0a
34 COM_SUBCLASS = 0x00
35 COM_PROTOCOL_0 = 0x00
36
37 class neug(object):
38     def __init__(self, device, configuration, interface):
39         """
40         __init__(device, configuration, interface) -> None
41         Initialize the device.
42         device: usb.Device object.
43         configuration: configuration number.
44         interface: usb.Interface object representing the interface and altenate setting.
45         """
46         if interface.interfaceClass !=COM_CLASS:
47             raise ValueError, "Wrong interface class"
48         if interface.interfaceSubClass != COM_SUBCLASS:
49             raise ValueError, "Wrong interface sub class"
50         self.__devhandle = device.open()
51         # self.__devhandle.claimInterface(interface)
52         # self.__devhandle.setAltInterface(interface)
53
54         self.__intf = interface.interfaceNumber
55         self.__alt = interface.alternateSetting
56         self.__conf = configuration
57
58         self.__timeout = 10000
59
60     def get_string(self,no,maxsize):
61         return self.__devhandle.getString(no,maxsize)
62
63     def get_mode(self):
64         mode = self.__devhandle.controlMsg(requestType = 0xc0, request = 254,
65                                           value = 0, index = 0, buffer = 1,
66                                           timeout = 1000)
67         if mode[0] == 0:
68             return "Conditioned"
69         elif mode[0] == 1:
70             return "Raw data (after filter)"
71         else:
72             return "Raw data (ADC samples)"
73
74     def get_info(self, index):
75         err = self.__devhandle.controlMsg(requestType = 0xc0, request = 254,
76                                           value = 0, index = index, buffer = 2,
77                                           timeout = 1000)
78         return err[1]*256 + err[0]
79
80 def com_devices():
81     busses = usb.busses()
82     for bus in busses:
83         devices = bus.devices
84         for dev in devices:
85             for config in dev.configurations:
86                 for intf in config.interfaces:
87                     for alt in intf:
88                         if alt.interfaceClass == COM_CLASS and \
89                                 alt.interfaceSubClass == COM_SUBCLASS and \
90                                 alt.interfaceProtocol == COM_PROTOCOL_0:
91                             yield dev, config, alt
92
93 field = [ '', 'Vendor', 'Product', 'Serial', 'Revision', 'Config', 'Sys' ]
94
95 def main():
96     com = None
97     for (dev, config, intf) in com_devices():
98         try:
99             com = neug(dev, config, intf)
100             print "Device: ", dev.filename
101             print "Configuration: ", config.value
102             print "Interface: ", intf.interfaceNumber
103             break
104         except:
105             pass
106     if not com:
107         raise ValueError, "No NeuG Device Present"
108     print
109     for i in range(1,7):
110         s = com.get_string(i, 512)
111         print "%9s: %s" % (field[i], s)
112     print
113     print "mode: %s" % com.get_mode()
114     print "Repeat errors: %d" % com.get_info(2)
115     print "PP 64  errors: %d" % com.get_info(3)
116     print "PP 4k  errors: %d" % com.get_info(4)
117     print "Total  errors: %d" % com.get_info(1)
118     print "Repeat max counts: %d" % com.get_info(5)
119     print "PP 64  max counts: %d" % com.get_info(6)
120     print "PP 4k  max counts: %d" % com.get_info(7)
121     return 0
122
123
124 if __name__ == '__main__':
125     main()