1 /** @file
2   NonCanonical Interactive Input Function.
3 
4   The functions assume that isatty() is TRUE at the time they are called.
5   If _S_IWTTY is set, the device returns WIDE characters.
6 
7   Copyright (c) 2012 - 2014, Intel Corporation. All rights reserved.<BR>
8   This program and the accompanying materials are licensed and made available
9   under the terms and conditions of the BSD License which accompanies this
10   distribution.  The full text of the license may be found at
11   http://opensource.org/licenses/bsd-license.php.
12 
13   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 **/
16 #include  <LibConfig.h>
17 
18 #include  <sys/syslimits.h>
19 #include  <sys/termios.h>
20 #include  <Containers/Fifo.h>
21 #include  <Device/IIO.h>
22 
23 /** Perform a noncanonical read of input.
24 
25     @param[in]    filp        Pointer to a file descriptor structure.
26     @param[in]    BufferSize  Maximum number of bytes to return.
27 
28     @retval    -1   An error has occurred.  Reason in errno.
29     @retval    -1   No data returned.  None was ready.
30     @retval    >0   The number of elements returned
31 **/
32 ssize_t
IIO_NonCanonRead(struct __filedes * filp)33 IIO_NonCanonRead (
34   struct __filedes *filp
35   )
36 {
37   cIIO           *This;
38   cFIFO          *InBuf;
39   struct termios *Termio;
40   ssize_t         NumRead;
41   cc_t            tioMin;
42   cc_t            tioTime;
43   UINT32          InputType;
44   wchar_t         InChar;     // Intermediate character buffer
45 
46   NumRead = -1;
47   InChar  = 0;      // Initialize so compilers don't complain.
48   This    = filp->devdata;
49   Termio  = &This->Termio;
50   InBuf   = This->InBuf;
51   tioMin  = Termio->c_cc[VMIN];
52   tioTime = Termio->c_cc[VTIME];
53 
54   if(tioMin >= MAX_INPUT) {
55     tioMin = MAX_INPUT;
56   }
57   /*  There are four types of processing that may be done, based on
58       the values of tioMin and tioTime.
59           Min   Time    Type
60           ---   ----    ----
61            0      0       0   Return buffer contents or 1 new char
62            0     >0       1   Return 0 or 1 character depending on timeout
63           >0      0       2   Buffer Min chars. Return BufferSize chars.
64           >0     >0       3   Return up to Min chars. Unless the inter-byte timer expires.
65 
66     Currently, only type 0 is implemented.
67   */
68   InputType = 0;
69   if(tioMin   != 0)     InputType = 2;
70   if(tioTime  != 0)   ++InputType;
71   //switch(InputType) {
72   //  case 0:
73       if(InBuf->IsEmpty(InBuf)) {
74         NumRead = filp->f_ops->fo_read(filp, &filp->f_offset, sizeof(wchar_t), &InChar);
75         if(NumRead > 0) {
76           (void) InBuf->Write(InBuf, &InChar, 1);  // Buffer the character
77         }
78       }
79   //    break;
80   //  case 1:
81   //    break;
82   //  case 2:
83   //    break;
84   //  case 3:
85   //    break;
86   //}
87   return NumRead;
88 }
89