way better timer handling logic and headers usage
This commit is contained in:
parent
dc7982e71c
commit
d9faf6bba4
|
@ -1 +1,2 @@
|
||||||
*.o
|
*.o
|
||||||
|
*.uaem
|
||||||
|
|
BIN
justwindow
BIN
justwindow
Binary file not shown.
10
justwindow.c
10
justwindow.c
|
@ -5,7 +5,15 @@ int main(void) {
|
||||||
struct Window *window;
|
struct Window *window;
|
||||||
|
|
||||||
window = OpenWindowTags(NULL,
|
window = OpenWindowTags(NULL,
|
||||||
WA_Title, "Wow",
|
WA_Title, "Topaz's Pizza Timer",
|
||||||
|
WA_Width, 240,
|
||||||
|
WA_Height, 80,
|
||||||
|
WA_Top, 20,
|
||||||
|
WA_Left, 20,
|
||||||
|
WA_DragBar, TRUE,
|
||||||
|
WA_DepthGadget, TRUE,
|
||||||
|
WA_CloseGadget, TRUE,
|
||||||
|
WA_Activate, TRUE,
|
||||||
TAG_END
|
TAG_END
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
Binary file not shown.
55
main.c
55
main.c
|
@ -17,13 +17,11 @@
|
||||||
#include <proto/diskfont.h>
|
#include <proto/diskfont.h>
|
||||||
|
|
||||||
// handle images and sound
|
// handle images and sound
|
||||||
#include <clib/datatypes_protos.h>
|
#include <proto/datatypes.h>
|
||||||
#include <datatypes/datatypesclass.h>
|
#include <datatypes/datatypesclass.h>
|
||||||
#include <datatypes/soundclass.h>
|
#include <datatypes/soundclass.h>
|
||||||
|
|
||||||
// timer stuff. using proto/timer.h did not work well, likely
|
#include <proto/timer.h>
|
||||||
// because of how you have to open the device.
|
|
||||||
#include <clib/timer_protos.h>
|
|
||||||
|
|
||||||
// this is the manual for the original intuition stuff.
|
// this is the manual for the original intuition stuff.
|
||||||
// not much here is different: https://ia801905.us.archive.org/33/items/Amiga_Intuition_Reference_Manaual_1985_Adn-Wesley_Publishing_Company/Amiga_Intuition_Reference_Manaual_1985_Addison-Wesley_Publishing_Company.pdf
|
// not much here is different: https://ia801905.us.archive.org/33/items/Amiga_Intuition_Reference_Manaual_1985_Adn-Wesley_Publishing_Company/Amiga_Intuition_Reference_Manaual_1985_Addison-Wesley_Publishing_Company.pdf
|
||||||
|
@ -80,8 +78,10 @@ struct MenuData {
|
||||||
int id;
|
int id;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MENU_ABOUT_ID 0
|
// Start this at 1, otherwise not selecting a menu item is the same as
|
||||||
#define MENU_QUIT_ID 1
|
// opening the menu and picking the item with ID 0
|
||||||
|
#define MENU_ABOUT_ID 1
|
||||||
|
#define MENU_QUIT_ID 2
|
||||||
|
|
||||||
struct MenuData MENU_ABOUT = { MENU_ABOUT_ID };
|
struct MenuData MENU_ABOUT = { MENU_ABOUT_ID };
|
||||||
struct MenuData MENU_QUIT = { MENU_QUIT_ID };
|
struct MenuData MENU_QUIT = { MENU_QUIT_ID };
|
||||||
|
@ -98,7 +98,6 @@ struct Menu *menu;
|
||||||
// timer stuff
|
// timer stuff
|
||||||
#define TIMER_INTERVAL 200000
|
#define TIMER_INTERVAL 200000
|
||||||
|
|
||||||
struct Device *TimerBase;
|
|
||||||
struct timerequest *TimerIO;
|
struct timerequest *TimerIO;
|
||||||
struct timeval currentSystemTime;
|
struct timeval currentSystemTime;
|
||||||
struct MsgPort *timerPort;
|
struct MsgPort *timerPort;
|
||||||
|
@ -176,10 +175,6 @@ int setup(void) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// this allows us to use GetSysTime, rather than performing an IO operation
|
|
||||||
// to get the current time.
|
|
||||||
TimerBase = TimerIO->tr_node.io_Device;
|
|
||||||
|
|
||||||
if (NULL == (DataTypesBase = OpenLibrary("datatypes.library", 40))) {
|
if (NULL == (DataTypesBase = OpenLibrary("datatypes.library", 40))) {
|
||||||
// this is ok, we just won't play sound
|
// this is ok, we just won't play sound
|
||||||
printf("no sound!");
|
printf("no sound!");
|
||||||
|
@ -200,7 +195,6 @@ void teardown(void) {
|
||||||
FreeSignal(waitForSoundSignalNumber);
|
FreeSignal(waitForSoundSignalNumber);
|
||||||
}
|
}
|
||||||
if (TimerIO) {
|
if (TimerIO) {
|
||||||
CloseDevice((struct IORequest *)TimerIO);
|
|
||||||
DeleteExtIO((struct IORequest *)TimerIO);
|
DeleteExtIO((struct IORequest *)TimerIO);
|
||||||
}
|
}
|
||||||
if (timerPort) {
|
if (timerPort) {
|
||||||
|
@ -390,13 +384,21 @@ void setTimerText(void) {
|
||||||
* Ask the timer to send a message to our message port
|
* Ask the timer to send a message to our message port
|
||||||
* after a defined number of milliseconds.
|
* after a defined number of milliseconds.
|
||||||
*/
|
*/
|
||||||
void startTimer(void) {
|
int startTimer(void) {
|
||||||
|
// TODO: handle timer.device not being available
|
||||||
|
if (0 != (OpenDevice(TIMERNAME, UNIT_MICROHZ, (struct IORequest *)TimerIO, 0L))) {
|
||||||
|
printf("Unable to open timer!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
TimerIO->tr_node.io_Command = TR_ADDREQUEST;
|
TimerIO->tr_node.io_Command = TR_ADDREQUEST;
|
||||||
TimerIO->tr_time.tv_secs = 0;
|
TimerIO->tr_time.tv_secs = 0;
|
||||||
TimerIO->tr_time.tv_micro = TIMER_INTERVAL;
|
TimerIO->tr_time.tv_micro = TIMER_INTERVAL;
|
||||||
|
|
||||||
// SendIO is async, it doesn't wait for the IO to complete before continuing
|
// SendIO is async, it doesn't wait for the IO to complete before continuing
|
||||||
SendIO((struct IORequest *)TimerIO);
|
SendIO((struct IORequest *)TimerIO);
|
||||||
|
|
||||||
|
CloseDevice((struct IORequest *)TimerIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -422,6 +424,26 @@ void clearUI(void) {
|
||||||
FreeGadgets(windowGadgets);
|
FreeGadgets(windowGadgets);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current system time.
|
||||||
|
*/
|
||||||
|
int getSysTime(void) {
|
||||||
|
struct Device* TimerBase;
|
||||||
|
|
||||||
|
if (0 != (OpenDevice(TIMERNAME, UNIT_MICROHZ, (struct IORequest *)TimerIO, 0L))) {
|
||||||
|
printf("Unable to open timer!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
TimerBase = TimerIO->tr_node.io_Device;
|
||||||
|
|
||||||
|
GetSysTime(¤tSystemTime);
|
||||||
|
|
||||||
|
CloseDevice((struct IORequest *)TimerIO);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Toggle the timer between started and stopped.
|
* Toggle the timer between started and stopped.
|
||||||
*/
|
*/
|
||||||
|
@ -429,8 +451,8 @@ void handleToggleTimer(void) {
|
||||||
timerIsRunning = !timerIsRunning;
|
timerIsRunning = !timerIsRunning;
|
||||||
|
|
||||||
if (timerIsRunning) {
|
if (timerIsRunning) {
|
||||||
// http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_2._guide/node04FA.html
|
// TODO: handle timer.device not being available
|
||||||
GetSysTime(¤tSystemTime);
|
getSysTime();
|
||||||
|
|
||||||
// timers are microsecond resolution
|
// timers are microsecond resolution
|
||||||
timerStartTime = currentSystemTime.tv_secs * 1000000 + currentSystemTime.tv_micro;
|
timerStartTime = currentSystemTime.tv_secs * 1000000 + currentSystemTime.tv_micro;
|
||||||
|
@ -774,7 +796,8 @@ void endTimer(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleTimerMessage(void) {
|
void handleTimerMessage(void) {
|
||||||
GetSysTime(¤tSystemTime);
|
// TODO: handle timer.device not being available
|
||||||
|
getSysTime();
|
||||||
|
|
||||||
timerDistance = ((currentSystemTime.tv_secs * 1000000 + currentSystemTime.tv_micro) - timerStartTime) / 1000000;
|
timerDistance = ((currentSystemTime.tv_secs * 1000000 + currentSystemTime.tv_micro) - timerStartTime) / 1000000;
|
||||||
timerBuild = (originalUiHours * 3600 + originalUiMinutes * 60 + originalUiSeconds) - timerDistance;
|
timerBuild = (originalUiHours * 3600 + originalUiMinutes * 60 + originalUiSeconds) - timerDistance;
|
||||||
|
|
Loading…
Reference in New Issue