?? con-flow.c
字號(hào):
/*
** $Id: Con-flow.c,v 1.0 2008/03/19 PanChx $
**
** --右上鍵;+-右下鍵;NumLock-左上鍵;/-左下鍵
**
**
** Copyright (C) 2004 Feynman Software.
**
** License: GPL
*/
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <termios.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>
#include <errno.h>
#include <sys/wait.h>
#include <linux/types.h>
#include <linux/videodev.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/file.h>
#include <fcntl.h>
#include <pthread.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#include <minigui/minigui.h>
#include "con-flow.h"
//打開(kāi)串口
int open_serial_modem(char *SerialPort)
{
// "/dev/ttyS0", "/dev/stS0", "/dev/stS1", "/dev/stS2",
//打開(kāi)串口
int serial_port = -1;
serial_port = open((const char *)SerialPort, O_RDWR);
if (-1 == serial_port)
{
printf("\t!!!serial open error!!!\n");
}
return serial_port;
}
//關(guān)閉串口
int close_serial_modem(int serial_port)
{
close(serial_port);
serial_port = 0;
return 0;
}
//進(jìn)行撥號(hào)
void dial_number(int serial_port)
{
write(serial_port, "ATD15953169608;\x0d", 16);
}
//掛斷電話
void hangup(int serial_port)
{
write(serial_port, "ATH\x0d", 4);
}
//設(shè)置串口波特率
int config_serial_port(int serial_port, speed_t speed)
{
//得到串口結(jié)構(gòu)
tcgetattr(serial_port, &Opt);
//設(shè)置輸入波特率
cfsetispeed(&Opt, speed);
//設(shè)置輸出波特率
cfsetospeed(&Opt, speed);
//以立即生效的方式設(shè)置串口結(jié)構(gòu)
tcsetattr(serial_port,TCSANOW, &Opt);
//設(shè)置控制標(biāo)志前的屏蔽
Opt.c_cflag &= ~CSIZE;
/*8 bit data*/
Opt.c_cflag |= CS8;
//允許輸出產(chǎn)生奇偶信息以及輸入的奇偶校驗(yàn)
Opt.c_cflag &= ~PARENB;
/*1 stop bit*/
Opt.c_cflag &= ~CSTOPB;
/*RAW mode*/
/*ICANON起用標(biāo)準(zhǔn)模式,允許使用特殊字符EOF,EOL,EOL2,ERASE,KILL,LNEXT
ECHO:回顯輸入字符
ECHOE:如果同時(shí)設(shè)置了ICANON,字符ERASE擦除前一個(gè)輸入字符,WERASE擦除前一個(gè)詞
ISIG:當(dāng)接受到字符INTR,QUIT,SUSP或DSUSP時(shí),產(chǎn)生相應(yīng)的信號(hào)*/
Opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
/*Output*/
/*啟用具體實(shí)現(xiàn)自行定義的輸出處理,其余c_oflag標(biāo)志常量定義在POSIX1003.1-2001中,除非另外說(shuō)明*/
Opt.c_oflag &= ~OPOST;
//控制字符VTIME:非canonical模式讀時(shí)的延時(shí),以十分之一秒為單位
Opt.c_cc[VTIME] = 8;
//VMIN非canonical模式讀的最小字符數(shù)
Opt.c_cc[VMIN] = 2;
//丟棄要寫入引用的對(duì)象,但是尚未傳輸?shù)臄?shù)據(jù),或者收到但是尚未讀取的數(shù)據(jù),取決于queue_selector的值。
/*TCIFLUSH:刷新收到的數(shù)據(jù)但是不讀*/
tcflush(serial_port, TCIFLUSH);
//設(shè)置與終端相關(guān)的參數(shù)(除非需要底層支持卻無(wú)法滿足),使用termios_p引用的termios結(jié)構(gòu)
tcsetattr(serial_port, TCSANOW, &Opt);
return 0;
}
//檢測(cè)信號(hào)質(zhì)量
void check_signalquality(int serial_port)
{
write(serial_port, "AT+csq\x0d", 7);
}
/*把共享緩沖區(qū)中的數(shù)據(jù)放到一個(gè)變量中,通知系統(tǒng)已獲得一幀
dst:目的地址
src:源地址*/
int convertframe(unsigned char *dst,unsigned char *src, int formatIn, int size)
{
int jpegsize =0;
switch (formatIn)
{
case VIDEO_PALETTE_JPEG:
jpegsize = get_jpegsize(src, size);
if (jpegsize < 0)
break;
memcpy(dst,src,jpegsize);
break;
default:
break;
}
return jpegsize;
}
void exit_fatal(char *messages)
{
printf("%s \n",messages);
exit(1);
}
//獲取顏色深度
static int GetDepth (int format)
{
int depth;
switch (format)
{
case VIDEO_PALETTE_JPEG:
depth = 8;
break;
default:
depth = -1;
break;
}
return depth;
}
//測(cè)試芯片類型
static int isSpcaChip (const char *BridgeName)
{
int i = -1;
int find = -1;
int size = 0;
for (i = 0; i < MAX_BRIDGE -1; i++)
{
size = strlen (Blist[i].name) ;
if (strncmp (BridgeName, Blist[i].name, size) == 0)
{
find = i;
break;
}
}
return find;
}
//測(cè)試輸出數(shù)據(jù)格式
static int GetStreamId (const char *BridgeName)
{
int i = -1;
int match = -1;
if ((match = isSpcaChip (BridgeName)) < 0)
{
return match;
}
switch (match)
{
case BRIDGE_ZC3XX:
i = JPEG;
break;
}
return i;
}
static int SetVideoPict (struct vdIn *vd)
{
//VIDIOCSPICT:設(shè)置圖片屬性
if (ioctl (vd->fd, VIDIOCSPICT, &vd->videopict) < 0)
exit_fatal ("Couldnt set videopict params with VIDIOCSPICT");
return 0;
}
//獲取jpeg圖片大小
int get_jpegsize (unsigned char *buf, int insize)
{
int i;
/*jpeg圖片的8個(gè)標(biāo)記:SOI 0xD8 圖象開(kāi)始;
APPO 0xE0 JEIF 應(yīng)用數(shù)據(jù)塊
APPn 0xE1-0xEF 其它得應(yīng)用數(shù)據(jù)塊(n,1~15)
DQT 0xDB 量化表
SOF0 0xC0 幀開(kāi)始
DHT 0xC4 霍夫曼(Huffman)表
SOS 0xDA 掃描線開(kāi)始
EOI 0xD9 圖像結(jié)束
每一幀緩沖區(qū)的最開(kāi)頭四個(gè)字節(jié)為ff d8 ff d9,然后是圖象大小*/
for (i = 1024 ; i < insize; i++)
{
if ((buf[i] == 0xFF) && (buf[i+1] == 0xD9))
return i+2;
}
return -1;
}
static int GetVideoPict (struct vdIn *vd)
{
/* VIDIOCGPICT:Get picture properties */
if (ioctl (vd->fd, VIDIOCGPICT, &vd->videopict) < 0)
exit_fatal ("Couldnt get videopict params with VIDIOCGPICT");
return 0;
}
//從攝像頭采集圖片
int v4lGrab(struct vdIn *vd, BITMAP * bitmap_stru)
{
int len;
int size;
int erreur = 0;
int jpegsize = 0;
FILE *f;
/* read method */
size = vd->framesizeIn;
//從vd->fd中讀取size個(gè)字節(jié)到vd->pFramebuffer中
len = read (vd->fd, vd->pFramebuffer, size);
if (len < 0 )
{
perror("read error");
return 0;
}
jpegsize= convertframe(vd->ptframe, vd->pFramebuffer ,vd->formatIn,vd->framesizeIn);
printf("jpegsize = %x\n",jpegsize);
len = LoadBitmapFromMem(HDC_SCREEN, bitmap_stru, vd->ptframe, jpegsize, "jpg");
if(0!=len)
{
printf("LoadBitmapFromMem return failure%d,h=%x,w=%x\n",len,bitmap_stru->bmHeight,bitmap_stru->bmWidth);
}
return 1;
}
//初始化視頻設(shè)備
static int init_v4l (struct vdIn *vd)
{
int erreur = 0;
//打開(kāi)端口
if ((vd->fd = open (vd->videodevice, O_RDWR)) == -1)
exit_fatal ("ERROR opening V4L interface");
//打開(kāi)設(shè)備能力
if (ioctl (vd->fd, VIDIOCGCAP, &(vd->videocap)) == -1)
exit_fatal ("Couldn't get videodevice capability");
snprintf (vd->cameraname, 32, "%s", vd->videocap.name);
//得到圖片屬性
erreur = GetVideoPict (vd);
/* Get channel info (sources) */
if (ioctl (vd->fd, VIDIOCGCHAN, &vd->videochan) == -1)
{
vd->cameratype = UNOW;
}
else
{
if (vd->videochan.name)
{
snprintf (vd->bridge, 9, "%s", vd->videochan.name);
vd->cameratype = GetStreamId (vd->bridge);
}
else
{
vd->cameratype = UNOW;
}
}
/* Only jpeg webcam allowed */
if(vd->cameratype != JPEG)
{
exit_fatal ("Not a JPEG webcam sorry Abort !");
}
//palette:palette in use
vd->videopict.palette = vd->formatIn;
//Capture depth
vd->videopict.depth = GetDepth (vd->formatIn);
vd->bppIn = GetDepth (vd->formatIn);
//寬*高*4
vd->framesizeIn = (vd->hdrwidth * vd->hdrheight >> 2 ); // here alloc the output ringbuffer jpeg only
erreur = SetVideoPict (vd);
erreur = GetVideoPict (vd);
//為什么需要獲得兩次呢?
if (vd->formatIn != vd->videopict.palette ||
vd->bppIn != vd->videopict.depth)
exit_fatal ("could't set video palette Abort !");
if (erreur < 0)
exit_fatal ("could't set video palette Abort !");
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -