コード例 #1
0
ファイル: drv_rd.c プロジェクト: dack2cc/KODE
void drv_rd_Request(CPU_EXT_HD_REQUEST * pstRequest_inout)
{
    CPU_INT08U * pbyDisk = 0;

    if ((0 == drv_rd_stCtl.pbyStart) || (0 == drv_rd_stCtl.uiSize)) {
        CPUExt_CorePanic("[drv_rd_Request][Ramdisk invalid]");
    }

    if ((0 == pstRequest_inout)
            ||  (0 == pstRequest_inout->in.pbyData)
            ||  (DRV_RD_DEVICE != (DRV_RD_DEVICE & pstRequest_inout->in.iDev))) {
        CPUExt_CorePanic("[drv_rd_Request][Parameter invalid]");
    }

    pbyDisk = drv_rd_stCtl.pbyStart + ((pstRequest_inout->in.uiBlkIdx) * CPU_EXT_HD_BLOCK_SIZE);

    if ((pbyDisk + CPU_EXT_HD_BLOCK_SIZE) > (drv_rd_stCtl.pbyStart + drv_rd_stCtl.uiSize)) {
        CPUExt_CorePanic("[drv_rd_Request][Reading failed]");
        //pstRequest_inout->out.iResult = CPU_EXT_HD_RESULT_IO;
        //drv_blk_NotifyRWEnd((DRV_BLK_BUFFER *)pstRequest_inout);
        //return;
    }

    if (CPU_EXT_HD_CMD_READ == pstRequest_inout->in.iCmd) {
        Mem_Copy(pstRequest_inout->in.pbyData, pbyDisk, CPU_EXT_HD_BLOCK_SIZE);
    } else if (CPU_EXT_HD_CMD_WRITE == pstRequest_inout->in.iCmd) {
        Mem_Copy(pbyDisk, pstRequest_inout->in.pbyData, CPU_EXT_HD_BLOCK_SIZE);
    } else {
        CPUExt_CorePanic("[drv_rd_Request][Reading failed]");
    }

    pstRequest_inout->out.iResult = CPU_EXT_HD_RESULT_OK;
    drv_blk_NotifyRWEnd((DRV_BLK_BUFFER *)pstRequest_inout);
}
コード例 #2
0
ファイル: User_udp.c プロジェクト: wcf873455992/ZK
////////////////////////////////////////////////////////////////////
//	函数名称:
//	函数功能:
//	入口参数:
//
//
//	出口参数:无
////////////////////////////////////////////////////////////////////
uint8 Check_UDP_Paket(void *pdata, uint16 lg)
{
    uint8 *p;
    struct COMM_XCOM *pxcom;
    struct tagIC2CMD_Header cmd;
    struct BASE_MSG *pmsg;
    p = (uint8 *)pdata;
    pxcom = (struct COMM_XCOM *)Get_XCOM_Port(DEV_XCOM_UDP);
    Mem_Copy((uint8 *)&cmd, p, sizeof( struct tagIC2CMD_Header));
    if (cmd.dwSyncHead != CMD_ABLE_ICII) return 0;
    if ((cmd.byteProtocolType & CMD_SENDER_ACK) == CMD_SENDER_ACK)
    {
        if ((pxcom->Rflag & XCOM_READ_FLAG_WAIT_ACK) && (pxcom->flag != NULL))
            OSSemPost(pxcom->flag);
    }
    else
    {
        if ((pxcom->Rflag & XCOM_READ_FLAG_WAIT_DATA) != XCOM_READ_FLAG_WAIT_DATA) return 0;
        if (pxcom->flag == NULL) return 0;
        pmsg = (struct BASE_MSG *)((uint8 *)pdata + sizeof(struct XCOM_REV_TYPE) + sizeof(struct tagIC2CMD_Header));
        if (pmsg->option != pxcom->RCMDNo) return 0;
        pxcom->Rdata_lg = lg - sizeof(struct tagIC2CMD_Header);
        Mem_Copy(pxcom->pbuf, p + sizeof(struct tagIC2CMD_Header), pxcom->Rdata_lg);
        OSSemPost(pxcom->flag);
        UDP_Send_ACK(pdata);
        return TRUE;
    }
    return FALSE;
}
コード例 #3
0
ファイル: unzip.cpp プロジェクト: newerthcom/savagerebirth
bool ZIP_StatFile (unzFile archive, const char *filename, struct stat *stats)
{
	gpointer file_entry;
	int pos;
	int err;
	unz_s* s;
	char *lowerfilename;
	unz_s unz_backup;
	struct tm newdate;
	tm_unz tmu_date;

	if (archive==NULL)
		return UNZ_PARAMERROR;
	s=(unz_s*)archive;

	lowerfilename = g_ascii_strdown(filename, -1);
	file_entry = g_hash_table_lookup(s->filenameHash, lowerfilename);
	g_free(lowerfilename);
	
	if (file_entry)
	{
		Mem_Copy(&unz_backup, s, sizeof(unz_s));

		pos = GPOINTER_TO_UINT(file_entry);

		s->pos_in_central_dir = pos;
		err = unzlocal_GetCurrentFileInfoInternal(archive,&s->cur_file_info,
											   &s->cur_file_info_internal,
											   NULL,0,NULL,0,NULL,0);
		if (err != UNZ_OK)
		{
			Mem_Copy(s, &unz_backup, sizeof(unz_s));
			return false;
		}

		memset(stats, 0, sizeof(struct stat));
		stats->st_size = s->cur_file_info.uncompressed_size;

		tmu_date = s->cur_file_info.tmu_date;
		newdate.tm_sec = tmu_date.tm_sec;
		newdate.tm_min = tmu_date.tm_min;
		newdate.tm_hour = tmu_date.tm_hour;
		newdate.tm_mday = tmu_date.tm_mday;
		newdate.tm_mon = tmu_date.tm_mon;
		if (tmu_date.tm_year > 1900)
			newdate.tm_year = tmu_date.tm_year - 1900;
		else
			newdate.tm_year = tmu_date.tm_year ;
		newdate.tm_isdst=-1;

		stats->st_mtime = mktime(&newdate);
		stats->st_ctime = stats->st_mtime;

		Mem_Copy(s, &unz_backup, sizeof(unz_s));
		return true;
	}

	return false;
}
コード例 #4
0
void	WSock_Init()
{
	int n;
	struct hostent *phe;
	int bestip = 0;

	Console_DPrintf("WSock_Init\n");

	if (strcmp(net_forceIP.string, "0.0.0.0") != 0)
	{
		unsigned long tmp;

		tmp = inet_addr(net_forceIP.string);
		Mem_Copy(&net_localip, (void *)&tmp, sizeof(struct in_addr));
		strcpy(net_localaddr, inet_ntoa(net_localip));
	}
	else
	{
		if (WSAStartup(0x202, &ws.wsaData) == SOCKET_ERROR)
		{
			WSACleanup();
			Console_Errorf("WSAStartup failed (%s)\n", WSAGetLastError());		
			return;
		}
	
		if (gethostname(net_localaddr, 256) == SOCKET_ERROR)
		{
			WSACleanup();
			Console_Errorf("gethostname() failed (%s)\n", WSAGetLastError());
			return;
		}
	
		phe = gethostbyname(net_localaddr);
		
	    for (n = 0; phe->h_addr_list[n] != 0; n++)
		{   
			char *ipstring;
	
	        Mem_Copy(&net_localip, phe->h_addr_list[n], sizeof(struct in_addr));
			ipstring = inet_ntoa(net_localip);
			Console_DPrintf("Local IP #%i: %s\n", n+1, ipstring);
	
			//fixme: this is a hack in case we're shared off the connection 
			//to the internet.  this won't work all the time so find a better way		
			if (strncmp(ipstring, "192.168.", 8)!=0)
				bestip = n;
	    }
	
	    Mem_Copy(&net_localip, phe->h_addr_list[bestip], sizeof(struct in_addr));
	    strcpy(net_localaddr, inet_ntoa(net_localip));
	}

//	ncLocalClient.driverData = WSock_AllocateDriverData();

	ws.nonblock = 1;
}
コード例 #5
0
ファイル: scene.cpp プロジェクト: newerthcom/savagerebirth
void	Scene_AddFxPoly (int nverts, scenefacevert_t *verts, residx_t shader, int flags)
{
	scenefacelist_t	*newface;

	newface = (scenefacelist_t*)Scene_FramePool_Alloc(sizeof(scenefacelist_t));
	if (!newface)
		return;

	newface->verts = (scenefacevert_t*)Scene_FramePool_Alloc(nverts * sizeof(scenefacevert_t));
	if (!newface->verts)
		return;

	Mem_Copy(newface->verts, verts, nverts * sizeof(scenefacevert_t));
	newface->nverts = nverts;
	newface->shader = shader;
	newface->flags = flags;

	if (flags & POLY_IS_TERRAIN_DECAL)
	{
		newface->next = scenefxfacelist_decals;
		scenefxfacelist_decals = newface;
	}
	else
	{
		newface->next = scenefxfacelist;
		scenefxfacelist = newface;
	}
}
コード例 #6
0
ファイル: scene.cpp プロジェクト: newerthcom/savagerebirth
void	Scene_AddSkyObj (sceneobj_t *skyobj)
{
	scenelist_t		*newobj;

	newobj = (scenelist_t*)Scene_FramePool_Alloc(sizeof(scenelist_t));
	if (!newobj)
		return;

	// Case: if the is a uniform scale, we will use that instead. (to maintain compatibility)
	if (skyobj->scale != 1.f)
		M_SetVec3(skyobj->scaleVec, skyobj->scale, skyobj->scale, skyobj->scale);

	Mem_Copy(newobj, skyobj, sizeof(sceneobj_t));

	newobj->next = skylist;
	newobj->obj.flags |= SCENEOBJ_SKYBOX;

	//Vid_NormalizeColor(skyobj->color, newobj->obj.color);
	if (!(skyobj->flags & SCENEOBJ_USE_AXIS))
	{
		//fill in axis
		M_GetAxis(skyobj->angle[0], skyobj->angle[1], skyobj->angle[2], newobj->obj.axis);
	}

	skylist = newobj;
}
コード例 #7
0
int		WSock_ReceivePacket(netconnection_t *nc)
{
	int ret;
	socklen_t fromlen;
	netaddr_t from;
	
	fromlen = sizeof(struct sockaddr);

	ret = recvfrom(nc->sock, (char*)nc->recv.__buf, MAX_PACKET_SIZE + HEADER_SIZE, 0, (struct sockaddr *)&from, &fromlen);
		
	if (ret < 0)
	{
		int err = WSAGetLastError();
		if (err != WSAEWOULDBLOCK)
		{
			NET_PRINTF("recvfrom() failed: error %s from %s\n", WSock_GetErrorString(err), inet_ntoa(from.sin_addr));
		}
	}
	else if (ret > 0)
	{
	
#ifdef ANAL_NETWORK_DEBUGGING
		NET_PRINTF("Net: receiving %i bytes with seq %u from port %i - flags %s %s\n", nc->recv.length, seq,
									ntohs(from->sin_port),
									flags & PACKET_RELIABLE ? "RELIABLE" : "",
									flags & PACKET_ACK ? "ACK" : "");
#endif
		Mem_Copy(&nc->recvAddr, &from, sizeof(struct sockaddr_in));
		strncpy(nc->recvAddrName, inet_ntoa(from.sin_addr), MAX_ADDRESS_LENGTH);
		nc->recv.length = ret - HEADER_SIZE;
		nc->recv.curpos = 0;
	}

	return ret;
}
コード例 #8
0
bool	WSock_PreProcessPacket(netconnection_t *nc)
{
	byte flags;
	unsigned int seq;

	//extract sequence number and flags from the packet header
	Mem_Copy(&seq, nc->recv.__buf, sizeof(unsigned int));
	seq = LittleInt(seq);
	flags = nc->recv.__buf[HEADER_FLAG_LOC];

	if (flags & PACKET_RELIABLE)
	{
		if (WSock_ProcessReliablePacket(nc, nc->recv.__buf, &nc->recvAddr))
			return true;
		else
			return false;
	}
	//okay, it's not a reliable packet, so the sequence should match the generic nonreliable sequence number
	// if not, it's probably a fragmented packet and we should throw it out
	if (seq != NONRELIABLE_SEQUENCE)
	{
		NET_PRINTF("Got invalid packet data - sequence %u\n", seq);
		return false;
	}
	if (flags & PACKET_ACK)
	{	  	
		WSock_ProcessPacketAck(nc);
		return false;
	}

	return true;
}
コード例 #9
0
bool	WSock_ProcessReliablePacket(netconnection_t *nc, unsigned char *buf, struct sockaddr_in *from)
{
	packet_t ackpacket;
	//static char ackbuf[HEADER_SIZE + sizeof(unsigned int)];
    unsigned int buf_seq;
    bool process = true;

    Mem_Copy(&buf_seq, buf, sizeof(unsigned int));
	buf_seq = LittleInt(buf_seq);
	NET_PRINTF("got reliable packet with sequence %u, waiting for %u\n", buf_seq, nc->reliableRecv_lastseq+1);

    if (buf_seq > nc->reliableRecv_lastseq+1)
    {
        //drop it, out of order - wait for the next packet before jumping ahead, to maintain transfer order
        //  don't even ACK it, so they think we never got it and resend it after resending the earlier one(s) we missed
		
        NET_PRINTF("Received out of order sequence %u, waiting for %u\n", buf_seq, nc->reliableRecv_lastseq+1);
        return false;
    }
    else if (buf_seq == nc->reliableRecv_lastseq+1)
    {
        //this is a new reliable packet that we've waiting for.  Increment the incoming sequence, and use the packet
        nc->reliableRecv_lastseq++;
		NET_PRINTF("reliable packet with sequence %u is valid, incrementing our lastseq to %u\n", buf_seq, nc->reliableRecv_lastseq);
    }
    else //buf_seq < nc->reliableRecv_lastseq+1
    {
        //this is a resend for a packet we've gotten already.  ACK it, but don't process it again
        NET_PRINTF("Received resend of reliable packet sequence %u, not using it\n", buf_seq);
        process = false;
    }
	
	//send an ACK for this reliable packet
	//HACK: write the client ID if we're a client
	memset(&ackpacket, 0, sizeof(packet_t));
	if (nc == &ncLocalClient)
	{
		Pkt_WriteShort(&ackpacket, (short)client_id);
		Pkt_WriteInt(&ackpacket, buf_seq);
	}
	else
	{
		Pkt_WriteInt(&ackpacket, buf_seq);		
	}

	//hack to stress-test the reliable packet code
	if (!net_forcedPacketDrop.value || M_Randnum(0,1) <= 0.5)
	{
		NET_PRINTF("Sending ack for reliable packet sequence %u\n", buf_seq);
	 	_WSock_SendPacket(nc->sock, (struct sockaddr *)(&nc->sendAddr), ackpacket.__buf, ackpacket.length + HEADER_SIZE, NONRELIABLE_SEQUENCE, PACKET_NORMAL | PACKET_ACK);
	}
	
	return process;
}
コード例 #10
0
ファイル: cmd.c プロジェクト: a1batross/Xash3D_ancient
/*
============
Cbuf_Execute
============
*/
void Cbuf_Execute( void )
{
	int	i;
	char	*text;
	char	line[MAX_CMD_LINE];
	int	quotes;

	while( cmd_text.cursize )
	{
		if( cmd_wait )
		{
			// skip out while text still remains in buffer, leaving it for next frame
			cmd_wait--;
			break;
		}

		// find a \n or ; line break
		text = (char *)cmd_text.data;

		quotes = 0;
		for( i = 0; i < cmd_text.cursize; i++ )
		{
			if( text[i] == '"') quotes++;
			if(!( quotes & 1 ) &&  text[i] == ';' )
				break; // don't break if inside a quoted string
			if( text[i] == '\n' || text[i] == '\r' ) break;
		}

		if( i >= MAX_CMD_LINE - 1 )
			Sys_Error( "Cbuf_Execute: command string owerflow\n" );

		Mem_Copy( line, text, i );
		line[i] = 0;

		// delete the text from the command buffer and move remaining commands down
		// this is necessary because commands (exec) can insert data at the
		// beginning of the text buffer

		if( i == cmd_text.cursize )
		{
			cmd_text.cursize = 0;
		}
		else
		{
			i++;
			cmd_text.cursize -= i;
			memmove( text, text + i, cmd_text.cursize );
		}

		// execute the command line
		Cmd_ExecuteString( line );		
	}
}
コード例 #11
0
/*
=================
AllocSurfaceExtra

allocates a new extra storage
=================
*/
static surfaceExtra_t *AllocSurfaceExtra( void )
{
	surfaceExtra_t	*se;
	
	if( numSurfaceExtras >= maxSurfaceExtras )
	{
		maxSurfaceExtras += GROW_SURFACE_EXTRAS;
		se = Malloc( maxSurfaceExtras * sizeof( surfaceExtra_t ));
		if( surfaceExtras != NULL )
		{
			Mem_Copy( se, surfaceExtras, numSurfaceExtras * sizeof( surfaceExtra_t ));
			Mem_Free( surfaceExtras );
		}
		surfaceExtras = se;
	}
	
	se = &surfaceExtras[numSurfaceExtras];
	numSurfaceExtras++;
	Mem_Copy( se, &seDefault, sizeof( surfaceExtra_t ));
	
	return se;
}
コード例 #12
0
ファイル: cmd.c プロジェクト: a1batross/Xash3D_ancient
/*
============
Cbuf_AddText

Adds command text at the end of the buffer
============
*/
void Cbuf_AddText( const char *text )
{
	int	l;

	l = com.strlen( text );
	if( cmd_text.cursize + l >= cmd_text.maxsize )
	{
		MsgDev( D_WARN, "Cbuf_AddText: overflow\n" );
		return;
	}
	Mem_Copy( &cmd_text.data[cmd_text.cursize], text, l );
	cmd_text.cursize += l;
}
コード例 #13
0
ファイル: scene.cpp プロジェクト: newerthcom/savagerebirth
void	Scene_AddOccluder (occluder_t *occluder)
{
	occluderlist_t *newoccluder;

	newoccluder = (occluderlist_t*)Scene_FramePool_Alloc(sizeof(occluder_t));
	if (!newoccluder)
		return;

	Mem_Copy(newoccluder, occluder, sizeof(occluder_t));

	newoccluder->next = occluderlist;
	newoccluder->cull = false;
	occluderlist = newoccluder;
}
コード例 #14
0
ファイル: scene.cpp プロジェクト: newerthcom/savagerebirth
void	Scene_AddLight (scenelight_t *light)
{
	scenelightlist_t *newlight;

	newlight = (scenelightlist_t*)Scene_FramePool_Alloc(sizeof(scenelightlist_t));
	if (!newlight)
		return;

	Mem_Copy(newlight, light, sizeof(scenelight_t));

	newlight->next = scenelightlist;
	newlight->cull = true;
	scenelightlist = newlight;
}
コード例 #15
0
ファイル: scene.cpp プロジェクト: newerthcom/savagerebirth
int		Scene_ClipPoly(scenefacevert_t *verts, int numVerts, plane_t *clipPlanes, int numClipPlanes, scenefacevert_t *outpoly, int maxVerts)
{
	int plane;
	int n = 0;
	scenefacevert_t workingVerts[32];
	int numWorkingVerts = numVerts;

	OVERHEAD_INIT;

	Mem_Copy(workingVerts, verts, sizeof(scenefacevert_t) * numVerts);


	for (plane = 0; plane<numClipPlanes; plane++)
	{
		n = Scene_ClipPolyToPlane(workingVerts, numWorkingVerts, &clipPlanes[plane], outpoly, maxVerts);
		
		numWorkingVerts = n;
		Mem_Copy(workingVerts, outpoly, sizeof(scenefacevert_t) * n);
	}

	Mem_Copy(outpoly, workingVerts, sizeof(scenefacevert_t) * n);

	return n;
}
コード例 #16
0
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
	MLRLookUpLight::LoadMap()
{
	Check_Object(this);

	Stuff::FileStream element_stream(mapName);

	unsigned char *map = new unsigned char [mapZoneCountX*mapZoneCountZ*256*256];
	Check_Pointer(map);
	element_stream.ReadBytes(map, mapZoneCountX*mapZoneCountZ*256*256);

	Verify(maps==NULL);
	maps = new unsigned char * [mapZoneCountX * mapZoneCountZ];
	Check_Pointer(maps);

	int i, j, k;
	for(j=0;j<mapZoneCountZ;j++)
	{
		for(i=0;i<mapZoneCountX;i++)
		{
			maps[j*mapZoneCountX+i] = new unsigned char [256*256];
			Check_Pointer(maps[j*mapZoneCountX+i]);
		}
	}

	unsigned char *uptr = map;
	for(j=0;j<mapZoneCountZ;j++)
	{
		for(k=0;k<256;k++)
		{
			for(i=0;i<mapZoneCountX;i++)
			{
				Mem_Copy(&maps[j*mapZoneCountX+i][k*256], uptr, 256, (256-k)*256);
				uptr += 256;


//					&map[(256*j+k)*(mapZoneCountX*256) + i*256]
			}
		}
	}

	Check_Pointer(map);
	delete map;

	return false;
}
コード例 #17
0
ファイル: cmd.c プロジェクト: a1batross/Xash3D_ancient
/*
============
Cbuf_InsertText

Adds command text immediately after the current command
Adds a \n to the text
FIXME: actually change the command buffer to do less copying
============
*/
void Cbuf_InsertText (const char *text)
{
	int	i, len;

	len = com.strlen( text ) + 1;
	if( len + cmd_text.cursize > cmd_text.maxsize )
	{
		MsgDev( D_WARN, "Cbuf_InsertText overflowed\n" );
		return;
	}

	// move the existing command text
	for( i = cmd_text.cursize - 1; i >= 0; i-- )
	{
		cmd_text.data[i + len] = cmd_text.data[i];
	}

	// copy the new text in
	Mem_Copy( cmd_text.data, (char *)text, len - 1 );
	cmd_text.data[len - 1] = '\n'; // add a \n
	cmd_text.cursize += len;
}
コード例 #18
0
ファイル: drv_rd.c プロジェクト: dack2cc/KODE
void drv_rd_Setup(void)
{
    CPU_INT32U       uiBlkIdx = CPU_EXT_RAM_DISK_START;
    CPU_INT32U       uiBlkCnt = CPU_EXT_RAM_DISK_SIZE / CPU_EXT_HD_BLOCK_SIZE;
    DRV_BLK_BUFFER * pstBuf   = 0;
    CPU_INT08U *     pbyDst   = drv_rd_stCtl.pbyStart;
    CPU_INT32U       uiCpSize = 0;

    if ((0 == drv_rd_stCtl.pbyStart) || (0 == drv_rd_stCtl.uiSize)) {
        return;
    }

    drv_disp_Printf("[RamDisk ][Loading...] \r\n");

    while (uiBlkCnt > 0) {
        if ((uiCpSize + CPU_EXT_HD_BLOCK_SIZE) > drv_rd_stCtl.uiSize) {
            \
            CPUExt_CorePanic("[drv_rd_Setup][buffer overflow]");
        }

        if (uiBlkCnt > 2) {
            pstBuf = drv_blk_ReadAhead(0x300, uiBlkIdx, uiBlkIdx + 1, uiBlkIdx + 2, -1);
        } else {
            pstBuf = drv_blk_Read(0x300, uiBlkIdx);
        }

        if (0 == pstBuf) {
            CPUExt_CorePanic("[drv_rd_Setup][reading block failed]");
        }

        Mem_Copy(pbyDst, pstBuf->pbyData, CPU_EXT_HD_BLOCK_SIZE);
        drv_blk_Release(pstBuf);

        uiCpSize += CPU_EXT_HD_BLOCK_SIZE;
        pbyDst   += CPU_EXT_HD_BLOCK_SIZE;
        uiBlkIdx++;
        uiBlkCnt--;
    }
}
コード例 #19
0
ファイル: unzip.cpp プロジェクト: newerthcom/savagerebirth
void    ZIP_SystemDir(void *archive, char *_directory, char *wildcard, bool recurse,
				       void(*dirCallback)(const char *dir, void *userdata),
					   void(*fileCallback)(const char *filename, void *userdata),
					   void *userdata)
{
	GPatternSpec* pattern;
	unz_s* s;
	unz_s unz_backup;
	int err, numFiles;
	char *slash, *fname;
	char filename[384] = {0};
	char directory[256] = {0};
	char enumdir[256] = {0};

	if (archive==NULL)
		return;
	s=(unz_s*)archive;

	if (!_directory || strlen(_directory) == 0)
		BPrintf(directory, 1024, "");
	else
		BPrintf(directory, 1024, "%s%s", (_directory[0] == '/') ? &_directory[1] : _directory, (_directory[strlen(_directory)-1] == '/') ? "" : "/");

	BPrintf(filename, 1024, "%s%s", directory, wildcard);
	pattern = g_pattern_spec_new(filename);

	Console_DPrintf("Doing a System_Dir in a ZIP file matching %s\n", filename);
	
	err = unzGoToFirstFile((unzFile)s);	

	numFiles = 0;
	while (err == UNZ_OK)
	{
		unzGetCurrentFileInfo((unzFile)s,NULL,
								filename,1023,
								NULL,0,NULL,0);
		filename[1023] = 0;

		//Console_DPrintf("...%s\n", filename);
		if (strcmp(filename, directory) != 0 && strstr(filename, "CVS/") == 0) //don't call a callback for the directory itself
		{
			if (g_pattern_match_string(pattern, filename))
			{
				bool goAhead;
				slash = strchr(&filename[strlen(directory)], '/');
				goAhead = (!slash || (slash == filename + strlen(filename) - 1) || recurse) != 0;
				// UTTAR: Hack: NOTE: Dircallbacks could be activated several times with this method now! :(
				//if (goAhead)
				{
					if (filename[strlen(filename)-1] != '/' && goAhead)
					{
						if (fileCallback)
						{
							goAhead = 0;
							slash = strrchr(filename, '/');
							if (!slash)
							{
								fname = filename;
								BPrintf(enumdir, 1, "");
							}
							else
							{
								fname = slash+1;
								BPrintf(enumdir, slash - filename + 1, "%s", filename);
							}
							Cvar_SetVar(&sys_enumdir, enumdir);
							//Console_DPrintf("calling fileCallback for %s (in %s)\n", fname, sys_enumdir.string);
							Mem_Copy(&unz_backup, s, sizeof(unz_s));
							fileCallback(fname, userdata);
							Mem_Copy(s, &unz_backup, sizeof(unz_s));
						}
					}
					if(dirCallback && goAhead)
					{
						if(slash)
							*slash = 0;
						if (dirCallback)
						{
							//Console_DPrintf("calling dirCallback for %s\n", filename);
							dirCallback(filename, userdata);
						}
					}
				}
			}
		}
		numFiles++;
		err = unzGoToNextFile((unzFile)s);
	}
	
	Console_DPrintf("Done reading zip file contents - %i files\n", numFiles);
	if (err != UNZ_END_OF_LIST_OF_FILE)
		Console_DPrintf("ZIP error: err was %i\n", err);

	Cvar_SetVar(&sys_enumdir, "");

	g_pattern_spec_free(pattern);
}
コード例 #20
0
ファイル: ts_serv.c プロジェクト: DataCollect/lpc1768
void ts_recv_isr(void *recv_buff_0, void *recv_nbr_0)
{
    OS_ERR err;
    uint32_t i;
    uint32_t start_pos;
    uint8_t  *recv_buff = (uint8_t *)recv_buff_0;
    uint32_t *recv_nbr  = (uint32_t *)recv_nbr_0;
    uint32_t len;
    
    if (*recv_nbr >= TS_RECV_BUFF_LEN)
    {
        *recv_nbr = 0;
    }
    *recv_nbr += UART_Receive(LPC_UART0, recv_buff + *recv_nbr, \
                              TS_RECV_BUFF_LEN - *recv_nbr);
    
    start_pos = *recv_nbr - 1;
    if (*recv_nbr > MIN_RECV_LEN)   
    {
        for (i = 0; i < *recv_nbr-1; i++)
        {
            //if (recv_buff[i] == 0xa5 && recv_buff[i+1] == 0x5a)
            //if (recv_buff[i] == 0xa5 && recv_buff[i+1] == 0x5a)
            if (recv_buff[i] == START_CHAR)
            {
                start_pos = i;
                break;
            }
        }
    }
    else 
        return;

    if (start_pos < *recv_nbr - 1 )
    {  
        if (start_pos != 0)
        {
            for (i = 0; i < *recv_nbr - start_pos ; i++)
            {
                recv_buff[i] = recv_buff[i + start_pos];    
            }
            *recv_nbr -= start_pos;
        }

        if (*recv_nbr > MIN_RECV_LEN)
        {
            //if (*recv_nbr == recv_buff[2] + 3)
            if (recv_buff[*recv_nbr - 2] == END_CHAR_1 && recv_buff[*recv_nbr - 1] == END_CHAR_2)
            {
                len = *recv_nbr;
                
                recv_buff[len]     = recv_buff[4];
                recv_buff[len + 1] = recv_buff[5];
                recv_buff[len + 2] = recv_buff[6];
                
                Mem_Copy(recv_buff_copy, recv_buff, len + 3);
                *recv_nbr = 0;
                
                OSTaskQPost(&ts_serv_task_tcb,
                            (uint8_t *)recv_buff_copy,
                            len + 3,
                            OS_OPT_POST_FIFO,
                            &err);  
                
            }
        }
        else
            return;
    }
    else
    {
        *recv_nbr = 1;
         recv_buff[0] = recv_buff[start_pos];  
    }
   
}
コード例 #21
0
ファイル: simudata.c プロジェクト: chenzhengxi/2060-83
void Simu_Send_Data(void* ps)
{
  INT32S re=0,i,j,k,l,m,nKeyNo;
  INT32S nChDataSize=sizeof(struct tagChData2060)+(_MAX_KEY_PT_CNT+g_nDatalth-1)*sizeof(INT32S);
  float fSign=0;
  char inf[256]={0};
  float fv[50];
  //void* p;
  INT8S p[sizeof(struct tagChData2060)+(_MAX_KEY_PT_CNT+_DEFAULT_DATA_LTH-1)*sizeof(INT32S)];
  INT8S* pData=(INT8S *)g_pOutChData;
  struct tagChData2060*  pchData=0;
  
  INT32S nCurSit[_MAX_JKEY_CHANNEL_CNT]={0};
  INT32S nSpeed[_MAX_JKEY_CHANNEL_CNT];
  INT32S nLth[_MAX_JKEY_CHANNEL_CNT];
  
  PAlertNode pAlert=g_AlertNode;
  
  struct tagChValue *pAv=g_pSimuAlertMeasureValue;	
  
  PTranNode pTran=g_TranNode;
  struct tagChValue chValue;
  
  INT32S nRpmFlag=0;
  
  //p=malloc(sizeof(struct tagChData2060)+(_MAX_KEY_PT_CNT+g_nDatalth-1)*sizeof(INT32S));
  Mem_Clr(p, sizeof(p));
  pchData=(struct tagChData2060*)p;
  
  chValue.nTrigerTime=0;
  chValue.nChNo=0;
  chValue.nRPM=g_nBasicRPM;
  chValue.nAlertFlag=0;
  chValue.nAllMeasureValue=g_fNormalAlp;
  chValue.nAllPhase=0;
  chValue.n1xV=g_fLevel*g_fCof1x;
  chValue.n1xP=0;
  chValue.n2xV=g_fLevel*g_fCof2x;
  chValue.n2xP=0;
  chValue.n05xV=g_fLevel*g_fCofP5x;
  chValue.n05xP=0;
  chValue.nRpmFlag=0;
  i=0;
  do{
    // _log("Start Send SimuData\n");
    for(m=0;;m++)
    {		
      INT32S nChIndex=0;
      CheckSimuData();
      //		OSTimeDly(5);
      if(g_nChValueFlag!=3||g_nChDataFlag!=3)
      {
        //OSTimeDly(g_SendTimeInterval/(1000/OS_TICKS_PER_SEC));
        //OSTimeDly(1);
        OSTimeDly(1 );
        continue;
      }
      OSSchedLock( );//禁止任务切换 
      g_nChValueFlag=0;
      g_nChDataFlag=0;
      if(i==50)
        i=i;
      for(j=0;j<g_nChcnt;j++)
      {
        //	nSign=20*sin(6.2832*(m/100.+nSit[j]/71.));
        fSign=(g_nSit[j]*48.0/g_nChcnt-24.0)*(1+0.3*sin(6.2832*(m/10.)));
        if(g_nChKeyNo[g_nSit[j]]>=_START_KEY_CH)
        {
          nKeyNo=g_nChKeyNo[g_nSit[j]]-_START_KEY_CH;
          nSpeed[nKeyNo]=*g_nKeySpeed[nKeyNo][i];
          g_nCaltKeySpeed[nKeyNo]=nSpeed[nKeyNo];
        }
        else
          nSpeed[nKeyNo]=-1;
        //	if(nSpeed[nKeyNo]>3000)
        //		nSpeed[nKeyNo]=nSpeed[nKeyNo];
        nRpmFlag=0;
        for(k=0;k<g_TranNode[nKeyNo].nEventcnt;k++)
        {
          if(i>= g_TranNode[nKeyNo].nTigerTime[2*k]&&i<= g_TranNode[nKeyNo].nTigerTime[2*k+1])
          {
            nRpmFlag=1;
            break;
          }
        }
        //		CheckSimuData();
        if(i==0)
          i=i;
        if(i==pAlert->nTigerTime)//报警时间
        {
          pAv->nRPM=nSpeed[nKeyNo];
          pAv->nRpmFlag=nRpmFlag;
          //////输出报警通道测量值pAv
          //g_pOutChValue=pAv;
          Mem_Copy(g_pOutChValue+g_nSit[j],pAv,sizeof(struct tagChValue));
          pAv++;
          
        }
        else//非报警通道
        {
          
          chValue.nTrigerTime=i;
          chValue.nChNo=g_nSit[j];
          chValue.nRPM=nSpeed[nKeyNo];
          chValue.nRpmFlag=nRpmFlag;
          //g_pOutChValue=&chValue;
          
          Mem_Copy(g_pOutChValue+g_nSit[j],&chValue,sizeof(struct tagChValue));
          g_pOutChValue[g_nSit[j]].nAllMeasureValue*=(100+fSign)/100.;
          g_pOutChValue[g_nSit[j]].n1xV*=(100+fSign)/100.;
          g_pOutChValue[g_nSit[j]].n2xV*=(100+fSign)/100.;
          g_pOutChValue[g_nSit[j]].n05xV*=(100+fSign)/100.;
          fv[g_nSit[j]]=g_pOutChValue[g_nSit[j]].nAllMeasureValue;
          g_nChValueFlag=1;
          
          ///////输出正常通道测量值chValue
        }
        //		CheckSimuData();
        //读取转速为nSpeed[nKeyNo]下的通道原始数据
        if(i==680)
          i=i;
        memcpy(pchData,((INT8S*)g_pSimuTranPiece)+nSpeed[nKeyNo]*nChDataSize,nChDataSize);
        //Mem_Copy(pchData,((INT8S*)g_pSimuTranPiece)+nSpeed[nKeyNo]*nChDataSize,nChDataSize);
        //	CheckSimuData();
        nLth[nKeyNo]=nChDataSize-(_MAX_KEY_PT_CNT-pchData->nKeycnt)*sizeof(INT32S);
        pchData->nTrigerTime=i;
        pchData->nChNo=g_nSit[j];
        
        if(i==pAlert->nTigerTime&&g_nSit[j]==pAlert->nChNo[nChIndex])//报警通道
        {
          INT32S step;
          INT32S* p32s=&pchData->nKeycnt+1;
          p32s+=pchData->nKeycnt;
          for(step=0;step<g_nDatalth;step++)//修改报警通道原始数据幅值
          {
           // p32s[step]=p32s[step]*pAlert->fCof[nChIndex]*g_12Param.SignalChannel[g_nSit[j]].fSensority;
            //czx
            p32s[step]=p32s[step]*pAlert->fCof[nChIndex];
          }					
          nChIndex++;
        }
        else
        {
          INT32S step;
          INT32S* p32s=(&pchData->nKeycnt)+1;
          p32s+=pchData->nKeycnt;
          
          if(i>600)
            i=i;
          if(g_nSit[j]/2*2==g_nSit[j])
          {
            for(step=0;step<g_nDatalth;step++)//修改报警通道原始数据幅值
            {
              //p32s[step]*=(100+fSign)/100.*g_12Param.SignalChannel[g_nSit[j]].fSensority;
              //czx
              p32s[step]*=(100+fSign)/100.;
            }
          }else
          {
            for(step=0;step<g_nDatalth;step++)//修改报警通道原始数据幅值
            {
              //p32s[step]*=(100-fSign)/100.*g_12Param.SignalChannel[g_nSit[j]].fSensority;
              //czx
              p32s[step]*=(100-fSign)/100.;
            }
            
          }				
          nChIndex++;
        }
        if(i==350)
          i=i;
        //g_pOutChData=pchData;
        Mem_Clr(inf, 256);
        //	sprintf(inf,"Ouput %d Sit\n",g_nCurWriteSit);
        //	_log(inf);
        Mem_Copy(g_pOutChDataArray[g_nSit[j]],pchData,nChDataSize);
        
      }
      if(i==50)
        i=i;
      //输出所有通道数据头
      OutputChValue();//	
      //输出所有通道原始数据
      Simu_Write_ChData(g_nLength,g_nChNo,_MAX_SIGNAL_CHANNEL_CNT,
                        g_nFpgaDynamicChDataOffset,g_nFpgaDynamicKeyDataOffset,g_nFpgaDynamicChDataSampleStep,
                        g_nFpgaTranDataOffset,g_nFpgaTranKeyDataOffset,g_nFpgaTranDataSampleStep);
      for(l=0;l<_MAX_SIGNAL_CHANNEL_CNT/_FPGA_GROUP_CHANNEL_CNT;l++)
        receive_channel_data();
      g_nChValueFlag=3;
      g_nChDataFlag=3;
      //OSTimeDly(g_SendTimeInterval/(1000/OS_TICKS_PER_SEC)/(_MAX_SIGNAL_CHANNEL_CNT/_FPGA_GROUP_CHANNEL_CNT));
      if(i>=pAlert->nTigerTime)
        pAlert++;
      //	_log("Deal Speed Too Slow,Data Will lose\n");
      g_bDataValid=1;
      
      for(l=0;l<_MAX_JKEY_CHANNEL_CNT;l++)
      {
        if(i==g_nTigerTime[l][nCurSit[l]])
        {
          nCurSit[l]++;
        }
      }
      i++;
      if(i==g_nAllcnt)
      {
        i=0;
        //		break;
      }
      
      OSSchedUnlock( );//允许任务切换 
      CheckSimuData();
      sleep_ms(100);
    }
    //_log("End Send SimuData\n");
  }while(1);
  //free(p);	
}
コード例 #22
0
ファイル: simudata.c プロジェクト: chenzhengxi/2060-83
INT32S	Simu_Write_ChData(INT32S nLength[],INT32S nChNo[],INT32S nCnt,
                          INT32U nDynamicChDataOffset[],INT32U nDynamicKeyOffset[],INT32U nDynamicStep[],
                          INT32U nTranChDataOffset[],INT32U nTranKeyOffset[],INT32U nTranStep[])
{
  INT32S re=0;
  INT32S i=0,j,nLth,nSit;
  INT8S* pData=(INT8S *)g_pOutChData;
  INT32S nChDataSize=sizeof(struct tagChData2060)+(_MAX_KEY_PT_CNT+g_nDatalth-1)*sizeof(INT32S);
  INT32S noKey[]={0,0,0,0};
  
  
  for(i=0;i<_MAX_SIGNAL_CHANNEL_CNT;i++)
  {
    if(nChNo[re]==i)
    {	
      INT8S* p=(INT8S *)g_pOutChDataArray[i];
      INT32S* pChData=(INT32S *)(p+sizeof(struct tagChData2060)+(_MAX_KEY_PT_CNT-1)*sizeof(INT32S));
      Mem_Clr(g_nDynamicResult, sizeof(g_nDynamicResult));
      nLth=(g_nDynamicStart[i]+_DEFAULT_DATA_LTH)/nDynamicStep[i];
      g_nDynamicResult[0]=nLth;
      nSit=g_nDynamicStart[i];
      for(j=1;j<nLth+1;j++)
      {
        g_nDynamicResult[j]=pChData[nSit];
        nSit+=nDynamicStep[i];
      }
      WriteRamDisk(nDynamicChDataOffset[i],g_nDynamicResult,nLth+1);
      g_nDynamicStart[i]=(g_nDynamicStart[i]+_DEFAULT_DATA_LTH)%nDynamicStep[i];
      
      Mem_Clr(g_nTranResult, sizeof(g_nTranResult));
      nLth=(g_nTranStart[i]+_DEFAULT_DATA_LTH)/nTranStep[i];
      g_nTranResult[0]=nLth;
      nSit=g_nTranStart[i];
      for(j=1;j<nLth+1;j++)
      {
        g_nTranResult[j]=pChData[nSit];
        nSit+=nTranStep[i];
      }
      WriteRamDisk(nTranChDataOffset[i],g_nTranResult,nLth+1);
      g_nTranStart[i]=(g_nTranStart[i]+_DEFAULT_DATA_LTH)%nTranStep[i];
      re++;
      if(re==nCnt)
        break;
    }
  }
  
  for(i=0;i<_MAX_JKEY_CHANNEL_CNT;i++)
  {
    if(g_pOutChDataArray[g_nKeyChannSit[i]]->nKeycnt)
    {
      nLth=g_pOutChDataArray[g_nKeyChannSit[i]]->nKeycnt;
      g_nKeyResult[0]=nLth;
      nSit=g_nDynamicStart[i];
      Mem_Copy(g_nKeyResult+1,g_pOutChDataArray[g_nKeyChannSit[i]]->pData,nLth*sizeof(INT32S));
      for(j=1;j<nLth+1;j++)
      {
        g_nKeyResult[j]/=nDynamicStep[i];
      }
      WriteRamDisk(nDynamicKeyOffset[i],g_nKeyResult,nLth+1);
      Mem_Copy(g_nKeyResult+1,g_pOutChDataArray[g_nKeyChannSit[i]]->pData,nLth*sizeof(INT32S));
      for(j=1;j<nLth+1;j++)
      {
        g_nKeyResult[j]/=nTranStep[i];
      }
      WriteRamDisk(nTranKeyOffset[i],g_nKeyResult,nLth+1);
    }else
    {
      WriteRamDisk(nDynamicKeyOffset[i],noKey,sizeof(noKey)/sizeof(INT32S));
      WriteRamDisk(nTranKeyOffset[i],noKey,sizeof(noKey)/sizeof(INT32S));
    }
  }
  
  return re;
}
コード例 #23
0
ファイル: simudata.c プロジェクト: chenzhengxi/2060-83
INT32S WriteRamDisk(INT32U nOffset,INT32S pData[],INT32S nLength)
{
  INT32S re=0;
  Mem_Copy(g_pChData+nOffset,pData,nLength*sizeof(INT32S));
  return re;
}
コード例 #24
0
ファイル: serial_buf.c プロジェクト: ptracton/experimental
CPU_SIZE_T  SerialBuf_Rd (SERIAL_BUF  *pbuf,
                          CPU_INT08U  *pdest,
                          CPU_SIZE_T   len)
{
    CPU_SIZE_T   buf_avail;
    CPU_SIZE_T   buf_copy_start;
    CPU_SIZE_T   buf_copy_end;
    CPU_SIZE_T   buf_copy_tot;
    CPU_SIZE_T   ix_rd;
    CPU_SIZE_T   ix_rd_new;
    CPU_SIZE_T   buf_len;
    CPU_INT08U  *pdest_08;
    CPU_SR_ALLOC();


    CPU_CRITICAL_ENTER();
    buf_len   = pbuf->Len;
    buf_avail = buf_len - pbuf->EmptyCnt;                       /* Calc nbr data octets in buf.                         */
    pdest_08  = (CPU_INT08U *)pdest;



    if (buf_avail == 0) {                                       /* ------------------ HANDLE EMPTY BUF ---------------- */
        CPU_CRITICAL_EXIT();
        return ((CPU_SIZE_T)0);
    }



                                                                /* ------------- CALC BUF IX & LEN TO COPY ------------ */
    ix_rd          = pbuf->IxRd;
    buf_copy_tot   = DEF_MIN(buf_avail,    len);                /* Calc nbr data octets tot to copy.                    */
    buf_copy_end   = DEF_MIN(buf_copy_tot, buf_len - ix_rd);    /* Calc nbr data octets to copy from buf end.           */
    buf_copy_start = buf_copy_tot - buf_copy_end;               /* Calc nbr data octets to copy from buf start.         */
    if (buf_copy_start > 0) {                                   /* Update buf ix rd.                                    */
        pbuf->IxRd = buf_copy_start;
    } else {
        ix_rd_new = ix_rd + buf_copy_tot;
        if (ix_rd_new == buf_len) {
            pbuf->IxRd = 0;
        } else {
            pbuf->IxRd = ix_rd_new;
        }
    }
    CPU_CRITICAL_EXIT();

                                                                /* --------------- COPY DATA AT BUF END --------------- */
                                                                /* Copy data.                                           */
    Mem_Copy((void *)pdest_08, (void *)&pbuf->DataPtr[ix_rd], buf_copy_end);
                                                                /* -------------- COPY DATA AT BUF START -------------- */
    pdest_08 += buf_copy_end;                                   /* Adj buf ptr.                                         */
                                                                /* Copy data.                                           */
    Mem_Copy((void *)pdest_08, (void *)&pbuf->DataPtr[0], buf_copy_start);



    CPU_CRITICAL_ENTER();
    pbuf->EmptyCnt += buf_copy_tot;                             /* Update buf empty octets rem.                         */
    CPU_CRITICAL_EXIT();

    return (buf_copy_tot);
}
コード例 #25
0
ファイル: cm_trisoup.c プロジェクト: a1batross/Xash3D_ancient
/*
==================
CM_SurfaceCollideFromTriangleSoup
==================
*/
static void CM_SurfaceCollideFromTriangleSoup( cTriangleSoup_t *triSoup, cSurfaceCollide_t *sc )
{
	float	*p1, *p2, *p3;
	int	i, i1, i2, i3;
	cfacet_t	*facet;

	numPlanes = 0;
	numFacets = 0;

#ifdef USE_HASHING
	// initialize hash table
	Mem_Set( planeHashTable, 0, sizeof( planeHashTable ));
#endif

	// find the planes for each triangle of the grid
	for( i = 0; i < triSoup->numTriangles; i++ )
	{
		p1 = triSoup->points[i][0];
		p2 = triSoup->points[i][1];
		p3 = triSoup->points[i][2];

		triSoup->trianglePlanes[i] = CM_FindPlane( p1, p2, p3 );
	}

	// create the borders for each triangle
	for( i = 0; i < triSoup->numTriangles; i++ )
	{
		facet = &facets[numFacets];
		Mem_Set( facet, 0, sizeof( *facet ));

		i1 = triSoup->indexes[i*3+0];
		i2 = triSoup->indexes[i*3+1];
		i3 = triSoup->indexes[i*3+2];

		p1 = triSoup->points[i][0];
		p2 = triSoup->points[i][1];
		p3 = triSoup->points[i][2];

		facet->surfacePlane = triSoup->trianglePlanes[i];

		// try and make a quad out of two triangles
#if 0
		if( i != triSoup->numTriangles - 1 )
		{
			int	i4, i5, i6;
			float	*p4;

			i4 = triSoup->indexes[i*3+3];
			i5 = triSoup->indexes[i*3+4];
			i6 = triSoup->indexes[i*3+5];

			if( i4 == i3 && i5 == i2 )
			{
				p4 = triSoup->points[i][5]; // vertex at i6

				if(CM_GenerateFacetFor4Points( facet, p1, p2, p4, p3 ))
				{
					CM_SetBorderInward( facet, triSoup, i, 0 );

					if( CM_ValidateFacet( facet ))
					{
						CM_AddFacetBevels( facet );
						numFacets++;

						i++; // skip next tri
						continue;
					}
				}
			}
		}
#endif

		if( CM_GenerateFacetFor3Points( facet, p1, p2, p3 ))
		{
			CM_SetBorderInward( facet, triSoup, i, 0 );

			if( CM_ValidateFacet( facet ))
			{
				CM_AddFacetBevels( facet );
				numFacets++;
			}
		}
	}

	// copy the results out
	sc->numPlanes = numPlanes;
	sc->planes = Mem_Alloc( cms.mempool, numPlanes * sizeof( *sc->planes ));
	Mem_Copy( sc->planes, planes, numPlanes * sizeof( *sc->planes ));

	sc->numFacets = numFacets;
	sc->facets = Mem_Alloc( cms.mempool, numFacets * sizeof( *sc->facets ));
	Mem_Copy( sc->facets, facets, numFacets * sizeof( *sc->facets ));
}
コード例 #26
0
/*
 ==================
 R_ClipPolygon
 ==================
*/
bool R_ClipPolygon (int numPoints, vec3_t *points, const cplane_t plane, float epsilon, int *numClipped, vec3_t *clipped){

	vec3_t	tmpVector, tmpVector2;
	float	dists[MAX_POLYGON_POINTS];
	int		sides[MAX_POLYGON_POINTS];
	bool	frontSide, backSide;
	float	frac;
	int		i;

	if (numPoints >= MAX_POLYGON_POINTS - 2)
		Com_Error(ERR_DROP, "R_ClipPolygon: MAX_POLYGON_POINTS hit");

	*numClipped = 0;

	// Determine sides for each point
	frontSide = false;
	backSide = false;

	for (i = 0; i < numPoints; i++){
		dists[i] = PlaneDistance(plane.normal, plane.dist, points[i]);

		if (dists[i] > epsilon){
			sides[i] = PLANESIDE_FRONT;
			frontSide = true;
			continue;
		}

		if (dists[i] < -epsilon){
			sides[i] = PLANESIDE_BACK;
			backSide = true;
			continue;
		}

		sides[i] = PLANESIDE_ON;
	}

	if (!frontSide)
		return false;	// Not clipped

	if (!backSide){
		*numClipped = numPoints;
		Mem_Copy(clipped, points, numPoints * sizeof(vec3_t));

		return true;
	}

	// Clip it
	VectorCopy(points[0], points[i]);

	dists[i] = dists[0];
	sides[i] = sides[0];

	for (i = 0; i < numPoints; i++){
		if (sides[i] == PLANESIDE_ON){
			VectorCopy(points[i], clipped[(*numClipped)++]);
			continue;
		}

		if (sides[i] == PLANESIDE_FRONT)
			VectorCopy(points[i], clipped[(*numClipped)++]);

		if (sides[i+1] == PLANESIDE_ON || sides[i+1] == sides[i])
			continue;

		if (dists[i] == dists[i+1])
			VectorCopy(points[i], clipped[(*numClipped)++]);
		else {
			frac = dists[i] / (dists[i] - dists[i+1]);

			VectorSubtract(points[i+1], points[i], tmpVector);
			VectorMA(points[i], frac, tmpVector, tmpVector2);
			VectorCopy(tmpVector2, clipped[(*numClipped)++]);
		}
	}

	return true;
}
コード例 #27
0
ファイル: map.c プロジェクト: a1batross/Xash3D_ancient
/*
=================
ParseRawBrush

parses the sides into buildBrush->sides[], nothing else.
no validation, back plane removal, etc.
=================
*/
static void ParseRawBrush( bool onlyLights )
{
	side_t		*side;
	float		planePoints[3][3];
	int		planenum;
	char 		name[MAX_SHADERPATH];
	char		shader[MAX_SHADERPATH];
	shaderInfo_t	*si;
	token_t		token;
	vects_t		vects;
	int		flags;
	
	buildBrush->numsides = 0;
	buildBrush->detail = false;
	
	if( g_bBrushPrimit == BRUSH_RADIANT )
		Com_CheckToken( mapfile, "{" );
	
	while( 1 )
	{
		if( !Com_ReadToken( mapfile, SC_ALLOW_NEWLINES|SC_COMMENT_SEMICOLON, &token ))
			break;
		if( !com.stricmp( token.string, "}" )) break;
		if( g_bBrushPrimit == BRUSH_RADIANT )
		{
			while( 1 )
			{
				if( com.strcmp( token.string, "(" ))
					Com_ReadToken( mapfile, 0, &token );
				else break;
				Com_ReadToken( mapfile, SC_ALLOW_NEWLINES, &token );
			}
		}
		Com_SaveToken( mapfile, &token );
		
		if( buildBrush->numsides >= MAX_BUILD_SIDES )
			Sys_Break( "Entity %i, Brush %i MAX_BUILD_SIDES\n", buildBrush->entityNum, buildBrush->brushNum );
		
		side = &buildBrush->sides[ buildBrush->numsides ];
		Mem_Set( side, 0, sizeof( *side ));
		buildBrush->numsides++;
		
		// read the three point plane definition
		Com_Parse1DMatrix( mapfile, 3, planePoints[0] );
		Com_Parse1DMatrix( mapfile, 3, planePoints[1] );
		Com_Parse1DMatrix( mapfile, 3, planePoints[2] );
		
		// read the texture matrix
		if( g_bBrushPrimit == BRUSH_RADIANT )
			Com_Parse2DMatrix( mapfile, 2, 3, (float *)side->texMat );
		
		// read the texturedef or shadername
		Com_ReadToken( mapfile, SC_ALLOW_PATHNAMES|SC_PARSE_GENERIC, &token );
		com.strncpy( name, token.string, sizeof( name ));
		
		if( g_bBrushPrimit == BRUSH_WORLDCRAFT_22 || g_bBrushPrimit == BRUSH_GEARCRAFT_40 ) // Worldcraft 2.2+
                    {
			// texture U axis
			Com_ReadToken( mapfile, 0, &token );
			if( com.strcmp( token.string, "[" )) Sys_Break( "missing '[' in texturedef (U)\n" );
			Com_ReadFloat( mapfile, false, &vects.hammer.UAxis[0] );
			Com_ReadFloat( mapfile, false, &vects.hammer.UAxis[1] );
			Com_ReadFloat( mapfile, false, &vects.hammer.UAxis[2] );
			Com_ReadFloat( mapfile, false, &vects.hammer.shift[0] );
			Com_ReadToken( mapfile, 0, &token );
			if( com.strcmp( token.string, "]" )) Sys_Break( "missing ']' in texturedef (U)\n" );

			// texture V axis
			Com_ReadToken( mapfile, 0, &token );
			if( com.strcmp( token.string, "[" )) Sys_Break( "missing '[' in texturedef (V)\n" );
			Com_ReadFloat( mapfile, false, &vects.hammer.VAxis[0] );
			Com_ReadFloat( mapfile, false, &vects.hammer.VAxis[1] );
			Com_ReadFloat( mapfile, false, &vects.hammer.VAxis[2] );
			Com_ReadFloat( mapfile, false, &vects.hammer.shift[1] );
			Com_ReadToken( mapfile, 0, &token );
			if( com.strcmp( token.string, "]" )) Sys_Break( "missing ']' in texturedef (V)\n");

			// texture rotation is implicit in U/V axes.
			Com_ReadToken( mapfile, 0, &token );
			vects.hammer.rotate = 0;

			// texure scale
			Com_ReadFloat( mapfile, false, &vects.hammer.scale[0] );
			Com_ReadFloat( mapfile, false, &vects.hammer.scale[1] );

			if( g_bBrushPrimit == BRUSH_GEARCRAFT_40 )
			{
				Com_ReadLong( mapfile, false, &flags );	// read gearcraft flags
				Com_SkipRestOfLine( mapfile );	// gearcraft lightmap scale and rotate

				if( flags & GEARBOX_DETAIL )
					side->compileFlags |= C_DETAIL;

			}
                    }
		else if( g_bBrushPrimit == BRUSH_WORLDCRAFT_21 || g_bBrushPrimit == BRUSH_QUARK )
		{
			// worldcraft 2.1-, old Radiant, QuArK
			Com_ReadFloat( mapfile, false, &vects.hammer.shift[0] );
			Com_ReadFloat( mapfile, false, &vects.hammer.shift[1] );
			Com_ReadFloat( mapfile, false, &vects.hammer.rotate );
			Com_ReadFloat( mapfile, false, &vects.hammer.scale[0] );
			Com_ReadFloat( mapfile, SC_COMMENT_SEMICOLON, &vects.hammer.scale[1] );
                    }

		// set default flags and values
		com.sprintf( shader, "textures/%s", name );
		if( onlyLights ) si = &shaderInfo[0];
		else si = ShaderInfoForShader( shader );

		side->shaderInfo = si;
		side->surfaceFlags = si->surfaceFlags;
		side->contentFlags = si->contentFlags;
		side->compileFlags = si->compileFlags;
		side->value = si->value;
		
		// bias texture shift for non-radiant sides
		if( g_bBrushPrimit != BRUSH_RADIANT && si->globalTexture == false )
		{
			vects.hammer.shift[0] -= (floor( vects.hammer.shift[0] / si->shaderWidth ) * si->shaderWidth);
			vects.hammer.shift[1] -= (floor( vects.hammer.shift[1] / si->shaderHeight ) * si->shaderHeight);
		}
		
		// historically, there are 3 integer values at the end of a brushside line in a .map file.
		// in quake 3, the only thing that mattered was the first of these three values, which
		// was previously the content flags. and only then did a single bit matter, the detail
		// bit. because every game has its own special flags for specifying detail, the
		// traditionally game-specified BASECONT_DETAIL flag was overridden for Q3Map 2.3.0
		// by C_DETAIL, defined in q3map2.h. the value is exactly as it was before, but
		// is stored in compileFlags, as opposed to contentFlags, for multiple-game
		// portability. :sigh:
                    if( g_bBrushPrimit != BRUSH_QUARK && Com_ReadToken( mapfile, SC_COMMENT_SEMICOLON, &token ))
		{
			// overwrite shader values directly from .map file
			Com_SaveToken( mapfile, &token );
			Com_ReadLong( mapfile, false, &flags );
			Com_ReadLong( mapfile, false, NULL );
			Com_ReadLong( mapfile, false, NULL );
			if( flags & C_DETAIL ) side->compileFlags |= C_DETAIL;
		}		

		if( mapfile->TXcommand == '1' || mapfile->TXcommand == '2' )
		{
			// we are QuArK mode and need to translate some numbers to align textures its way
			// from QuArK, the texture vectors are given directly from the three points
			vec3_t          texMat[2];
			float           dot22, dot23, dot33, mdet, aa, bb, dd;
			int             j, k;

			g_bBrushPrimit = BRUSH_QUARK;	// we can detect it only here
			k = mapfile->TXcommand - '0';
			for( j = 0; j < 3; j++ )
				texMat[1][j] = (planePoints[k][j] - planePoints[0][j]) * (0.0078125f);	// QuArK magic value

			k = 3 - k;
			for( j = 0; j < 3; j++ )
				texMat[0][j] = (planePoints[k][j] - planePoints[0][j]) * (0.0078125f);	// QuArK magic value

			dot22 = DotProduct( texMat[0], texMat[0] );
			dot23 = DotProduct( texMat[0], texMat[1] );
			dot33 = DotProduct( texMat[1], texMat[1] );
			mdet = dot22 * dot33 - dot23 * dot23;
			if( mdet < 1E-6 && mdet > -1E-6 )
			{
				aa = bb = dd = 0;
				MsgDev( D_WARN, "Entity %i, Brush %i: degenerate QuArK-style texture: \n", buildBrush->entityNum, buildBrush->brushNum );
			}
			else
			{
				mdet = 1.0 / mdet;
				aa = dot33 * mdet;
				bb = -dot23 * mdet;
				dd = dot22 * mdet;
			}
			for( j = 0; j < 3; j++ )
			{
				vects.quark.vecs[0][j] = aa * texMat[0][j] + bb * texMat[1][j];
				vects.quark.vecs[1][j] = -(bb * texMat[0][j] + dd * texMat[1][j]);
			}
			vects.quark.vecs[0][3] = -DotProduct( vects.quark.vecs[0], planePoints[0] );
			vects.quark.vecs[1][3] = -DotProduct( vects.quark.vecs[1], planePoints[0] );
		}

		// find the plane number
		planenum = MapPlaneFromPoints( planePoints );
		if( planenum == -1 )
		{
			MsgDev( D_ERROR, "Entity %i, Brush %i: plane with no normal\n", buildBrush->entityNum, buildBrush->brushNum );
			continue;
		}
		side->planenum = planenum;

		if( g_bBrushPrimit == BRUSH_QUARK ) 
		{
			// QuArK format completely matched with internal
			// FIXME: don't calculate vecs, use QuArK texMat instead ?
			Mem_Copy( side->vecs, vects.quark.vecs, sizeof( side->vecs ));
		}
		else if( g_bBrushPrimit != BRUSH_RADIANT )
		{
			vec3_t	vecs[2];
			float	ang, sinv, cosv, ns, nt;
			int	i, j, sv, tv;
			
			if( g_bBrushPrimit == BRUSH_WORLDCRAFT_21 )
				TextureAxisFromPlane( &mapplanes[planenum], vecs[0], vecs[1] );
			if( !vects.hammer.scale[0] ) vects.hammer.scale[0] = 1.0f;
			if( !vects.hammer.scale[1] ) vects.hammer.scale[1] = 1.0f;

			if( g_bBrushPrimit == BRUSH_WORLDCRAFT_21 )
			{
				// rotate axis
				if( vects.hammer.rotate == 0 )
				{
					sinv = 0;
					cosv = 1;
				}
				else if( vects.hammer.rotate == 90 )
				{
					sinv = 1;
					cosv = 0;
				}
				else if( vects.hammer.rotate == 180 )
				{
					sinv = 0;
					cosv = -1;
				}
				else if( vects.hammer.rotate == 270 )
				{
					sinv = -1;
					cosv = 0;
				}
				else
				{
					ang = vects.hammer.rotate / 180 * M_PI;
					sinv = sin( ang );
					cosv = cos( ang );
				}
				if( vecs[0][0] ) sv = 0;
				else if( vecs[0][1] ) sv = 1;
				else sv = 2;

				if( vecs[1][0] ) tv = 0;
				else if( vecs[1][1] ) tv = 1;
				else tv = 2;
			
				for( i = 0; i < 2; i++ )
				{
					ns = cosv * vecs[i][sv] - sinv * vecs[i][tv];
					nt = sinv * vecs[i][sv] + cosv * vecs[i][tv];
					vecs[i][sv] = ns;
					vecs[i][tv] = nt;
				}

				for( i = 0; i < 2; i++ )
					for( j = 0; j < 3; j++ )
						side->vecs[i][j] = vecs[i][j] / vects.hammer.scale[i];
			}
			else if( g_bBrushPrimit == BRUSH_WORLDCRAFT_22 || g_bBrushPrimit == BRUSH_GEARCRAFT_40 )
			{
				float	scale;

				scale = 1.0f / vects.hammer.scale[0];
				VectorScale( vects.hammer.UAxis, scale, side->vecs[0] );
				scale = 1.0f / vects.hammer.scale[1];
				VectorScale( vects.hammer.VAxis, scale, side->vecs[1] );
			}

			// add shifts
			side->vecs[0][3] = vects.hammer.shift[0];
			side->vecs[1][3] = vects.hammer.shift[1];
		}
	}
	
	if( g_bBrushPrimit == BRUSH_RADIANT )
	{
		Com_SaveToken( mapfile, &token );
		Com_CheckToken( mapfile, "}" );
		Com_CheckToken( mapfile, "}" );
	}
}
コード例 #28
0
ファイル: User_udp.c プロジェクト: wcf873455992/ZK
////////////////////////////////////////////////////////////////////
//	函数名称:
//	函数功能:处理
//	入口参数:void *pdata
//
//			MSG_OPTION_CLASS_BEGIN
//	出口参数:无
////////////////////////////////////////////////////////////////////
//void K8_UDP_Rec_Process( tagCommand *pcommand, eip *prec)
void K8_UDP_Rec_Process( void *pdata, eip *prec)
{
    uint8 buf[300] = {0}, rev_buf[80], n, *p;
    uint16 i;
    struct MSG_REV_TYPE  rec_type;
    struct SFILE_TRANSLATE_TYPE File_type;
    struct BASE_MSG Base_msg;
    tagCommand pcommand;
    
    p = (uint8 *)pdata;
    Mem_Copy((uint8 *)&pcommand, p, sizeof( tagCommand));   

    rec_type.Type = DEV_XCOM_UDP;
    rec_type.des_ip[0] = prec->SourceIp[0];
    rec_type.des_ip[1] = prec->SourceIp[1];
    rec_type.des_ip[2] = prec->SourceIp[2];
    rec_type.des_ip[3] = prec->SourceIp[3];

    memcpy(&rev_buf, &rec_type, sizeof(struct MSG_REV_TYPE));
    
    //memcpy(&buf[4], p + sizeof(struct BASE_MSG) + sizeof(struct SFILE_TRANSLATE_TYPE), sizeof(tagCommand));
    

    Base_msg.device = MSG_DEV_LMT;

    //IP_printf("recive S:%x R:%x C:%x F:%x\n",pcommand->sender,pcommand->receiver,pcommand->command,pcommand->flag);
    //buf[0]=MSG_DEV_LMT;
    switch(pcommand.command)
    {
    case EMCOMMANDREMOTECONTROLLER:
        Base_msg.device = MSG_DEV_LAN_KB;
        Base_msg.option = MSG_OPTION_LAN_KEY;
        buf[2] = KEY_VAL;
        switch(pcommand.flag)
        {
        case EMRCACTIONPOWERON:
            buf[3] = KEY_CLASS_BEGIN;
            buf[4] = KEY_CLASS_BEGIN >> 8;
            break;
        case EMRCACTIONPOWEROFF:
            buf[3] = KEY_CLASS_BEGIN;
            buf[4] = KEY_CLASS_BEGIN >> 8;
            break;
        case EMRCACTIONRECORDSTART:
            buf[3] = KEY_REC_PUSH ;
            buf[4] = KEY_REC_PUSH >> 8;
            break;
        case EMRCACTIONRECORDPAUSE:
            buf[3] = KEY_REC_PUSH;
            buf[4] = KEY_REC_PUSH >> 8;
            break;
        case EMRCACTIONRECORDSTOP:
            buf[3] = KEY_REC_STOP;
            buf[4] = KEY_REC_STOP >> 8;
            break;
        case EMRCACTIONDEVPC:
            buf[3] = KEY_DEVICE_PC;
            buf[4] = KEY_DEVICE_PC >> 8;
            break;
        case EMRCACTIONDEVNPC:
            buf[3] = KEY_DEVICE_NPC;
            buf[4] = KEY_DEVICE_NPC >> 8;
            break;
        case EMRCACTIONDEVSHOW:
            buf[3] = KEY_DEVICE_SHOW;
            buf[4] = KEY_DEVICE_SHOW >> 8;
            break;
        }
        break;
    case EMCOMMANDHEARTBEAT:
        Base_msg.option = MSG_OPTION_REC_K8;
        break;
    case EMCOMMANDCOM1:
    case EMCOMMANDCOM2:
    case EMCOMMANDCOM3:
    case EMCOMMANDCOM4:
    case EMCOMMANDSETBAUDRATE:
        Base_msg.option = MSG_OPTION_SCAMERA_CONTRL;
        break;
    case EMCOMMANDRESET:
        Base_msg.option = MSG_OPTION_RESET;
        break;
    case EMCOMMANDFILEREQ:
        Base_msg.option = MSG_OPTION_FILE_REQ;

        File_type.FileType = FILE_TYPE_TABLE;
        File_type.FilePage = pcommand.flag;
        memcpy(&buf[2], &File_type, sizeof(struct SFILE_TRANSLATE_TYPE));
        break;
    case EMCOMMANDFILESEND:
        Base_msg.option = MSG_OPTION_FILE_SEND;
        File_type.FileType = FILE_TYPE_TABLE;
        File_type.FilePage = pcommand.flag;
        memcpy(&buf[2], &File_type, sizeof(struct SFILE_TRANSLATE_TYPE));
        break;
    default:
        Base_msg.option = MSG_OPTION_NONE;
        break;
    }
    //Msg_send(buf,sizeof(tagCommand)+4,rev_buf);
    memcpy(&buf[0], &Base_msg, sizeof(struct BASE_MSG));
    if(Base_msg.option == MSG_OPTION_FILE_SEND)
    {   
        n = sizeof(struct BASE_MSG) + sizeof(struct SFILE_TRANSLATE_TYPE);
        memcpy(&buf[n], p + sizeof(tagCommand), 256);
        //IP_printf_256(&buf[n]);
        Msg_send(buf, sizeof(struct BASE_MSG) + sizeof(struct SFILE_TRANSLATE_TYPE) +256, rev_buf);
       
    }
    else
    {
        Msg_send(buf, 30, rev_buf);
    }

    //IP_printf("buf:%x %x %x %x %x %x %x %x %x %x\n",buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9]);
    

}
コード例 #29
0
/*
 ==================
 CIN_LoadPCX

 TODO: fill in cinematic_t
 ==================
*/
static bool CIN_LoadPCX (cinematic_t *cin, const char *name, int flags){

	pcxHeader_t	*header;
	byte		*data, *pcxData;
	byte		*in, *out;
	byte		palette[768];
	int			x, y, length;
	int			dataByte, runLength;

	// Load the file
	length = FS_ReadFile(name, (void **)&data);
	if (!data)
		return false;

	// Parse the PCX header
	header = (pcxHeader_t *)data;

    header->xMin = LittleShort(header->xMin);
    header->yMin = LittleShort(header->yMin);
    header->xMax = LittleShort(header->xMax);
    header->yMax = LittleShort(header->yMax);
    header->hRes = LittleShort(header->hRes);
    header->vRes = LittleShort(header->vRes);
    header->bytesPerLine = LittleShort(header->bytesPerLine);
    header->paletteType = LittleShort(header->paletteType);

	in = &header->data;

	if (header->manufacturer != 0x0A || header->version != 5 || header->encoding != 1)
		Com_Error(ERR_DROP, "CIN_LoadPCX: invalid PCX header (%s)\n", name);

	if (header->bitsPerPixel != 8 || header->colorPlanes != 1)
		Com_Error(ERR_DROP, "CIN_LoadPCX: only 8 bit PCX images supported (%s)\n", name);
		
	if (header->xMax <= 0 || header->yMax <= 0 || header->xMax >= 640 || header->yMax >= 480)
		Com_Error(ERR_DROP, "CIN_LoadPCX: bad image size (%i x %i) (%s)\n", header->xMax, header->yMax, name);

	Mem_Copy(palette, (byte *)data + length - 768, 768);

	pcxData = out = (byte *)Mem_Alloc((header->xMax+1) * (header->yMax+1) * 4, TAG_TEMPORARY);

	for (y = 0; y <= header->yMax; y++){
		for (x = 0; x <= header->xMax; ){
			dataByte = *in++;

			if ((dataByte & 0xC0) == 0xC0){
				runLength = dataByte & 0x3F;
				dataByte = *in++;
			}
			else
				runLength = 1;

			while (runLength-- > 0){
				out[0] = palette[dataByte*3+0];
				out[1] = palette[dataByte*3+1];
				out[2] = palette[dataByte*3+2];
				out[3] = 255;

				out += 4;
				x++;
			}
		}
	}

	if (in - data > length){
		Com_DPrintf(S_COLOR_YELLOW "CIN_LoadPCX: PCX file was malformed (%s)\n", name);

		FS_FreeFile(data);
		Mem_Free(pcxData);
		pcxData = NULL;

		return false;
	}

	// Free the file data
	FS_FreeFile(data);

	// Fill it in
	cin->playing = true;

	cin->isRoQ = false;

	Str_Copy(cin->name, name, sizeof(cin->name));
	cin->flags = flags;

	cin->file = 0;
	cin->size = 0;
	cin->offset = 0;

	cin->startTime = 0;

	cin->frameRate = 0;

	cin->frameCount = -1;

	// Resample video if needed
	CIN_ResampleVideo(cin);

	return true;
}
コード例 #30
0
ファイル: HscsiISR.c プロジェクト: JoeAltmaier/Odyssey
void HSCSI_ISR_Response_Queue(PHSCSI_INSTANCE_DATA Id)
{
	HSCSI_EVENT_CONTEXT	*p_context;
	IOCB_STATUS_ENTRY	*p_IOCB;
	STATUS				 status;
	
 	HSCSI_TRACE_ENTRY(HSCSI_ISR_Response_Queue);
	
	// Point to IOCB in response FIFO
	p_IOCB = (IOCB_STATUS_ENTRY*)
		&(Id->HSCSI_p_IOCB_response_FIFO[Id->HSCSI_response_FIFO_index]);
	
	// decide what to do with the IOCB based on the entry_type
	switch(p_IOCB->entry_type) {

	case	HSCSI_IOCB_TYPE_MARKER:
		HSCSI_PRINT_STRING(TRACE_L7, "\n\rMarker IOCB");
		HSCSI_Response_FIFO_Increment_Index(Id);
		return;

	case	HSCSI_IOCB_TYPE_STATUS:
		HSCSI_PRINT_STRING(TRACE_L7, "\n\rStatus IOCB");

	    // If this IOCB is the result of a request that completed, then
	    // system_defined2 points to a context.
		p_context = (HSCSI_EVENT_CONTEXT*)p_IOCB->system_defined2;
		if (p_context == (HSCSI_EVENT_CONTEXT *)0) 
		{
    		// If we can't find an event context, 
    		// we can't handle this interrupt!
			HSCSI_Log_Error(HSCSI_ERROR_TYPE_FATAL,
				"HSCSI_ISR_Response_Queue", 
				"No event context for Response IOCB",
				0,
				(UNSIGNED)Id);
			return;
		}
		
    	// Copy IOCB from response FIFO to status_iocb of context
    	Mem_Copy((char*)&p_context->status_iocb, // to
    		(char*)p_IOCB, // from
    		IOCB_SIZE); // number of bytes   		
    
		break;

	default:
		// If we don't know what the type is,
		// we can't handle this interrupt!
	    HSCSI_DUMP_HEX(TRACE_L8, "\n\rEntry Data ",
	    					(U8 *)p_IOCB,
	    					sizeof(IOCB_STATUS_ENTRY));

		HSCSI_Log_Error(HSCSI_ERROR_TYPE_FATAL,
			"HSCSI_ISR_Response_Queue", 
			"Unknown entry type",
			p_IOCB->entry_type,
			(UNSIGNED)Id);
		return;
	}
	
	// Increment the index when we have processed this IOCB.
    HSCSI_Response_FIFO_Increment_Index(Id);

	// Send a message to HSCSI_Event_Task.
	// The action field of the context will tell HSCSI_Event_Task
	// what to do next. 
    status = NU_Send_To_Queue(&Id->HSCSI_event_queue, 
    	&p_context, // message is pointer to context
        1, // size is one UNSIGNED 
        NU_NO_SUSPEND);
        	
    if (status != NU_SUCCESS)
		HSCSI_Log_Error(HSCSI_ERROR_TYPE_FATAL,
			"HSCSI_ISR_Response_Queue", 
			"NU_Send_To_Queue for request completion failed",
			status,
			(UNSIGNED)Id);

} // HSCSI_ISR_Response_Queue