134 lines
2.8 KiB
C++
Executable File
134 lines
2.8 KiB
C++
Executable File
/*
|
|
* Message.cpp
|
|
* V64
|
|
*
|
|
* Created by Dirk Hoffmann on 25.12.09.
|
|
* Copyright 2009 Hochschule Karlsruhe. All rights reserved.
|
|
*
|
|
*/
|
|
|
|
#include "Message.h"
|
|
|
|
MessageQueue::MessageQueue()
|
|
{
|
|
r = w = 0;
|
|
pthread_mutex_init(&lock, NULL);
|
|
}
|
|
|
|
MessageQueue::~MessageQueue()
|
|
{
|
|
pthread_mutex_destroy(&lock);
|
|
}
|
|
|
|
void MessageQueue::printMessage(Message *msg)
|
|
{
|
|
switch (msg->id) {
|
|
case MSG_ROM_LOADED:
|
|
fprintf(stderr, "MSG_ROM_LOADED");
|
|
break;
|
|
case MSG_ROM_MISSING:
|
|
fprintf(stderr, "MSG_ROM_MISSING");
|
|
break;
|
|
case MSG_RUN:
|
|
fprintf(stderr, "MSG_RUN");
|
|
break;
|
|
case MSG_HALT:
|
|
fprintf(stderr, "MSG_HALT");
|
|
break;
|
|
case MSG_CPU:
|
|
fprintf(stderr, "MSG_CPU");
|
|
break;
|
|
case MSG_WARP:
|
|
fprintf(stderr, "MSG_WARP");
|
|
break;
|
|
case MSG_LOG:
|
|
fprintf(stderr, "MSG_LOG");
|
|
break;
|
|
case MSG_VC1541_ATTACHED:
|
|
fprintf(stderr, "MSG_VC1541_ATTACHED");
|
|
break;
|
|
case MSG_VC1541_DISK:
|
|
fprintf(stderr, "MSG_VC_1541_DISK");
|
|
break;
|
|
case MSG_VC1541_LED:
|
|
fprintf(stderr, "MSG_VC1541_LED");
|
|
break;
|
|
case MSG_VC1541_DATA:
|
|
fprintf(stderr, "MSG_VC1541_DATA");
|
|
break;
|
|
case MSG_VC1541_MOTOR:
|
|
fprintf(stderr, "MSG_VC1541_MOTOR");
|
|
break;
|
|
case MSG_CARTRIDGE:
|
|
fprintf(stderr, "MSG_CARTRIDGE");
|
|
break;
|
|
case MSG_JOYSTICK_ATTACHED:
|
|
fprintf(stderr, "MSG_JOYSTICK_ATTACHED");
|
|
break;
|
|
case MSG_JOYSTICK_REMOVED:
|
|
fprintf(stderr, "MSG_JOYSTICK_REMOVED");
|
|
break;
|
|
case MSG_PAL:
|
|
fprintf(stderr, "MSG_PAL");
|
|
break;
|
|
case MSG_NTSC:
|
|
fprintf(stderr, "MSG_NTSC");
|
|
break;
|
|
default:
|
|
assert(0);
|
|
}
|
|
}
|
|
|
|
Message *MessageQueue::getMessage()
|
|
{
|
|
Message *result;
|
|
|
|
pthread_mutex_lock(&lock);
|
|
|
|
// Get data
|
|
if (r == w) {
|
|
// Queue is empty!
|
|
// fprintf(stderr, "MessageQueue::read: Queue is empty!\n");
|
|
result = NULL;
|
|
} else {
|
|
// fprintf(stderr, "getMessage: "); printMessage(&queue[r]); fprintf(stderr,"\n");
|
|
result = (r == w) ? NULL : &queue[r];
|
|
}
|
|
|
|
// Move read pointer to next location
|
|
if (result) r = (r + 1) % QUEUE_SIZE;
|
|
|
|
pthread_mutex_unlock(&lock);
|
|
|
|
return result;
|
|
}
|
|
|
|
void MessageQueue::putMessage(int id, int i, void *p, const char *c)
|
|
{
|
|
// If queue gets filled up, we don't accept any periodic messages any more...
|
|
//if (queueGetsFilledUp() && id == MSG_DRAW) {
|
|
// return;
|
|
//}
|
|
|
|
pthread_mutex_lock(&lock);
|
|
|
|
// Write data
|
|
queue[w].id = id;
|
|
queue[w].i = i;
|
|
queue[w].p = p;
|
|
if (c != NULL) strncpy(queue[w].c, c, 128);
|
|
|
|
// fprintf(stderr, "putMessage: "); printMessage(&queue[w]); fprintf(stderr,"\n");
|
|
|
|
// Move write pointer to next location
|
|
w = (w + 1) % QUEUE_SIZE;
|
|
|
|
if (w == r) {
|
|
fprintf(stderr, "putMessag: Queue overflow!!! Message is lost!!!\n");
|
|
// assert(0);
|
|
r = (r + 1) % QUEUE_SIZE;
|
|
}
|
|
|
|
pthread_mutex_unlock(&lock);
|
|
}
|