RoBoard魔人的機器人日誌

2012/3/12

[RoBoRC第五回] 介紹程式碼const & errcode

本周的RoBoRC介紹兩個程式

const 以及 errcode

別緊張

這兩個都沒有很難

本周就輕鬆一下吧~

const.h
這裡主要是定義結構用

#ifndef __CONST_H
#define __CONST_H

#define NUM_SERVO (17)
#define NUM_RBVer (7)
#define NUM_SKEY  (17)

typedef struct _strint_{
 const char* name;
 unsigned int value;
}STRINT;

typedef struct _servo_{
 const char* name;
 unsigned int value;
 bool feedback;
}_SERVO;

typedef _SERVO SERVO[NUM_SERVO];
typedef STRINT SKEY[NUM_SKEY];
typedef STRINT RBVER[NUM_RBVer];

extern SERVO Servo;
extern RBVER RBVer;
extern SKEY SKey;

#endif



const.cpp
剛剛定義結構的內容   有servo,RBver等

#include "rcservo.h"
#include "userio.h"
#include "common.h"
#include "const.h"

 
_SERVO Servo[] = {
    {"DEFAULT", RCSERVO_SERVO_DEFAULT, true},
    {"DEFAULT_NOFB", RCSERVO_SERVO_DEFAULT_NOFB, false},
    {"KONDO_KRS786", RCSERVO_KONDO_KRS786, true},
    {"KONDO_KRS788", RCSERVO_KONDO_KRS788, true},
    {"KONDO_KRS78X", RCSERVO_KONDO_KRS78X, true},
    {"KONDO_KRS4014", RCSERVO_KONDO_KRS4014, true},
    {"KONDO_KRS4024", RCSERVO_KONDO_KRS4024, true},
    {"HITEC_HSR8498", RCSERVO_HITEC_HSR8498, true},
    {"FUTABA_S3003", RCSERVO_FUTABA_S3003, false},
    {"SHAYYE_SYS214050", RCSERVO_SHAYYE_SYS214050, false},
    {"TOWERPRO_MG995", RCSERVO_TOWERPRO_MG995, false},
    {"TOWERPRO_MG996", RCSERVO_TOWERPRO_MG996, false},
    {"DMP_RS0263", RCSERVO_DMP_RS0263, false},
 {"DMP_RS1270", RCSERVO_DMP_RS1270, false},
 {"GWS_S777", RCSERVO_GWS_S777, false},
 {"GWS_S03T", RCSERVO_GWS_S03T, false},
 {"GWS_MICRO", RCSERVO_GWS_MICRO, false}
};

STRINT RBVer[] = {
 {"RB_100b1", RB_100b1},
 {"RB_100b2", RB_100b2},
 {"RB_100b3", RB_100b3},
 {"RB_100", RB_100},
 {"RB_100RD", RB_100RD},
 {"RB_110", RB_110},
 {"RB_050", RB_050}
};

STRINT SKey[] = {
    {"F1",  KBF1},
    {"F2",  KBF2},
    {"F3",  KBF3},
    {"F4",  KBF4},
    {"F5",  KBF5},
    {"F6",  KBF6},
    {"F7",  KBF7},
    {"F8",  KBF8},
    {"F9",  KBF9},
    {"F10", KBF10},
    {"F11", KBF11},
    {"F12", KBF12},
    {"ENTER", KBENTER},
// {"SPACE", KBSPACE},
    {"UP",    KBUP},
    {"DOWN",  KBDOWN},
    {"LEFT",  KBLEFT},
    {"RIGHT", KBRIGHT}
// {"PGUP",  KBPGUP},
// {"PGDN",  KBPGDN}
};

errcode.h
顧名思義,error code用    將一些錯誤條件define為值

#ifndef __ERRCODE_H
#define __ERRCODE_H

#define SUCCESS 0

// ================= demofile error cede ==================
// for general case
#define OFFSET     0
#define OPEN_FILE_FAIL   (OFFSET+0)
#define UNKNOWN_LINE   (OFFSET+1) //not [XXX] , XX = YY
#define INVALID_GROUP   (OFFSET+2) 
#define NOGROUP_ITEM   (OFFSET+3)
#define INVALID_NAME   (OFFSET+4)
#define INVALID_VALUE   (OFFSET+5)


// for def file
#define DEF_OFFSET    100
// in  [setting] group
#define DEF_SET_OFFSET   200
#define DEF_SET_INVALID_FRMNO (DEF_SET_OFFSET+6)
#define DEF_SET_INVALID_MODE (DEF_SET_OFFSET+7)
// in [channel] group
#define DEF_CH_OFFSET   300
#define DEF_CH_INVALID_CH  (DEF_CH_OFFSET+6)
#define DEF_CH_REPEAT_CH  (DEF_CH_OFFSET+7)
#define DEF_CH_INVALID_PIN  (DEF_CH_OFFSET+8)
#define DEF_CH_REPEAT_PIN  (DEF_CH_OFFSET+9)
#define DEF_CH_INVALID_MODE  (DEF_CH_OFFSET+10)
// in [Files] group
#define DEF_FIL_OFFSET   400
// for cmd file
#define CMD_OFFSET    500
#define CMD_NO_ACTNO   (CMD_OFFSET+6)
#define CMD_NO_CMD    (CMD_OFFSET+7)
#define CMD_NO_NAME    (CMD_OFFSET+8)


// for act file
#define ACT_OFFSET    600
#define ACT_INVALID_FRMNO  (ACT_OFFSET+6)
#define ACT_INVALID_TIME  (ACT_OFFSET+7)

// for frm file
#define FRM_OFFSET    700
#define FRM_REPEAT_CH   (FRM_OFFSET+6)

// for offset file
#define TXT_OFFSET    800
#define TXT_REPEAT_CH   (TXT_OFFSET+6)
// +++++++++++++++++++++++ end +++++++++++++++++++++++


// code for fileio
#define FILEIO_OFFSET   900
#define INI_FILEEND    (FILEIO_OFFSET+0)
#define INI_INVALID_CH   (FILEIO_OFFSET+1)
#define INI_INVALID_VALUE  (FILEIO_OFFSET+2) 
#define INI_DIVIDE_FAIL   (FILEIO_OFFSET+3) //string doesn't have separate char
#define INI_DIVIDE_STR1   (FILEIO_OFFSET+4)
#define INI_DIVIDE_STR2   (FILEIO_OFFSET+5)
#define INI_INVALID_NO   (FILEIO_OFFSET+6)
#define INI_INVALIDCHANNEL  (FILEIO_OFFSET+7)
#define INI_NUMPRE_NULL   (FILEIO_OFFSET+8)
#define INI_NUMPRE_INVALID  (FILEIO_OFFSET+9)
#define INI_NUMPRE_FAIL   (FILEIO_OFFSET+10)
#define INI_NUMPOST_NULL  (FILEIO_OFFSET+11)  // str = NULL
#define INI_NUMPOST_INVALID  (FILEIO_OFFSET+12) // unit error
#define INI_NUMPOST_FAIL  (FILEIO_OFFSET+13) // value error

//memory error
#define MEMORY_ERROR   (1000)

// fode for map
#define MAP_OFFSET    1100
#define MAP_NOFINDINITFRM  (MAP_OFFSET+0)
#define MAP_NOFINDFRM   (MAP_OFFSET+1)
#define MAP_REPEAT_FRMNO  (MAP_OFFSET+2)
#define MAP_NOFINEINITACT  (MAP_OFFSET+3)
#define MAP_NOFINDACT   (MAP_OFFSET+4)
#define MAP_REPEAT_ACTNO  (MAP_OFFSET+5)
#define MAP_REPEAT_CMD   (MAP_OFFSET+6)

#ifdef __cplusplus
extern "C" {
#endif

void errcode_ShowErr(int code);
void errcode_SetErrStr(const char *str);
void errcode_SetErrGroup(const char *str);
void errcode_SetErrFRM(const int frmno);
void errcode_SetErrACT(const int actno);
void errcode_SetErrCMD(const int cmd);

#ifdef __cplusplus
}
#endif

#endif


errcode.cpp
error code輸出錯誤訊息用

#include <string.h>
#include "errcode.h"
#include "userio.h"
#include "const.h"

#define DIVISOR  100
#define DEF   (DEF_OFFSET / DIVISOR)
#define DEF_SET  (DEF_SET_OFFSET / DIVISOR)
#define DEF_CH  (DEF_CH_OFFSET / DIVISOR)
#define DEF_FILE (DEF_FIL_OFFSET / DIVISOR)
#define CMD   (CMD_OFFSET / DIVISOR)
#define ACT   (ACT_OFFSET / DIVISOR)
#define FRM   (FRM_OFFSET / DIVISOR)
#define TXT   (TXT_OFFSET / DIVISOR)
#define MAP   (MAP_OFFSET / DIVISOR)

static char ErrLine[1024] = "";
static char ErrFile[256] = "";
static char ErrGroup[256] = "";
static int errfrm;
static int erract;
static char errcmd[10];

static void def_ErrShow(int code);
static void def_SetErrShow(int code);
static void def_CHErrShow(int code);
static void def_FileErrShow(int code);
static void cmd_ErrShow(int code);
static void act_ErrShow(int code);
static void frm_ErrShow(int code);
static void txt_ErrShow(int code);
static void map_ErrShow(int code);

static void map_ErrShow(int code)
{
 int i = code % DIVISOR;
 const char *str[] = {
  "map : can't find initial frame : %d\n",
  "map : an act has an undefined frame : %d\n",
  "map : repeat frame number : %d\n",
  "map : can't find initial action : %d\n",
  "map : a command point to an undefined act : %d\n",
  "map : repeat action  number : %d\n",
  "map : repeat command : %s\n"
 };
 switch(i){
  case 0: case 1: case 2:
   showmsg(str[i], errfrm);
   break;
  case 3: case 4: case 5:
   showmsg(str[i], erract);
   break;
  case 6:
   showmsg(str[i], errcmd);
   break;
 }
}

static void def_SetErrShow(int code)
{
 int i = code % DIVISOR;
 strcpy(ErrFile,"def");
 strcpy(ErrGroup, "Setting");
 const char *str[] = {
  "Open %s file fail\n",
  "%s file : unknown line : %s\n",
  "%s file : invalid group : %s\n",
  "%s file : no group item : %s\n",
  "%s file : invalid item name appears in group %s : %s",
  "%s file : invalid item value appears in group %s : %s",
  "%s file : invalid frame number appears in group %s : %s",
  "%s file : invalid initial frame mode appears in group %s : %s"
 };
 switch(i){
  case 0:
   showmsg(str[i], ErrFile);
   break;
  case 1: case 2: case 3:
   showmsg(str[i], ErrFile, ErrLine);
   break;
  default:
   showmsg(str[i], ErrFile, ErrGroup, ErrLine);
   break;
 }
}

static void def_CHErrShow(int code)
{
 int i = code % DIVISOR;
 strcpy(ErrFile,"def");
 strcpy(ErrGroup, "Channels");
 const char *str[] = {
  "Open %s file fail\n",
  "%s file : unknown line : %s\n",
  "%s file : invalid group : %s\n",
  "%s file : no group item : %s\n",
  "%s file : invalid item name appears in group %s : %s",
  "%s file : invalid item value appears in group %s : %s",
  "%s file : invalid channel appears in group %s : %s",
  "%s file : repeat channel appears in group %s : %s",
  "%s file : invalid pin appears in group %s : %s",
  "%s file : repeat pin appears in group %s : %s",
  "%s file : invalid servo mode appears in group %s : %s"
 };
 switch(i){
  case 0:
   showmsg(str[i], ErrFile);
   break;
  case 1: case 2: case 3:
   showmsg(str[i], ErrFile, ErrLine);
   break;
  default:
   showmsg(str[i], ErrFile, ErrGroup, ErrLine);
   break;
 }
}

static void def_FileErrShow(int code)
{
 int i = code % DIVISOR;
 strcpy(ErrFile,"def");
 strcpy(ErrGroup, "Files");
 const char *str[] = {
  "Open %s file fail\n",
  "%s file : unknown line : %s\n",
  "%s file : invalid group : %s\n",
  "%s file : no group item : %s\n",
  "%s file : invalid item name appears in group %s : %s",
  "%s file : invalid item value appears in group %s : %s"
 };
 switch(i){
  case 0:
   showmsg(str[i], ErrFile);
   break;
  case 1: case 2: case 3:
   showmsg(str[i], ErrFile, ErrLine);
   break;
  default:
   showmsg(str[i], ErrFile, ErrGroup, ErrLine);
   break;
 }
}

static void cmd_ErrShow(int code)
{
 int i = code % DIVISOR;
 strcpy(ErrFile,"cmd");
 const char *str[] = {
  "Open %s file fail\n",
  "%s file : unknown line : %s\n",
  "%s file : invalid group : %s\n",
  "%s file : no group item : %s\n",
  "%s file : invalid item name appears : %s\n",
  "%s file : invalid item value appears : %s\n",
  "%s file : a command don't define active number\n",
  "%s file : a command don't define command key\n",
  "%s file : a command don't define command name\n",
 };
 switch(i){
  case 0: case 6: case 7: case 8: case 9:
   showmsg(str[i], ErrFile);
   break;
  case 1: case 2: case 3: case 4: case 5:
   showmsg(str[i], ErrFile, ErrLine);
   break;
 }
}

static void act_ErrShow(int code)
{
 int i = code % DIVISOR;
 strcpy(ErrFile,"act");
 const char *str[] = {
  "Open %s file fail\n",
  "%s file : unknown line : %s\n",
  "%s file : invalid group : %s\n",
  "%s file : no group item : %s\n",
  "%s file : invalid item name appears in group %s : %s",
  "%s file : invalid item value appears in group %s : %s",
  "%s file : invalid frame number in group %s : %s",
  "%s file : incalid time appears in group %s : %s"
 };
 switch(i){
  case 0:
   showmsg(str[i], ErrFile);
   break;
  case 1: case 2: case 3:
   showmsg(str[i], ErrFile, ErrLine);
   break;
  default:
   showmsg(str[i], ErrFile, ErrGroup, ErrLine);
   break;
 }
}

static void frm_ErrShow(int code)
{
 int i = code % DIVISOR;
 strcpy(ErrFile,"frm");
 const char *str[] = {
  "Open %s file fail\n",
  "%s file : unknown line : %s\n",
  "%s file : invalid group : %s\n",
  "%s file : no group item : %s\n",
  "%s file : invalid item name appears in group %s : %s",
  "%s file : invalid item value appears in group %s : %s",
  "%s file : repeat channal in group %s : %s"
 };
 switch(i){
  case 0:
   showmsg(str[i], ErrFile);
   break;
  case 1: case 2: case 3:
   showmsg(str[i], ErrFile, ErrLine);
   break;
  default:
   showmsg(str[i], ErrFile, ErrGroup, ErrLine);
   break;
 }
}

static void txt_ErrShow(int code)
{
 int i = code % DIVISOR;
 strcpy(ErrFile,"offset");
 const char *str[] = {
  "Open %s file fail\n",
  "%s file : unknown line : %s\n",
  "%s file : invalid group : %s\n",
  "%s file : no group item : %s\n",
  "%s file : invalid item name appears : %s",
  "%s file : invalid item value appears : %s",
  "%s file : repeat channal : %s",
 };
 switch(i){
  case 0:
   showmsg(str[i], ErrFile);
   break;
  default:
   showmsg(str[i], ErrFile, ErrLine);
   break;
 }
}

static void def_ErrShow(int code)
{
 int i = code % DIVISOR;
 strcpy(ErrFile,"def");
 const char *str[] = {
  "Open %s file fail\n",
  "%s file : unknown line : %s\n",
  "%s file : invalid group : %s\n",
  "%s file : no group item : %s\n",
  "%s file : invalid item name appears in group %s : %s",
  "%s file : invalid item value appears in group %s : %s"
 };
 switch(i){
  case 0:
   showmsg(str[i], ErrFile);
   break;
  case 1: case 2: case 3:
   showmsg(str[i], ErrFile, ErrLine);
   break;
  default:
   showmsg(str[i], ErrFile, ErrGroup, ErrLine);
   break;
 }
}

void errcode_ShowErr(int code)
{
 int i;
 i = code / DIVISOR;
 switch(i){
  case DEF:
   def_ErrShow(code);
   break;
  case DEF_SET:
   def_SetErrShow(code);
   break;
  case DEF_CH:
   def_CHErrShow(code);
   break;
  case DEF_FILE:
   def_FileErrShow(code);
   break;
  case CMD:
   cmd_ErrShow(code);
   break;
  case ACT:
   act_ErrShow(code);
   break;
  case FRM:
   frm_ErrShow(code);
   break;
  case TXT:
   txt_ErrShow(code);
   break;
  case MAP:
   map_ErrShow(code);
 }
 showmsg("\nPress any key to quit\n");
 keyboard_waitkey();
}

void errcode_SetErrFRM(const int frmno)
{
 errfrm = frmno;
}

void errcode_SetErrACT(const int actno)
{
 erract = actno;
}
void errcode_SetErrGroup(const char *str)
{
 strcpy(ErrGroup, str);
}

void errcode_SetErrStr(const char *str)
{
 strcpy(ErrLine, str);
}

void errcode_SetErrCMD(const int cmd)
{
 int i;
 if((cmd > 'A') && (cmd < 'Z')){
  errcmd[0] = cmd;
  errcmd[1] = '\0';
 }
 else{
  for(i = 0; i < NUM_SKEY; i++){
   if(cmd == SKey[i].value)
    strcpy(errcmd, SKey[i].name);
  }
 }
}  





基本上這邊講的都蠻簡單的

也可以當作複習基本功囉~

下次開始就要進入較麻煩的部分了

敬請期待

Share:

0 留言:

張貼留言

技術提供:Blogger.

追蹤者