📄 main.c
字号:
/********************** 此程序为IP视频会议终端C400程序 ************************/
/*************************** main.c 为系统主程序 ******************************/
/**************************** designed by wangxq ***************************/
/**************************** 2006-02-23 ***************************/
#include <stdio.h>
#include <string.h>
#include "user.h"
#include "rom400_init.h"
#include "rom400_task.h"
#include "rom400_sock.h"
#ifdef USE_KMEM_LIB
#include "rom400_kmem.h"
#endif
#ifdef USE_XNETSTACK_LIB
#include "rom400_xnetstack.h"
#endif
void main()
{
unsigned int i;
#ifdef USE_XNETSTACK_LIB
xnetstack_install();
#endif
#ifdef USE_KMEM_LIB
kmem_install(ROM400_KMEM_MODEL_SMALLEST + 2);
#endif
init_rom(RAM_START, RAM_END);
//系统存储器的初始化,为ROMINIT.LIB的函数,完成对外接的存储器定标和分配地址
clear_param_buffers();
#ifdef USE_XNETSTACK_LIB
printf("DS80C400 Enhanced Network Library Version %d\r\n", xnetstack_version());
#endif
#ifdef USE_KMEM_LIB
printf("DS80C400 KMEM Library Version %d\r\n", kmem_version());
#endif
puts("Timing test...please wait.\r\n");
printf("Reload : %x\r\n", task_gettickreload());
init();//自己定义的函数,初始化自己定义的变量
puts("Wait IpAddress And Other Information");
task_settickreload(RELOAD_73_728);//装载任务调度定时器的初值
puts("About to wait 20...");
wait_millis(20000);//等待5秒钟左右
printf("Reload : %x\r\n", task_gettickreload());
do_static();//设置本地IP地址属性(包括IP、网关等)
network_config();//读取并打印设置参数
/********************** 创建发送连接 *************************/
memset(&send_udp_video, 0, sizeof(struct sockaddr));
send_udp_video.sin_addr[12] = 192;
send_udp_video.sin_addr[13] = 168;
send_udp_video.sin_addr[14] = 0;
send_udp_video.sin_addr[15] = 200;
send_udp_video.sin_port = SEND_VIDEO_PORT;
video_sendhandle = socket(0, SOCKET_TYPE_DATAGRAM, 0);//创建UDP视频发送连接
syn_setDatagramAddress(video_sendhandle, 1, &send_udp_video);//设置UDP命令字发送连接地址
memset(&send_udp_audio, 0, sizeof(struct sockaddr));
send_udp_audio.sin_addr[12] = 192;
send_udp_audio.sin_addr[13] = 168;
send_udp_audio.sin_addr[14] = 0;
send_udp_audio.sin_addr[15] = 200;
send_udp_audio.sin_port = SEND_G711_PORT;
g711_sendhandle = socket(0, SOCKET_TYPE_DATAGRAM, 0);//创建UDP音频发送连接
syn_setDatagramAddress(g711_sendhandle, 1, &send_udp_audio);//设置UDP命令字发送连接地址
/*****************创建UDP命令字发送连接***********************/
memset(&send_udp_command, 0, sizeof(struct sockaddr));
send_udp_command.sin_addr[12] = 192;
send_udp_command.sin_addr[13] = 168;
send_udp_command.sin_addr[14] = 0;
send_udp_command.sin_addr[15] = 200;
send_udp_command.sin_port = SEND_COMMAND_PORT;
command_sendhandle = socket(0, SOCKET_TYPE_DATAGRAM, 0);//创建UDP命令字发送连接
if(command_sendhandle == 0x0FFFF)
puts("\r\n Failed to create command send UDP socket \r\n");
else
{
puts("\r\n Succeed to create command send UDP socket \r\n");
}
syn_setDatagramAddress(command_sendhandle, 1, &send_udp_command);//设置UDP命令字发送连接地址
/*****************创建UDP命令字发送连接***********************/
/******************** 创建发送连接 ***************************/
/******************** 创建接收连接 ***************************/
/******************创建UDP视频接收连接************************/
memset(&rev_udp_video, 0, sizeof(struct sockaddr));
rev_udp_video.sin_addr[12] = 192;
rev_udp_video.sin_addr[13] = 168;
rev_udp_video.sin_addr[14] = 0;
rev_udp_video.sin_addr[15] = 201;
rev_udp_video.sin_port = REV_VIDEO_PORT;
video_revhandle = socket(0, SOCKET_TYPE_DATAGRAM, 0);//创建UDP接收命令字连接
if(video_revhandle == 0x0FFFF)
puts("\r\n Failed to create receive video UDP socket \r\n");
else
puts("\r\n Succeed to create receive video UDP socket \r\n");
if(bind(video_revhandle,&rev_udp_video,sizeof(struct sockaddr)) == 0)//绑定命令字接收地址和端口
printf(" successully bind receive video address and port - %u\r\n",REV_VIDEO_PORT);
else
printf(" failed to bind receive video address and port \r\n");
syn_setDatagramAddress(video_revhandle, 0, &rev_udp_video);
/******************创建UDP视频接收连接************************/
/******************创建UDP音频接收连接************************/
memset(&rev_udp_audio, 0, sizeof(struct sockaddr));
rev_udp_audio.sin_addr[12] = 192;
rev_udp_audio.sin_addr[13] = 168;
rev_udp_audio.sin_addr[14] = 0;
rev_udp_audio.sin_addr[15] = 201;
rev_udp_audio.sin_port = REV_G711_PORT;
g711_revhandle = socket(0, SOCKET_TYPE_DATAGRAM, 0);//创建UDP接收命令字连接
if(g711_revhandle == 0x0FFFF)
puts("\r\n Failed to create receive audio UDP socket \r\n");
else
puts("\r\n Succeed to create receive audio UDP socket \r\n");
if(bind(g711_revhandle,&rev_udp_audio,sizeof(struct sockaddr)) == 0)//绑定命令字接收地址和端口
{
printf(" successully bind receive audio address and port - %u\r\n",REV_G711_PORT);
}
else
{
printf(" failed to bind receive audio address and port \r\n");
}
syn_setDatagramAddress(g711_revhandle, 0, &rev_udp_audio);
/******************创建UDP音频接收连接************************/
/******************创建UDP命令接收连接************************/
memset(&rev_udp_command, 0, sizeof(struct sockaddr));
rev_udp_command.sin_addr[12] = 192;
rev_udp_command.sin_addr[13] = 168;
rev_udp_command.sin_addr[14] = 0;
rev_udp_command.sin_addr[15] = 201;
rev_udp_command.sin_port = REV_COMMAND_PORT;
command_revhandle = socket(0, SOCKET_TYPE_DATAGRAM, 0);//创建UDP接收命令字连接
if(command_revhandle == 0x0FFFF)
puts("\r\n Failed to create receive command UDP socket \r\n");
else
puts("\r\n Succeed to create receive command UDP socket \r\n");
if(bind(command_revhandle,&rev_udp_command,sizeof(struct sockaddr)) == 0)//绑定命令字接收地址和端口
printf(" successully bind receive command address and port - %u\r\n",REV_COMMAND_PORT);
else
printf(" failed to bind receive command address and port \r\n");
syn_setDatagramAddress(command_revhandle, 0, &rev_udp_command);
/******************创建UDP命令接收连接************************/
/******************** 创建接收连接 ***************************/
//start_leave();
task_entercritsection();
result = task_fork(NORM_PRIORITY, ROM_SAVESIZE);//创建两个任务线程
if (result==0x0FFFF)//创建任务失败
{
task_leavecritsection();
puts("Attempt to fork failed\r\n");
return;
}
else if (result==0)//发送线程
{
while (1)
{
temp = ((*rd_fifo_ef) & 0x01);
if(temp == 1)//检测视频FIFO是否为空
{
dp_read_video();
syn_sendto(video_sendhandle, 1472, send_addr_video);//UDP发送视频数据
}
temp = ((*rd_fifo_hf) & 0x01);
if(temp == 0)//检测音频FIFO是否半满
{
dp_read_audio();//读取音频数据
syn_sendto(g711_sendhandle, 1024, send_addr_audio);//UDP发送音频数据
}
temp = ((*dual_rev) & 0x01);
if(temp == 0x01)//判断是否有命令字需要发送
{
command_length = *(dual_rev + 1);
for(i = 0; i < command_length;i++)
{
*(send_addr_command + i + 5) = (*(dual_rev + 2 + i) & 0xff);
}
*dual_rev = 0;
command_length = command_length + 5;
*(send_addr_command) = command_length;//将从双口RAM中取出的命令字打包
syn_sendto(command_sendhandle,command_length,send_addr_command);//UDP发送命令字
}
task_wait(0, 0, 16);//线程挂起,进入等待
}
}
else
{
command_result = task_fork(NORM_PRIORITY, ROM_SAVESIZE);//创建两个任务线程
if(command_result == 0xffff)
{
puts("Attempt to fork failed\r\n");
return;
}
else if(command_result == 0)//接收视频数据线程
{
while (1)
{
rev_length_video = syn_recvfrom(video_revhandle,1472,rev_addr_video);//UDP接收视频数据
if(rev_length_video == 1472)
{
dp_write_video();
rev_num++;
if(rev_num > 49950)
{
printf(" rev_num = %u\r\n",rev_num);
}
}
else
{
printf(" rev_length_video = %u\r\n",rev_length_video);
}
}
}
else
{
audio_result = task_fork(NORM_PRIORITY, ROM_SAVESIZE);//创建两个任务线程
if(audio_result == 0xffff)
{
puts("Attempt to fork failed\r\n");
return;
}
else if(audio_result == 0)//接收音频线程
{
while(1)
{
rev_length_audio = syn_recvfrom(g711_revhandle,1024,rev_addr_audio);//UDP音频接收
//rev_length_audio = recvfrom(g711_revhandle,rev_addr_audio,1024,0,&temp_addr,sizeof(struct sockaddr));//UDP音频接收
if(rev_length_audio == 1024)
{
dp_write_audio();
//printf("IP : %bu \r\n", temp_addr.sin_addr[15]);
//temp_addr.sin_addr[15] = 0;
}
}
}
else//接收命令字线程
{
task_leavecritsection();
while (1)
{
rev_length_command = syn_recvfrom(command_revhandle,210, rev_addr_command);//UDP接收
if((rev_length_command < 210) && (rev_length_command > 0))
{
moveto_buf();//将网络接收到的命令字放入接收缓冲区
rev_length_command = 0;
while(head_r != tail_r)
{
send_command();
}
}
}
}
}
}
while(1)
{
}
}
void start_leave()
{
}
void wait_millis(unsigned int waitTime)//延时等待函数
{
unsigned int result;
struct TIME time1;
struct TIME time2;
task_entercritsection();
task_gettimemillis(&time1);
result = 0;
while (result < waitTime)
{
task_gettimemillis(&time2);
result = time2.millis - time1.millis;
}
task_leavecritsection();
printf("Waited for %ld msec\r\n", (time2.millis - time1.millis));
}
void do_static()//配置本端网络属性
{
unsigned int result;
unsigned char xdata config[56];
unsigned int i;
for (i=0;i<56;i++)
config[i] = 0;
//set the ip address
config[12] = static_ip[0];
config[13] = static_ip[1];
config[14] = static_ip[2];
config[15] = static_ip[3];
//set the subnet mask
config[16] = yan_ma[0];
config[17] = yan_ma[1];
config[18] = yan_ma[2];
config[19] = yan_ma[3];
//set the iP4 prefix
config[20] = STATIC_IPV4_PREFIX;
//set the gateway
config[33] = gate_ip[0];
config[34] = gate_ip[1];
config[35] = gate_ip[2];
config[36] = gate_ip[3];
result = setnetworkparams(config);
printf("Set network parameters result: %u\r\n", result);
}
void network_config()//读取本端网络属性
{
unsigned char result;
unsigned char xdata config[56];
unsigned int i;
for (i=0;i<56;i++)
config[i] = 0;
result = getnetworkparams(config);
printf("Network params result: %d\r\n", result);
printf("IP : %bu %bu %bu %bu\r\n", config[12], config[13], config[14], config[15]);
printf("Subnet: %bu %bu %bu %bu\r\n", config[16], config[17], config[18], config[19]);
printf("Prefix: %bu\r\n", config[20]);
printf("Gate : %bu %bu %bu %bu\r\n", config[33], config[34], config[35], config[36]);
}
void init()//初始化自己定义的量
{
send_addr_video = 0x050000;//视频发送地址指针
rev_addr_video = 0x051000;//视频接收地址指针
send_addr_audio = 0x052000;//音频发送地址指针
rev_addr_audio = 0x053000;//音频接收地址指针
send_addr_command = 0x054000;//命令字发送地址指针
rev_addr_command = 0x055000;//命令字接收地址指针
rd_fifo_hf = 0x280000;//读取音频发送FIFO半满地址指针
rd_fifo_ef = 0x2a0000;//读取视频发送FIFO空地址指针
dual_send = 0x240200;//双口RAM写地址指针
dual_rev = 0x240000;//双口RAM读地址指针
dual_ip = 0x240400;//网络参数配置地址指针
command_length = 0;
head_r = 0;
tail_r = 0;
rev_num = 0;
for(i = 0;i < 2048;i++)
{
rev_buf[i] = 0;
}
for(i = 0; i < 4;i++)
{
for(j = 0; j < 4;j++)
{
send_para[i][j] = 0;
}
}
for(i = 0; i < 3;i++)
{
for(j = 0; j < 4;j++)
{
rev_para_video[i][j] = 0;
rev_para_audio[i][j] = 0;
}
}
send_video_flag = 0xff;
rev_video_flag = 0xff;
send_audio_flag = 0xff;
rev_audio_flag = 0xff;
static_ip[0] = 192;
static_ip[1] = 168;
static_ip[2] = 0;
static_ip[3] = 201;
gate_ip[0] = 192;
gate_ip[1] = 168;
gate_ip[2] = 0;
gate_ip[3] = 1;
yan_ma[0] = 255;
yan_ma[1] = 255;
yan_ma[2] = 255;
yan_ma[3] = 0;
SEND_VIDEO_PORT = 10026;
REV_VIDEO_PORT = 10025;
SEND_G711_PORT = 10028;
REV_G711_PORT = 10027;
SEND_COMMAND_PORT = 10030;
REV_COMMAND_PORT = 10029;
}
void moveto_buf()//将收到的命令字转移到接收缓冲区
{
}
void send_command()//通过双口RAM发送命令字
{
}
void analyse_current_state(unsigned char state,unsigned num)
//根据8031提供的情况调整视频、音频的收发
{
}
void adjust_send_video(unsigned char num,unsigned char flag)
//调整视频的发送
{
}
void adjust_send_audio(unsigned char num,unsigned char flag)
//调整音频的发送
{
}
void adjust_rev_video(unsigned char num,unsigned char flag)
//调整视频的接收
{
}
void adjust_rev_audio(unsigned char num,unsigned char flag)
//调整音频的接收
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -