3975
+ − 1 /*
+ − 2 SDL - Simple DirectMedia Layer
+ − 3 Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
+ − 4
+ − 5 This library is free software; you can redistribute it and/or
+ − 6 modify it under the terms of the GNU Library General Public
+ − 7 License as published by the Free Software Foundation; either
+ − 8 version 2 of the License, or (at your option) any later version.
+ − 9
+ − 10 This library is distributed in the hope that it will be useful,
+ − 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
+ − 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ − 13 Library General Public License for more details.
+ − 14
+ − 15 You should have received a copy of the GNU Library General Public
+ − 16 License along with this library; if not, write to the Free
+ − 17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ − 18
+ − 19 Sam Lantinga
+ − 20 slouken@devolution.com
+ − 21 */
+ − 22
+ − 23 /*
+ − 24 SDL_systimer.cpp
+ − 25
+ − 26 Epoc version by Hannu Viitala (hannu.j.viitala@mbnet.fi)
+ − 27 Markus Mertama
+ − 28 */
+ − 29
+ − 30 #include <e32std.h>
+ − 31 #include <e32hal.h>
+ − 32
+ − 33 extern "C" {
+ − 34 #include "SDL_error.h"
+ − 35 #include "SDL_thread.h"
+ − 36 #include "SDL_timer.h"
+ − 37 #include "SDL_timer_c.h"
+ − 38
+ − 39 static TUint start = 0;
+ − 40 static TInt tickPeriodMilliSeconds;
+ − 41
+ − 42
+ − 43 void SDL_StartTicks(void)
+ − 44 {
+ − 45 /* Set first ticks value */
+ − 46 start = User::TickCount();
+ − 47
+ − 48 TTimeIntervalMicroSeconds32 period;
+ − 49 TInt tmp = UserHal::TickPeriod(period);
+ − 50 tickPeriodMilliSeconds = period.Int() / 1000;
+ − 51 }
+ − 52
+ − 53 Uint32 SDL_GetTicks(void)
+ − 54 {
+ − 55 TUint deltaTics = User::TickCount() - start;
+ − 56 return(deltaTics * tickPeriodMilliSeconds);
+ − 57 }
+ − 58
+ − 59 void SDL_Delay(Uint32 ms)
+ − 60 {
+ − 61 User::After(TTimeIntervalMicroSeconds32(ms*1000));
+ − 62 }
+ − 63
+ − 64 /* Data to handle a single periodic alarm */
+ − 65 static int timer_alive = 0;
+ − 66 static SDL_Thread *timer = NULL;
+ − 67
+ − 68 static int RunTimer(void *unused)
+ − 69 {
+ − 70 while ( timer_alive )
+ − 71 {
+ − 72 if (SDL_timer_running)
+ − 73 {
+ − 74 SDL_ThreadedTimerCheck();
+ − 75 }
+ − 76 SDL_Delay(10);
+ − 77 }
+ − 78 return(0);
+ − 79 }
+ − 80
+ − 81 /* This is only called if the event thread is not running */
+ − 82 int SDL_SYS_TimerInit(void)
+ − 83 {
+ − 84 if(timer != NULL)
+ − 85 return (-1);
+ − 86 timer_alive = 1;
+ − 87 timer = SDL_CreateThread(RunTimer, NULL);
+ − 88 if ( timer == NULL )
+ − 89 return(-1);
+ − 90 return(SDL_SetTimerThreaded(1));
+ − 91 }
+ − 92
+ − 93 void SDL_SYS_TimerQuit(void)
+ − 94 {
+ − 95 timer_alive = 0;
+ − 96 if ( timer )
+ − 97 {
+ − 98 SDL_WaitThread(timer, NULL);
+ − 99 timer = NULL;
+ − 100 }
+ − 101 }
+ − 102
+ − 103 int SDL_SYS_StartTimer(void)
+ − 104 {
+ − 105 SDL_SetError("Internal logic error: Epoc uses threaded timer");
+ − 106 return(-1);
+ − 107 }
+ − 108
+ − 109 void SDL_SYS_StopTimer(void)
+ − 110 {
+ − 111 return;
+ − 112 }
+ − 113
+ − 114 } // extern "C"