1141cc406Sopenharmony_ci/* @file plustek-pp_misc.c
2141cc406Sopenharmony_ci * @brief here we have some helpful functions
3141cc406Sopenharmony_ci*
4141cc406Sopenharmony_ci * based on sources acquired from Plustek Inc.
5141cc406Sopenharmony_ci * Copyright (C) 1998 Plustek Inc.
6141cc406Sopenharmony_ci * Copyright (C) 2000-2013 Gerhard Jaeger <gerhard@gjaeger.de>
7141cc406Sopenharmony_ci * also based on the work done by Rick Bronson
8141cc406Sopenharmony_ci *
9141cc406Sopenharmony_ci * History:
10141cc406Sopenharmony_ci * - 0.30 - initial version
11141cc406Sopenharmony_ci * - 0.31 - no changes
12141cc406Sopenharmony_ci * - 0.32 - moved the parport functions inside this module
13141cc406Sopenharmony_ci *        - now using the information, the parport-driver provides
14141cc406Sopenharmony_ci *        - for selecting the port-mode this driver uses
15141cc406Sopenharmony_ci * - 0.33 - added code to use faster portmodes
16141cc406Sopenharmony_ci * - 0.34 - added sample code for changing from ECP to PS/2 bidi mode
17141cc406Sopenharmony_ci * - 0.35 - added Kevins' changes (new function miscSetFastMode())
18141cc406Sopenharmony_ci *        - moved function initPageSettings() to module models.c
19141cc406Sopenharmony_ci * - 0.36 - added random generator
20141cc406Sopenharmony_ci *        - added additional debug messages
21141cc406Sopenharmony_ci *        - changed prototype of MiscInitPorts()
22141cc406Sopenharmony_ci *        - added miscPreemptionCallback()
23141cc406Sopenharmony_ci * - 0.37 - changed inb_p/outb_p to macro calls (kernel-mode)
24141cc406Sopenharmony_ci *        - added MiscGetModelName()
25141cc406Sopenharmony_ci *        - added miscShowPortModes()
26141cc406Sopenharmony_ci * - 0.38 - fixed a small bug in MiscGetModelName()
27141cc406Sopenharmony_ci * - 0.39 - added forceMode support
28141cc406Sopenharmony_ci * - 0.40 - no changes
29141cc406Sopenharmony_ci * - 0.41 - merged Kevins' patch to make EPP(ECP) work
30141cc406Sopenharmony_ci * - 0.42 - changed get_fast_time to _GET_TIME
31141cc406Sopenharmony_ci *        - changed include names
32141cc406Sopenharmony_ci * - 0.43 - added LINUX_26 stuff
33141cc406Sopenharmony_ci *        - minor fixes
34141cc406Sopenharmony_ci *        - removed floating point stuff
35141cc406Sopenharmony_ci * - 0.44 - fix format string issues, as Long types default to int32_t
36141cc406Sopenharmony_ci *          now
37141cc406Sopenharmony_ci * .
38141cc406Sopenharmony_ci * <hr>
39141cc406Sopenharmony_ci * This file is part of the SANE package.
40141cc406Sopenharmony_ci *
41141cc406Sopenharmony_ci * This program is free software; you can redistribute it and/or
42141cc406Sopenharmony_ci * modify it under the terms of the GNU General Public License as
43141cc406Sopenharmony_ci * published by the Free Software Foundation; either version 2 of the
44141cc406Sopenharmony_ci * License, or (at your option) any later version.
45141cc406Sopenharmony_ci *
46141cc406Sopenharmony_ci * This program is distributed in the hope that it will be useful, but
47141cc406Sopenharmony_ci * WITHOUT ANY WARRANTY; without even the implied warranty of
48141cc406Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
49141cc406Sopenharmony_ci * General Public License for more details.
50141cc406Sopenharmony_ci *
51141cc406Sopenharmony_ci * You should have received a copy of the GNU General Public License
52141cc406Sopenharmony_ci * along with this program.  If not, see <https://www.gnu.org/licenses/>.
53141cc406Sopenharmony_ci *
54141cc406Sopenharmony_ci * As a special exception, the authors of SANE give permission for
55141cc406Sopenharmony_ci * additional uses of the libraries contained in this release of SANE.
56141cc406Sopenharmony_ci *
57141cc406Sopenharmony_ci * The exception is that, if you link a SANE library with other files
58141cc406Sopenharmony_ci * to produce an executable, this does not by itself cause the
59141cc406Sopenharmony_ci * resulting executable to be covered by the GNU General Public
60141cc406Sopenharmony_ci * License.  Your use of that executable is in no way restricted on
61141cc406Sopenharmony_ci * account of linking the SANE library code into it.
62141cc406Sopenharmony_ci *
63141cc406Sopenharmony_ci * This exception does not, however, invalidate any other reasons why
64141cc406Sopenharmony_ci * the executable file might be covered by the GNU General Public
65141cc406Sopenharmony_ci * License.
66141cc406Sopenharmony_ci *
67141cc406Sopenharmony_ci * If you submit changes to SANE to the maintainers to be included in
68141cc406Sopenharmony_ci * a subsequent release, you agree by submitting the changes that
69141cc406Sopenharmony_ci * those changes may be distributed with this exception intact.
70141cc406Sopenharmony_ci *
71141cc406Sopenharmony_ci * If you write modifications of your own for SANE, it is your choice
72141cc406Sopenharmony_ci * whether to permit this exception to apply to your modifications.
73141cc406Sopenharmony_ci * If you do not wish that, delete this exception notice.
74141cc406Sopenharmony_ci * <hr>
75141cc406Sopenharmony_ci */
76141cc406Sopenharmony_ci#include "plustek-pp_scan.h"
77141cc406Sopenharmony_ci
78141cc406Sopenharmony_ci/*************************** some definitions ********************************/
79141cc406Sopenharmony_ci
80141cc406Sopenharmony_ci# define PPA_PROBE_SPP   0x0001
81141cc406Sopenharmony_ci# define PPA_PROBE_PS2   0x0002
82141cc406Sopenharmony_ci# define PPA_PROBE_ECR   0x0010
83141cc406Sopenharmony_ci# define PPA_PROBE_EPP17 0x0100
84141cc406Sopenharmony_ci# define PPA_PROBE_EPP19 0x0200
85141cc406Sopenharmony_ci
86141cc406Sopenharmony_ci#define _PP_A 16807         /**< multiplier */
87141cc406Sopenharmony_ci#define _PP_M 2147483647L   /**< 2**31 - 1  */
88141cc406Sopenharmony_ci
89141cc406Sopenharmony_ci/*************************** some local vars *********************************/
90141cc406Sopenharmony_ci
91141cc406Sopenharmony_cistatic int  port_feature = 0;
92141cc406Sopenharmony_cistatic long randomnum    = 1;
93141cc406Sopenharmony_ci
94141cc406Sopenharmony_cistatic int portIsClaimed[_MAX_PTDEVS] = { 0, 0, 0, 0 };
95141cc406Sopenharmony_ci
96141cc406Sopenharmony_ci/*************************** local functions *********************************/
97141cc406Sopenharmony_ci
98141cc406Sopenharmony_ci/** miscNextLongRand() -- generate 2**31-2 random numbers
99141cc406Sopenharmony_ci**
100141cc406Sopenharmony_ci**  public domain by Ray Gardner
101141cc406Sopenharmony_ci**
102141cc406Sopenharmony_ci**  based on "Random Number Generators: Good Ones Are Hard to Find",
103141cc406Sopenharmony_ci**  S.K. Park and K.W. Miller, Communications of the ACM 31:10 (Oct 1988),
104141cc406Sopenharmony_ci**  and "Two Fast Implementations of the 'Minimal Standard' Random
105141cc406Sopenharmony_ci**  Number Generator", David G. Carta, Comm. ACM 33, 1 (Jan 1990), p. 87-88
106141cc406Sopenharmony_ci**
107141cc406Sopenharmony_ci**  linear congruential generator f(z) = 16807 z mod (2 ** 31 - 1)
108141cc406Sopenharmony_ci**
109141cc406Sopenharmony_ci**  uses L. Schrage's method to avoid overflow problems
110141cc406Sopenharmony_ci*/
111141cc406Sopenharmony_cistatic Long miscNextLongRand( Long seed )
112141cc406Sopenharmony_ci{
113141cc406Sopenharmony_ci	ULong lo, hi;
114141cc406Sopenharmony_ci
115141cc406Sopenharmony_ci    lo = _PP_A * (Long)(seed & 0xFFFF);
116141cc406Sopenharmony_ci    hi = _PP_A * (Long)((ULong)seed >> 16);
117141cc406Sopenharmony_ci    lo += (hi & 0x7FFF) << 16;
118141cc406Sopenharmony_ci    if (lo > _PP_M) {
119141cc406Sopenharmony_ci
120141cc406Sopenharmony_ci		lo &= _PP_M;
121141cc406Sopenharmony_ci        ++lo;
122141cc406Sopenharmony_ci	}
123141cc406Sopenharmony_ci    lo += hi >> 15;
124141cc406Sopenharmony_ci    if (lo > _PP_M) {
125141cc406Sopenharmony_ci		lo &= _PP_M;
126141cc406Sopenharmony_ci        ++lo;
127141cc406Sopenharmony_ci	}
128141cc406Sopenharmony_ci
129141cc406Sopenharmony_ci	return (Long)lo;
130141cc406Sopenharmony_ci}
131141cc406Sopenharmony_ci
132141cc406Sopenharmony_ci/** initialize the random number generator
133141cc406Sopenharmony_ci */
134141cc406Sopenharmony_cistatic void miscSeedLongRand( long seed )
135141cc406Sopenharmony_ci{
136141cc406Sopenharmony_ci	randomnum = seed ? (seed & _PP_M) : 1;  /* nonzero seed */
137141cc406Sopenharmony_ci}
138141cc406Sopenharmony_ci
139141cc406Sopenharmony_ci/************************ exported functions *********************************/
140141cc406Sopenharmony_ci
141141cc406Sopenharmony_ci/** allocate and initialize some memory for the scanner structure
142141cc406Sopenharmony_ci */
143141cc406Sopenharmony_ci_LOC pScanData MiscAllocAndInitStruct( void )
144141cc406Sopenharmony_ci{
145141cc406Sopenharmony_ci	pScanData ps;
146141cc406Sopenharmony_ci
147141cc406Sopenharmony_ci	ps = (pScanData)_KALLOC(sizeof(ScanData), GFP_KERNEL);
148141cc406Sopenharmony_ci
149141cc406Sopenharmony_ci	if( NULL != ps ) {
150141cc406Sopenharmony_ci		MiscReinitStruct( ps );
151141cc406Sopenharmony_ci	}
152141cc406Sopenharmony_ci
153141cc406Sopenharmony_ci	DBG( DBG_HIGH, "ScanData = 0x%08lx\n", (unsigned long)ps );
154141cc406Sopenharmony_ci	return ps;
155141cc406Sopenharmony_ci}
156141cc406Sopenharmony_ci
157141cc406Sopenharmony_ci/** re-initialize the memory for the scanner structure
158141cc406Sopenharmony_ci */
159141cc406Sopenharmony_ci_LOC int MiscReinitStruct( pScanData ps )
160141cc406Sopenharmony_ci{
161141cc406Sopenharmony_ci	if( NULL == ps )
162141cc406Sopenharmony_ci		return _E_NULLPTR;
163141cc406Sopenharmony_ci
164141cc406Sopenharmony_ci	memset( ps, 0, sizeof(ScanData));
165141cc406Sopenharmony_ci
166141cc406Sopenharmony_ci	/* first init all constant stuff in ScanData
167141cc406Sopenharmony_ci	 */
168141cc406Sopenharmony_ci	ps->bCurrentSpeed = 1;
169141cc406Sopenharmony_ci	ps->pbMapRed      =  ps->a_bMapTable;
170141cc406Sopenharmony_ci	ps->pbMapGreen    = &ps->a_bMapTable[256];
171141cc406Sopenharmony_ci	ps->pbMapBlue     = &ps->a_bMapTable[512];
172141cc406Sopenharmony_ci	ps->sCaps.wIOBase = _NO_BASE;
173141cc406Sopenharmony_ci
174141cc406Sopenharmony_ci	/* use memory address to seed the generator */
175141cc406Sopenharmony_ci	miscSeedLongRand((long)ps);
176141cc406Sopenharmony_ci
177141cc406Sopenharmony_ci	DBG( DBG_HIGH, "Init settings done\n" );
178141cc406Sopenharmony_ci	return _OK;
179141cc406Sopenharmony_ci}
180141cc406Sopenharmony_ci
181141cc406Sopenharmony_ci/** in USER-Mode:   probe the specified port and try to get the port-mode
182141cc406Sopenharmony_ci *  in KERNEL-Mode: only use the modes, the driver returns
183141cc406Sopenharmony_ci */
184141cc406Sopenharmony_ci_LOC int MiscInitPorts( pScanData ps, int port )
185141cc406Sopenharmony_ci{
186141cc406Sopenharmony_ci	int mode, mts;
187141cc406Sopenharmony_ci
188141cc406Sopenharmony_ci	if( NULL == ps )
189141cc406Sopenharmony_ci		return _E_NULLPTR;
190141cc406Sopenharmony_ci
191141cc406Sopenharmony_ci	if( SANE_STATUS_GOOD != sanei_pp_getmodes( ps->pardev, &mode )) {
192141cc406Sopenharmony_ci		DBG( DBG_HIGH, "Cannot get port mode!\n" );
193141cc406Sopenharmony_ci		return _E_NO_PORT;
194141cc406Sopenharmony_ci	}
195141cc406Sopenharmony_ci
196141cc406Sopenharmony_ci	ps->IO.portMode = _PORT_NONE;
197141cc406Sopenharmony_ci	mts             = -1;
198141cc406Sopenharmony_ci	if( mode & SANEI_PP_MODE_SPP ) {
199141cc406Sopenharmony_ci		DBG( DBG_LOW, "Setting SPP-mode\n" );
200141cc406Sopenharmony_ci		ps->IO.portMode = _PORT_SPP;
201141cc406Sopenharmony_ci		mts = SANEI_PP_MODE_SPP;
202141cc406Sopenharmony_ci	}
203141cc406Sopenharmony_ci	if( mode & SANEI_PP_MODE_BIDI ) {
204141cc406Sopenharmony_ci		DBG( DBG_LOW, "Setting PS/2-mode\n" );
205141cc406Sopenharmony_ci		ps->IO.portMode = _PORT_BIDI;
206141cc406Sopenharmony_ci		mts = SANEI_PP_MODE_BIDI;
207141cc406Sopenharmony_ci	}
208141cc406Sopenharmony_ci	if( mode & SANEI_PP_MODE_EPP ) {
209141cc406Sopenharmony_ci		DBG( DBG_LOW, "Setting EPP-mode\n" );
210141cc406Sopenharmony_ci		ps->IO.portMode = _PORT_EPP;
211141cc406Sopenharmony_ci		mts = SANEI_PP_MODE_EPP;
212141cc406Sopenharmony_ci	}
213141cc406Sopenharmony_ci	if( mode & SANEI_PP_MODE_ECP ) {
214141cc406Sopenharmony_ci		DBG( DBG_HIGH, "ECP detected --> not supported\n" );
215141cc406Sopenharmony_ci	}
216141cc406Sopenharmony_ci
217141cc406Sopenharmony_ci	if( sanei_pp_uses_directio()) {
218141cc406Sopenharmony_ci		DBG( DBG_LOW, "We're using direct I/O\n" );
219141cc406Sopenharmony_ci	} else {
220141cc406Sopenharmony_ci		DBG( DBG_LOW, "We're using libIEEE1284 I/O\n" );
221141cc406Sopenharmony_ci	}
222141cc406Sopenharmony_ci
223141cc406Sopenharmony_ci	if( ps->IO.portMode == _PORT_NONE ) {
224141cc406Sopenharmony_ci		DBG( DBG_HIGH, "None of the portmodes is supported.\n" );
225141cc406Sopenharmony_ci		return _E_NOSUPP;
226141cc406Sopenharmony_ci	}
227141cc406Sopenharmony_ci
228141cc406Sopenharmony_ci	sanei_pp_setmode( ps->pardev, mts );
229141cc406Sopenharmony_ci	_VAR_NOT_USED( port );
230141cc406Sopenharmony_ci	return _OK;
231141cc406Sopenharmony_ci}
232141cc406Sopenharmony_ci
233141cc406Sopenharmony_ci/** Function to restore the port
234141cc406Sopenharmony_ci */
235141cc406Sopenharmony_ci_LOC void MiscRestorePort( pScanData ps )
236141cc406Sopenharmony_ci{
237141cc406Sopenharmony_ci    DBG(DBG_LOW,"MiscRestorePort()\n");
238141cc406Sopenharmony_ci
239141cc406Sopenharmony_ci	/* don't restore if not necessary */
240141cc406Sopenharmony_ci	if( 0xFFFF == ps->IO.lastPortMode ) {
241141cc406Sopenharmony_ci	    DBG(DBG_LOW,"- no need to restore portmode !\n");
242141cc406Sopenharmony_ci		return;
243141cc406Sopenharmony_ci	}
244141cc406Sopenharmony_ci
245141cc406Sopenharmony_ci    /*Restore Port-Mode*/
246141cc406Sopenharmony_ci    if( port_feature & PPA_PROBE_ECR ){
247141cc406Sopenharmony_ci		_OUTB_ECTL(ps,ps->IO.lastPortMode);
248141cc406Sopenharmony_ci    }
249141cc406Sopenharmony_ci}
250141cc406Sopenharmony_ci
251141cc406Sopenharmony_ci/** Initializes a timer.
252141cc406Sopenharmony_ci * @param timer - pointer to the timer to start
253141cc406Sopenharmony_ci * @param us    - timeout value in micro-seconds
254141cc406Sopenharmony_ci */
255141cc406Sopenharmony_ci_LOC void MiscStartTimer( TimerDef *timer , unsigned long us)
256141cc406Sopenharmony_ci{
257141cc406Sopenharmony_ci    struct timeval start_time;
258141cc406Sopenharmony_ci
259141cc406Sopenharmony_ci	gettimeofday(&start_time, NULL);
260141cc406Sopenharmony_ci
261141cc406Sopenharmony_ci    *timer = (TimerDef)start_time.tv_sec * 1000000 + (TimerDef)start_time.tv_usec + us;
262141cc406Sopenharmony_ci}
263141cc406Sopenharmony_ci
264141cc406Sopenharmony_ci/** Checks if a timer has been expired or not. In Kernel-mode, the scheduler
265141cc406Sopenharmony_ci *  will also be triggered, if the timer has not been expired.
266141cc406Sopenharmony_ci * @param timer - pointer to the timer to check
267141cc406Sopenharmony_ci * @return Function returns _E_TIMEOUT when the timer has been expired,
268141cc406Sopenharmony_ci *         otherwise _OK;
269141cc406Sopenharmony_ci */
270141cc406Sopenharmony_ci_LOC int MiscCheckTimer( TimerDef *timer )
271141cc406Sopenharmony_ci{
272141cc406Sopenharmony_ci    struct timeval current_time;
273141cc406Sopenharmony_ci
274141cc406Sopenharmony_ci	gettimeofday(&current_time, NULL);
275141cc406Sopenharmony_ci
276141cc406Sopenharmony_ci    if ((TimerDef)current_time.tv_sec * 1000000 + (TimerDef)current_time.tv_usec > *timer) {
277141cc406Sopenharmony_ci		return _E_TIMEOUT;
278141cc406Sopenharmony_ci    } else {
279141cc406Sopenharmony_ci/*#else
280141cc406Sopenharmony_ci		sched_yield();
281141cc406Sopenharmony_ci*/
282141cc406Sopenharmony_ci		return _OK;
283141cc406Sopenharmony_ci	}
284141cc406Sopenharmony_ci}
285141cc406Sopenharmony_ci
286141cc406Sopenharmony_ci/** Checks the function pointers
287141cc406Sopenharmony_ci * @param ps - pointer to the scanner data structure.
288141cc406Sopenharmony_ci * @return Function returns _TRUE if everything is okay and _FALSE if a NULL
289141cc406Sopenharmony_ci *         ptr has been detected.
290141cc406Sopenharmony_ci */
291141cc406Sopenharmony_ci#ifdef DEBUG
292141cc406Sopenharmony_ci_LOC Bool MiscAllPointersSet( pScanData ps )
293141cc406Sopenharmony_ci{
294141cc406Sopenharmony_ci	int  i;
295141cc406Sopenharmony_ci	unsigned long *ptr;
296141cc406Sopenharmony_ci
297141cc406Sopenharmony_ci	for( ptr = (unsigned long *)&ps->OpenScanPath, i = 1;
298141cc406Sopenharmony_ci		 ptr <= (unsigned long *)&ps->ReadOneImageLine; ptr++, i++ ) {
299141cc406Sopenharmony_ci
300141cc406Sopenharmony_ci		if( NULL == (pVoid)*ptr ) {
301141cc406Sopenharmony_ci			DBG( DBG_HIGH, "Function pointer not set (pos = %d) !\n", i );
302141cc406Sopenharmony_ci			return _FALSE;
303141cc406Sopenharmony_ci		}
304141cc406Sopenharmony_ci	}
305141cc406Sopenharmony_ci
306141cc406Sopenharmony_ci	return _TRUE;
307141cc406Sopenharmony_ci}
308141cc406Sopenharmony_ci#endif
309141cc406Sopenharmony_ci
310141cc406Sopenharmony_ci/** registers this driver to use port "portAddr" (KERNEL-Mode only)
311141cc406Sopenharmony_ci * @param ps       - pointer to the scanner data structure.
312141cc406Sopenharmony_ci * @param portAddr -
313141cc406Sopenharmony_ci */
314141cc406Sopenharmony_ci_LOC int MiscRegisterPort( pScanData ps, int portAddr )
315141cc406Sopenharmony_ci{
316141cc406Sopenharmony_ci	DBG( DBG_LOW, "Assigning port handle %i\n", portAddr );
317141cc406Sopenharmony_ci    ps->pardev = portAddr;
318141cc406Sopenharmony_ci
319141cc406Sopenharmony_ci	portIsClaimed[ps->devno] = 0;
320141cc406Sopenharmony_ci	return _OK;
321141cc406Sopenharmony_ci}
322141cc406Sopenharmony_ci
323141cc406Sopenharmony_ci/** unregisters the port from driver
324141cc406Sopenharmony_ci */
325141cc406Sopenharmony_ci_LOC void MiscUnregisterPort( pScanData ps )
326141cc406Sopenharmony_ci{
327141cc406Sopenharmony_ci	sanei_pp_close( ps->pardev );
328141cc406Sopenharmony_ci}
329141cc406Sopenharmony_ci
330141cc406Sopenharmony_ci/** Try to claim the port
331141cc406Sopenharmony_ci * @param ps - pointer to the scanner data structure.
332141cc406Sopenharmony_ci * @return Function returns _OK on success, otherwise _E_BUSY.
333141cc406Sopenharmony_ci */
334141cc406Sopenharmony_ci_LOC int MiscClaimPort( pScanData ps )
335141cc406Sopenharmony_ci{
336141cc406Sopenharmony_ci	if( 0 == portIsClaimed[ps->devno] ) {
337141cc406Sopenharmony_ci
338141cc406Sopenharmony_ci		DBG( DBG_HIGH, "Try to claim the parport\n" );
339141cc406Sopenharmony_ci		if( SANE_STATUS_GOOD != sanei_pp_claim( ps->pardev )) {
340141cc406Sopenharmony_ci			return _E_BUSY;
341141cc406Sopenharmony_ci		}
342141cc406Sopenharmony_ci	}
343141cc406Sopenharmony_ci	portIsClaimed[ps->devno]++;
344141cc406Sopenharmony_ci	return _OK;
345141cc406Sopenharmony_ci}
346141cc406Sopenharmony_ci
347141cc406Sopenharmony_ci/** Release previously claimed port
348141cc406Sopenharmony_ci * @param ps - pointer to the scanner data structure
349141cc406Sopenharmony_ci */
350141cc406Sopenharmony_ci_LOC void MiscReleasePort( pScanData ps )
351141cc406Sopenharmony_ci{
352141cc406Sopenharmony_ci	if( portIsClaimed[ps->devno] > 0 ) {
353141cc406Sopenharmony_ci		portIsClaimed[ps->devno]--;
354141cc406Sopenharmony_ci
355141cc406Sopenharmony_ci		if( 0 == portIsClaimed[ps->devno] ) {
356141cc406Sopenharmony_ci			DBG( DBG_HIGH, "Releasing parport\n" );
357141cc406Sopenharmony_ci			sanei_pp_release( ps->pardev );
358141cc406Sopenharmony_ci		}
359141cc406Sopenharmony_ci	}
360141cc406Sopenharmony_ci}
361141cc406Sopenharmony_ci
362141cc406Sopenharmony_ci/** Get random number
363141cc406Sopenharmony_ci * @return a random number.
364141cc406Sopenharmony_ci */
365141cc406Sopenharmony_ci_LOC Long MiscLongRand( void )
366141cc406Sopenharmony_ci{
367141cc406Sopenharmony_ci	randomnum = miscNextLongRand( randomnum );
368141cc406Sopenharmony_ci
369141cc406Sopenharmony_ci	return randomnum;
370141cc406Sopenharmony_ci}
371141cc406Sopenharmony_ci
372141cc406Sopenharmony_ci/** According to the id, the function returns a pointer to the model name
373141cc406Sopenharmony_ci * @param id - internal id of the various scanner models.
374141cc406Sopenharmony_ci * @return a pointer to the model-string.
375141cc406Sopenharmony_ci */
376141cc406Sopenharmony_ci_LOC const char *MiscGetModelName( UShort id )
377141cc406Sopenharmony_ci{
378141cc406Sopenharmony_ci	DBG( DBG_HIGH, "MiscGetModelName - id = %i\n", id );
379141cc406Sopenharmony_ci
380141cc406Sopenharmony_ci	if( MODEL_OP_PT12 < id )
381141cc406Sopenharmony_ci		return ModelStr[0];
382141cc406Sopenharmony_ci
383141cc406Sopenharmony_ci	return ModelStr[id];
384141cc406Sopenharmony_ci}
385141cc406Sopenharmony_ci
386141cc406Sopenharmony_ci/* END PLUSTEK-PP_MISC.C ....................................................*/
387