POK(kernelpart)
/home/jaouen/pok_official/pok/trunk/kernel/middleware/portsamplingread.c
Go to the documentation of this file.
00001 /*
00002  *                               POK header
00003  * 
00004  * The following file is a part of the POK project. Any modification should
00005  * made according to the POK licence. You CANNOT use this file or a part of
00006  * this file is this part of a file for your own project
00007  *
00008  * For more information on the POK licence, please see our LICENCE FILE
00009  *
00010  * Please follow the coding guidelines described in doc/CODING_GUIDELINES
00011  *
00012  *                                      Copyright (c) 2007-2009 POK team 
00013  *
00014  * Created by julien on Thu Jan 15 23:34:13 2009 
00015  */
00016 
00017 
00018 #ifdef POK_NEEDS_PORTS_SAMPLING
00019 #include <errno.h>
00020 #include <types.h>
00021 #include <core/lockobj.h>
00022 #include <core/sched.h>
00023 #include <core/time.h>
00024 #include <middleware/port.h>
00025 #include <middleware/queue.h>
00026 #include <libc.h>
00027 
00028 extern pok_port_t    pok_ports[POK_CONFIG_NB_PORTS];
00029 
00030 pok_ret_t pok_port_sampling_read (const pok_port_id_t id, 
00031                                   void*               data, 
00032                                   pok_port_size_t*    len,
00033                                   bool_t*             valid)
00034 {
00035    pok_ret_t ret;
00036 
00037    if (data == NULL)
00038    {
00039       return POK_ERRNO_EINVAL;
00040    }
00041 
00042    if (id > POK_CONFIG_NB_PORTS)
00043    {
00044       return POK_ERRNO_EINVAL;
00045    }
00046 
00047    if (! pok_own_port (POK_SCHED_CURRENT_PARTITION, id))
00048    {
00049       return POK_ERRNO_PORT;
00050    }
00051 
00052    if (pok_ports[id].ready != TRUE)
00053    {
00054       return POK_ERRNO_PORT;
00055    }
00056 
00057    if (pok_ports[id].kind != POK_PORT_KIND_SAMPLING)
00058    {
00059       return POK_ERRNO_EINVAL;
00060    }
00061 
00062    if (pok_ports[id].direction != POK_PORT_DIRECTION_IN)
00063    {
00064       return POK_ERRNO_MODE;
00065    }
00066 
00067    pok_lockobj_lock (&pok_ports[id].lock, NULL);
00068 
00069    ret = pok_port_get ((uint8_t)id, data, pok_ports[id].size);
00070 
00071    if (ret == POK_ERRNO_EMPTY)
00072    {
00073       pok_lockobj_unlock (&pok_ports[id].lock, NULL);
00074       *len = 0;
00075       *valid = 0;
00076       return POK_ERRNO_EMPTY;
00077    }
00078 
00079    if ( (pok_ports[id].last_receive + pok_ports[id].refresh) < POK_GETTICK ())
00080    {
00081       *valid = FALSE;
00082    }
00083    else
00084    {
00085       *valid = TRUE;
00086    }
00087 
00088    *len =  pok_ports[id].size;
00089 
00090    pok_lockobj_unlock (&pok_ports[id].lock, NULL);
00091 
00092    return POK_ERRNO_OK;
00093 }
00094 
00095 #endif
00096