| /** @file | |
| NonCanonical Interactive Input Function. | |
| The functions assume that isatty() is TRUE at the time they are called. | |
| If _S_IWTTY is set, the device returns WIDE characters. | |
| Copyright (c) 2012 - 2014, Intel Corporation. All rights reserved.<BR> | |
| This program and the accompanying materials are licensed and made available | |
| under the terms and conditions of the BSD License which accompanies this | |
| distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php. | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #include <LibConfig.h> | |
| #include <sys/syslimits.h> | |
| #include <sys/termios.h> | |
| #include <Containers/Fifo.h> | |
| #include <Device/IIO.h> | |
| /** Perform a noncanonical read of input. | |
| @param[in] filp Pointer to a file descriptor structure. | |
| @param[in] BufferSize Maximum number of bytes to return. | |
| @retval -1 An error has occurred. Reason in errno. | |
| @retval -1 No data returned. None was ready. | |
| @retval >0 The number of elements returned | |
| **/ | |
| ssize_t | |
| IIO_NonCanonRead ( | |
| struct __filedes *filp | |
| ) | |
| { | |
| cIIO *This; | |
| cFIFO *InBuf; | |
| struct termios *Termio; | |
| ssize_t NumRead; | |
| cc_t tioMin; | |
| cc_t tioTime; | |
| UINT32 InputType; | |
| wchar_t InChar; // Intermediate character buffer | |
| NumRead = -1; | |
| InChar = 0; // Initialize so compilers don't complain. | |
| This = filp->devdata; | |
| Termio = &This->Termio; | |
| InBuf = This->InBuf; | |
| tioMin = Termio->c_cc[VMIN]; | |
| tioTime = Termio->c_cc[VTIME]; | |
| if(tioMin >= MAX_INPUT) { | |
| tioMin = MAX_INPUT; | |
| } | |
| /* There are four types of processing that may be done, based on | |
| the values of tioMin and tioTime. | |
| Min Time Type | |
| --- ---- ---- | |
| 0 0 0 Return buffer contents or 1 new char | |
| 0 >0 1 Return 0 or 1 character depending on timeout | |
| >0 0 2 Buffer Min chars. Return BufferSize chars. | |
| >0 >0 3 Return up to Min chars. Unless the inter-byte timer expires. | |
| Currently, only type 0 is implemented. | |
| */ | |
| InputType = 0; | |
| if(tioMin != 0) InputType = 2; | |
| if(tioTime != 0) ++InputType; | |
| //switch(InputType) { | |
| // case 0: | |
| if(InBuf->IsEmpty(InBuf)) { | |
| NumRead = filp->f_ops->fo_read(filp, &filp->f_offset, sizeof(wchar_t), &InChar); | |
| if(NumRead > 0) { | |
| (void) InBuf->Write(InBuf, &InChar, 1); // Buffer the character | |
| } | |
| } | |
| // break; | |
| // case 1: | |
| // break; | |
| // case 2: | |
| // break; | |
| // case 3: | |
| // break; | |
| //} | |
| return NumRead; | |
| } |