Beispiel #1
0
static void *
listen_thread(void *data)
{
	long length;
	DNS_query *query;

	while (running) {
		if (queueIsEmpty(&queries_unused)) {
			if ((query = malloc(sizeof (*query))) == NULL) {
				syslog(LOG_ERR, "out of memory");
				sleep(2);
				continue;
			}
		} else {
			query = queueDequeue(&queries_unused)->data;
		}

		do {
			length = socketReadFrom(service, (unsigned char *) &query->packet.header, UDP_PACKET_SIZE, &query->client);
			if (0 < debug && 0 < length) {
				char *from = socketAddressToString(&query->client);
				syslog(LOG_DEBUG, "from=%s length=%ld", from, length);
				free(from);
			}
		} while (length <= 0);

		query->node.data = query;
		query->packet.length = length;
		queueEnqueue(&queries_waiting, &query->node);
	}

	return NULL;
}
Beispiel #2
0
/**
 * \brief Enqueue data to be sent over SPI
 *
 * This function gets data ready to be sent over SPI.
 * Note that the actual transfer is done in sgSerialReceive with
 * the current scheme.
 * \param sg_serial[in]		Data to be sent. Contains a Sansgrid Payload
 * \param size[in]			Size of data. Not currently used.
 */
int8_t sgSerialSend(SansgridSerial *sg_serial, uint32_t size) {
	// Send size bytes of serialdata
	SansgridSerial *sg_serial_cp = NULL;

	sg_serial_cp = (SansgridSerial*)malloc(sizeof(SansgridSerial));
	memcpy(sg_serial_cp, sg_serial, sizeof(SansgridSerial));
	queueEnqueue(tx_buffer, sg_serial_cp);
	sem_post(&wait_on_slave);
	return 0;
}
Beispiel #3
0
void *
produce(void *arg)
{
	list *l = (list *)arg;
	for(int i = 0; i < NUM_JOBS; i++) {
		char buf[32];
		sprintf(buf, "msg.%d", i);
		queueEnqueue(l, strdup(buf));
	}
	return 0;
}
Beispiel #4
0
static void *
answer_thread(void *data)
{
	DNS_query *query;

	while (running) {
		query = queueDequeue(&queries_waiting)->data;
		find_answer(query);
		socketWriteTo(service, (unsigned char *) &query->packet.header, query->packet.length, &query->client);
		queueEnqueue(&queries_unused, &query->node);
	}

	return NULL;
}
Beispiel #5
0
int main()
{
    int i = 0;
    //int *queuedata;
    void * dataout;
    //void * dummyqueuezero = &dataqueue[1];
    //void * dummyqueueone = &dataqueue[1];
    queueInit(&queueTest, QUEUESIZE-1);
    while( queueEnqueue(&queueTest, &dataqueue[i]) == noError)
    {
        i++;
    }

    while( queueDequeue(&queueTest, &dataout) == noError)
    {
        //queuedata = dataout;
        //blaat = *(int *) dataout;
        printf("dequeued element %d\n", *((int *) dataout));
    }

    return 0;
}
Beispiel #6
0
// to_goalがtrueのとき、ゴールまでの経路を探索する
// to_goalがfalseのとき、未探索の地点までの経路を探索する
enum action_t agent_explore(void) {
    queueInit();
    for(int y = 0; y < size; ++y) {
        for(int x = 0; x < size; ++x) {
            if(check_goal(y, x)) {
                d[y][x] = 0;
                inQueue[y][x] = true;
                queueEnqueue(y, x);
            }
            else {
                d[y][x] = UCHAR_MAX - 1;
                inQueue[y][x] = false;
            }
        }
    }

    while(queueEmpty() == false) {
        int vy, vx;
        queueDequeue(&vy, &vx);
        inQueue[vy][vx] = false;

        for (int k = 0; k < 4; k++) {
            if (wall[vy][vx][k] == false) {
                int ny = vy + dy[k];
                int nx = vx + dx[k];
                if(d[ny][nx] > d[vy][vx] + 1) {
                    d[ny][nx] = d[vy][vx] + 1;
                    if(inQueue[ny][nx] == false) {
                        inQueue[ny][nx] = true;
                        queueEnqueue(ny, nx);
                    }
                }
            }
        }
    }

    if(wall[curY][curX][(dir + 0)%4] == false &&
            d[curY + dy[(dir + 0)%4]][curX + dx[(dir + 0)%4]] + 1 == d[curY][curX]) {
        // GoForward
        curY += dy[dir];
        curX += dx[dir];
        return GO_FORWARD;
    }

    if(wall[curY][curX][(dir + 1)%4] == false &&
            d[curY + dy[(dir + 1)%4]][curX + dx[(dir + 1)%4]] + 1 == d[curY][curX]) {
        // TurnLeft
        dir = (dir + 1) % 4;
        return TURN_LEFT;
    }

    if(wall[curY][curX][(dir + 3)%4] == false &&
            d[curY + dy[(dir + 3)%4]][curX + dx[(dir + 3)%4]] + 1 == d[curY][curX]) {
        // TurnRight
        dir = (dir + 3) % 4;
        return TURN_RIGHT;
    }

    if(wall[curY][curX][(dir + 2)%4] == false &&
            d[curY + dy[(dir + 2)%4]][curX + dx[(dir + 2)%4]] + 1 == d[curY][curX]) {
        // TurnLeft
        dir = (dir + 1) % 4;
        return TURN_LEFT;
    }

    return NO_OPERATION;
}
Beispiel #7
0
/**
 * \brief Receive data full-duplex over SPI
 *
 * If there is data waiting to be sent, that is transferred.
 * Data is also received over serial wire and then converted
 * into a SansgridSerial structure.  
 * \param sg_serial[out]		Where received data is placed. 
 * \param size[out]				Size of the returned payload, zero if not packet
 * received
 */
int8_t sgSerialReceive(SansgridSerial **sg_serial, uint32_t *size) {
	// Transmit/Receive serialdata, size of packet stored in size
	// Code from
	// https://git.drogon.net/?p=wiringPi;a=blob;f=examples/isr.c;h=2bef54af13a60b95ad87fbfc67d2961722eb016e;hb=HEAD
	int i;
	SansgridSerial *sg_serial_out = NULL;
	char buffer[sizeof(SansgridSerial)+1];
	int fd;
	// Set when we're sending data
	int sending = 0;
	int exit_code = 0;
	*size = sizeof(SansgridSerial);
	syslog(LOG_INFO, "Waiting for data over serial");
	if (!sem_initd) {
		sem_init(&wait_on_slave, 0, 0);
		sem_initd = 1;
	}
	memset(buffer, 0x0, sizeof(buffer));
	buffer[0] = SG_SERIAL_CTRL_NO_DATA;

	// receive data
	
	// first make sure semaphore is zeroed out
	while (sem_trywait(&wait_on_slave) == 0);
	// If there are no pending requests, wait until we get one
	if (digitalRead((SLAVE_INT_PIN)) && !queueSize(tx_buffer))
		sem_wait(&wait_on_slave);

	// Transfer about to occur
	if (queueTryDequeue(tx_buffer, (void**)&sg_serial_out) >= 0) {
		// Data needs to be sent
		sg_serial_out->control = SG_SERIAL_CTRL_VALID_DATA;
		*sg_serial = sg_serial_out;
		memcpy(buffer, sg_serial_out, *size);
		sending = 1;
	} else {
		// No data needs to be sent
		*sg_serial = (SansgridSerial*)malloc(sizeof(SansgridSerial));
		(*sg_serial)->control = SG_SERIAL_CTRL_NO_DATA;
		sending = 0;
	}


	pthread_mutex_lock(&transfer_lock);
	// LOCKED


	// Make sure only one thread can access SPI at a time
	syslog(LOG_INFO, "Sending data over Serial");

	// this needs to be atomic, since fd comes from static global g_fd
	if ((fd = spiOpen()) == -1) {
		return -1;
	}

	// (debug) Print our data to send 
	printf("Sending:\n");
	spiPrintSgSerial(buffer, *size);

	spiTransfer(buffer, *size);
	close(fd);

	// (debug) Print what we got 
	printf("Receiving:\n");
	spiPrintSgSerial(buffer, *size);

	memcpy(*sg_serial, buffer, *size);
	if (buffer[0] == SG_SERIAL_CTRL_VALID_DATA) {
		queueEnqueue(dispatch, sgSerialCP(*sg_serial));
		*size = sizeof(SansgridSerial);
		// Radio can't get spammed. Throttle sending
		exit_code = 0;
	} else {
		// No need for sg_serial anymore
		//free(sg_serial);
		//*size = 0;
		if (buffer[0] != SG_SERIAL_CTRL_VALID_DATA
				&& sending == 0) {
			// Didn't send valid data, and didn't get valid data
			syslog(LOG_WARNING, "Bad data on SPI");
			exit_code = -1;
		}
	}

	for (i=0; i<3; i++) {
		sleep(1);
		if (!digitalRead(SLAVE_INT_PIN))
			break;
	}


	pthread_mutex_unlock(&transfer_lock);
	// UNLOCKED



	return exit_code;
}