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(¤t_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