⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 app_test.c

📁 ARM_CORTEX-M3应用实例开发详解光盘
💻 C
字号:
#include <ucos_ii.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

#include "uart_std.h"
#include "keys.h"
#include "ppp.h"
#include "cdrs_op.h"

OS_STK App_TaskTestStk[APP_TASK_TEST_STK_SIZE];

char MenuStart(void);


void App_test(void *parg)
{
//    CDRS_SetPower(0);
//    OSTimeDlyHMSM(0,0,1,0);
//    CDRS_SetPower(1);
    CDRS_Reset();
    OSTimeDlyHMSM(0,0,1,0);
    CDRS_Open();
    MenuStart();
 //   while (1) {
 //       depo(&Depo, 1);
 //       OSTimeDlyHMSM(0, 0, 1, 0);
 //   }
}

#include "tasks.h"
#include "GUI.h"
#include "LCD_ConfDefaults.h"      /* valid LCD configuration */
#include "stm32f10x_lib.h"

#define DEBUG_L 1
#if DEBUG_L
#define DEBUG_PRINTF(X...) printf(##X);
#else
#define DEBUG_PRINTF(X...) 
#endif
/*
 * 天漠服务器
 * http://203.86.7.136/
 */
/* 服务器IP */
#define SIP1    203
#define SIP2    86
#define SIP3    7
#define SIP4    136

/* 服务器端口号 */
#define SPORT   80


#define CDMA_STATE  1
#define PRICE       2
#define CARD_INFO   3

#define LEFT_W  100
#define RIGHT_W 135
#define CENTER_W  (LCD_XSIZE-LEFT_W-RIGHT_W) 

union _depo_t{
    struct {
        unsigned int cno;
        unsigned int bala;
        unsigned int con;
        unsigned int tim;
    } _depo;
    unsigned int tmp[4];
};
static int gCon = 100;
static unsigned short gStreamNo = 0;
static unsigned int gOfflamt = 0;

static union _depo_t Depo;

int GetLinkState(void);

static int proc_key(void);
static void _Draw_Back(void);
static void _Update_Show(int i);
static int depo(union _depo_t *pCard, int con);
static int SendDepo(void);

int Rfid_Demo(void)
{
    _Draw_Back();
    _Update_Show(PRICE);

    PWR_BackupAccessCmd(ENABLE);

    DEBUG_PRINTF("\r\nStarting Dail task...");
    if (Run_Task(&user_tasks[2]) < 0) {
		printf("\r\nErr : Create Task.");
		return -1;
	}
    gStreamNo = BKP_ReadBackupRegister(BKP_DR2);
    while (!proc_key()) {
        _Update_Show(CDMA_STATE);
        if (depo(&Depo, gCon) > 0) {
            ++gStreamNo;
            BKP_WriteBackupRegister(BKP_DR2, gStreamNo);
            _Update_Show(CARD_INFO); 
            if (GetLinkState() == 0 && SendDepo()>=0) { //发送数据到服务器
                gOfflamt = 0;    
            } else
                gOfflamt += gCon;

            gCon++;
            _Update_Show(PRICE);
        }
        OSTimeDlyHMSM(0, 0, 0, 10);
    }
    DEBUG_PRINTF("\r\nKill Dail process...");
    OSTaskDelReq(user_tasks[2].prio);
    return 0;
}

#define PHYID   1985
#define RATE    11
#define DBVER   19
#define ASPFILE "gdemo.asp"
#define ASPFMAT "?strmnr=%d&logicid=%d&carno=%d&amount=%d.%d&offlamt=%d.%d&rate=%d&dbver=%d"
#define ASPPARA   gStreamNo,PHYID,Depo._depo.cno, (Depo._depo.con/100), (Depo._depo.con%100), gOfflamt/100, gOfflamt%100, RATE, DBVER

//static char * pSformat  = "GET /"ASPFILE"?strmnr=%d&amount=%d&money=%d HTTP/1.1\r\n"
//    "Host: www.timll.com\r\n\r\n";
static char *pSformat = "GET /"ASPFILE ASPFMAT" HTTP/1.1\r\nHost: www.timll.com\r\n\r\n";
    

char prBuf[512];
char * mystrstr(const char *str1, const char *str2);
static int SendDepo(void)
{
    int sock;
    struct sockaddr_in saddr, oaddr;
    struct ip_addr sip;
    unsigned int timo = 3000;
    int len, ret = 0;

    sock = socket(AF_INET, SOCK_STREAM, 0);
    DEBUG_PRINTF("\r\nSock : %d", sock);
    if (sock < 0) {
        ret = -1;
        return ret;
    }
    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timo, 4);

    oaddr.sin_family = AF_INET;
    oaddr.sin_addr.s_addr = INADDR_ANY;
    oaddr.sin_port = 0;
    if (0 != bind(sock, (struct sockaddr *)&oaddr, sizeof (struct sockaddr_in))) {
        DEBUG_PRINTF("\r\n Err : bind");
        ret = -2;
        goto out;
    }


    saddr.sin_family = AF_INET;
        /* 服务器IP地址 */
    IP4_ADDR(&sip, SIP1, SIP2, SIP3, SIP4);
    saddr.sin_addr.s_addr = sip.addr;
    saddr.sin_port = htons(SPORT);
    if (0 != connect(sock, (struct sockaddr *)&saddr, sizeof (struct sockaddr_in))) {
        DEBUG_PRINTF("\r\n Err : connect.");
        ret = -3;
        goto out;
    }
    sprintf(prBuf, pSformat, ASPPARA);
    printf("\r\nSEnd : %s", prBuf);
    len = send(sock, prBuf, strlen(prBuf), 0);
    if (len < 0) {
        DEBUG_PRINTF("\r\n Err : Send ");
        ret = -4;
        goto out;
    }
    len = recv(sock, prBuf, 512, 0);
    if (len < 0) {
        DEBUG_PRINTF("\r\n Err : Recv ");
        ret = -5;
        goto out;
    }
    prBuf[len] = 0;
    if (!mystrstr(prBuf, "OK")) {
        ret = -6;
        goto out;
    }
        
#if DEBUG_L
{
    int i;
    printf("\r\nRecv : %d\r\n", len);
    for (i=0; i<len; i++)
        printf("%c", prBuf[i]);
}
#endif
out:
    close(sock);    
    return ret;
}

static GUI_RECT SRects[] = {
    {   0,        0,    LCD_XSIZE-1,       60-1},    //标题
    {   0,       60,    LCD_XSIZE-1,      100-1},
    {   0,      100,    LCD_XSIZE-1,      140-1},
    {   0,      140,    LCD_XSIZE-1,      180-1},
    {   0,      180,    LCD_XSIZE-1,      220-1},
    {   0,      220,    LCD_XSIZE-1,      260-1},
    {   0,      260,    LCD_XSIZE-1,      300-1},
};
 


static void _Update_Show(int i)
{
    char buf[16];
    switch(i) {
    case CDMA_STATE:
    {
        static char *linkinfo[] = {
            "Link On   ",
            "Dialing...",
            "Task Exit ",
            "Link Off  ",
        };

        int link = -GetLinkState();
        if (link>2)
            return;
        if (link < 0)
            link = 3;
        SRects[CDMA_STATE].x0 += LEFT_W + CENTER_W;
        GUI_DispStringInRect(linkinfo[link], &SRects[CDMA_STATE], GUI_TA_LEFT|GUI_TA_BOTTOM);
        SRects[CDMA_STATE].x0 -= LEFT_W + CENTER_W;
    }
        break;
    case PRICE:
    {
        
        sprintf(buf, "%-15d", gCon);
        SRects[PRICE].x0 += LEFT_W + CENTER_W;
        GUI_DispStringInRect(buf, &SRects[PRICE], GUI_TA_LEFT|GUI_TA_BOTTOM);
        SRects[PRICE].x0 -= LEFT_W + CENTER_W;
    }
        break;
    case CARD_INFO:
    {
        int i;     
        for (i=0; i<4; i++) {
            
            if (i != 3)
                sprintf(buf, "%-15d", Depo.tmp[i]);
            else {
                struct tm *t = localtime((time_t *)&Depo.tmp[i]);
                if (t == NULL)
                    break;
                sprintf(buf, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec);
            }
            SRects[CARD_INFO+i].x0 += LEFT_W + CENTER_W;
            GUI_DispStringInRect(buf, &SRects[CARD_INFO+i], GUI_TA_LEFT|GUI_TA_BOTTOM);
            SRects[CARD_INFO+i].x0 -= LEFT_W + CENTER_W;    
        }
    }
        break;
    }
}

static void _Draw_Back(void)
{
    int i, cnt;
    static char *info[] = {
        "CDMA:",
        "Price:",
        "Card Id:",
        "Balance:",
        "Consume:",
        "Time:"
    };
    GUI_SetBkColor(GUI_WHITE);
    GUI_SetColor(GUI_BLACK);  
    GUI_Clear();
    GUI_SetFont(&GUI_FontComic24B_ASCII);
    
    cnt = sizeof SRects / sizeof SRects[0];
    for (i=0; i<cnt; i++) {
        GUI_DrawHLine(SRects[i].y1+1, 0, LCD_YSIZE-1);
    }
    GUI_DispStringInRect("Wireless Pos", &SRects[0], GUI_TA_HCENTER|GUI_TA_BOTTOM);
    for (i=1; i<cnt; i++) {
        SRects[i].x1 -= CENTER_W+RIGHT_W;
        GUI_DispStringInRect(info[i-1], &SRects[i], GUI_TA_RIGHT|GUI_TA_BOTTOM);
        SRects[i].x1 += CENTER_W+RIGHT_W;
    }
}                   

static int proc_key(void)
{
    int key;
    key = key_accept();
    switch (key) {
    case KEY_USER:
        return 1; //退出  
    case KEY_DOWN:
        gCon > 1 ? gCon-- : 0;
        _Update_Show(PRICE);
        break;
    case KEY_UP:
        ++gCon;
        _Update_Show(PRICE);
    default:
        break;
    }
    return 0;
}


char key[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
char _buf[16];

#include "mifare.h"

static int depo(union _depo_t *pCard, int con)
{
    static char cid[5], lid[5];
    unsigned short sum;
    
//    printf("\r\n depo...");    
    if (mifare_id(NULL) != FM1702_OK){ 
        memset(lid, 0, 5);
        memset(cid, 0, 5);
        return 0;
    }
	mifare_id(cid);
    if (!memcmp(cid, lid, 5))
        return 0;
    memcpy(lid, cid, 5);

        printf("\r\nCheck card !\r\n");
        
        printf("\r\n Read blk [%d]...", 40);
        if (16 != mifare_read(40, _buf, key)) {
            printf("\r\nRead card err blk [%d] !", 40);
            return -1; // 读卡错
        } else
            printf("Ok");

        pCard->_depo.cno = _buf[2]<<16 | _buf[9]<<8 | _buf[0];
        
        printf("\r\ncno = [%d]", pCard->_depo.cno);

        printf("\r\n Read blk [%d]...", 44);
        if (16 != mifare_read(44, _buf, key)) {
            printf("\r\nRead card err blk %d[] !", 44);
            return -1;  //读卡错
        } else
            printf("Ok");

        pCard->_depo.bala = _buf[0]<<16 | _buf[1]<<8 | _buf[2];
        printf("\r\n余额:[%d]", pCard->_depo.bala);
        printf("\r\n消费:[%d]", con);
        if (pCard->_depo.bala < con)
            return 1;   //余额不足
        pCard->_depo.bala -= con;
        _buf[2] = pCard->_depo.bala &0xff;
        _buf[1] = (pCard->_depo.bala>>8) &0xff;
        _buf[0] = (pCard->_depo.bala>>16) &0xff;
   
		sum = checksum_8bit((unsigned char *)_buf, 14);
        _buf[14] = sum>>8 & 0xff;
        _buf[15] = sum & 0xff;
        if (FM1702_OK != mifare_write(44, _buf, key)) {
            printf("\r\n Write card Err [44]");
            return -2;
        }
        pCard->_depo.con = gCon;
        pCard->_depo.tim = time(NULL);
    printf("\r\nExit");

    return 2;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -