00001 /* 00002 * Copyright Droids Corporation, Microb Technology, Eirbot (2005) 00003 * 00004 * This program is free software; you can redistribute it and/or modify 00005 * it under the terms of the GNU General Public License as published by 00006 * the Free Software Foundation; either version 2 of the License, or 00007 * (at your option) any later version. 00008 * 00009 * This program is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 * GNU General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU General Public License 00015 * along with this program; if not, write to the Free Software 00016 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00017 * 00018 * Revision : $Id: scheduler_add.c,v 1.3 2007-05-24 13:08:46 zer0 Exp $ 00019 * 00020 */ 00021 00022 #include <aversive.h> 00023 #include <scheduler_config.h> 00024 #include <scheduler_private.h> 00025 00028 static inline int8_t 00029 scheduler_alloc_event(void) 00030 { 00031 uint8_t i; 00032 uint8_t flags; 00033 00034 for (i=0 ; i<SCHEDULER_NB_MAX_EVENT ; i++) { 00035 IRQ_LOCK(flags); 00036 if( g_tab_event[i].state == SCHEDULER_EVENT_FREE ) { 00037 g_tab_event[i].state = SCHEDULER_EVENT_ALLOCATED; 00038 IRQ_UNLOCK(flags); 00039 return i; 00040 } 00041 IRQ_UNLOCK(flags); 00042 } 00043 return -1; 00044 } 00045 00046 00049 int8_t 00050 scheduler_add_event(uint8_t unicity, void (*f)(void *), 00051 void * data, uint16_t period, 00052 uint8_t priority) { 00053 int8_t i; 00054 uint8_t flags; 00055 00056 i = scheduler_alloc_event(); 00057 if ( i == -1 ) 00058 return -1; 00059 00060 if(!unicity) 00061 g_tab_event[i].period = period ; 00062 else 00063 g_tab_event[i].period = 0 ; 00064 g_tab_event[i].current_time = period ; 00065 g_tab_event[i].priority = priority ; 00066 g_tab_event[i].f = f; 00067 g_tab_event[i].data = data; 00068 00069 IRQ_LOCK(flags); 00070 g_tab_event[i].state = SCHEDULER_EVENT_ACTIVE; 00071 IRQ_UNLOCK(flags); 00072 00073 return i; 00074 }