解析結構元素
菜單構建的基本單元是遊標和目錄數組。
遊標具有4個移動屬性的結構體:上、下、進入、退出
typedef struct
{
uint8 current;
uint8 up;
uint8 down;
// uint8 left; //左右鍵控制參數值的增大或者減小,這裏我們不將它納入菜單屬性
// uint8 right;
uint8 enter;
uint8 back;
void (*current_operation)();
}key_table;
通過改變遊標,到達對應索引值的目錄
遊標定義爲全局變量。
uint8 func_index=0;
處於不同索引值,運行對應的函數(oled顯示函數或是運行函數,一般來說調參函數將依附於顯示函數)
void (*current_operation_index)();
下面是索引目錄:
142以後可能會費用,在此不做解釋
索引函數,前五個值的含義:【當前目錄索引】、【遊標上移指向的目錄索引】、【遊標下移指向的目錄索引】、【遊標進入指向的目錄索引】、【遊標退出指向的目錄索引】
key_table table[174]=
{
{0,141,1,2,0,(*fun0)},// 第1層 【camera】
{1,0,19,4,1,(*fun1)},// 第1層 【machine】
{2,32,3,8,0,(*fun2)},// 第2層 【camera】->【live picture】
{3,2,30,9,0,(*fun3)},// 第2層 【camera】->【tuning】 調參
{4,29,5,4,1,(*fun4)},// 第2層 【machine】->【setpoint】(sPID)
{5,4,6,5,1,(*fun5)},// 第2層【machine】->【KP】(sPID)
{6,5,7,6,1,(*fun6)},// 第2層【machine】->【KI】(sPID)
{7,6,15,7,1,(*fun7)},// 第2層【machine】->【KD】(sPID)
{8,8,8,8,2,(*fun8)},// 第3層【camera】->【live picture】的具體實現
{9,17,10,9,3,(*fun9)},// 第3層【camera】->【tuning】->【AUTO_EXP】
{10,9,11,10,3,(*fun10)},// 第3層【camera】->【tuning】->【EXP_TIME】
{11,10,12,11,3,(*fun11)},// 第3層【camera】->【tuning】->【FPS】
{12,12,13,12,3,(*fun12)},// 第3層【camera】->【tuning】->【LR_OFFSET】
{13,12,14,13,3,(*fun13)},// 第3層【camera】->【tuning】->【UD_OFFSET】
{14,13,17,14,3,(*fun14)},// 第3層【camera】->【tuning】->【GAIN】
{15,7,16,15,1,(*fun15)},// 第2層 【machine】->【setpoint】(wPID)
{16,15,20,16,1,(*fun16)},// 第2層【machine】->【KP】(wPID)
{17,14,9,18,3,(*fun17)},// 第3層【camera】->【tuning】->【Threshold_mode】
{18,18,18,18,17,(*fun18)}, //第4層【camera】->【tuning】->若【Threshold_mode】爲人爲修改模式,可以進入到閾值賦值界面
{19,1,34,19,19,(*fun19)}, //調節補線的模式【mode1】:最小二乘法補線【mode2】:利用左右線偏移量補線 【mode3】:利用上一行左右線補線(廢棄!!!!)
{20,16,21,20,1,(*fun20)},// 第2層【machine】->【KI】(wPID)
{21,20,22,21,1,(*fun21)},// 第2層【machine】->【KD】(wPID)
{22,21,23,22,1,(*fun22)},// 第2層【machine】->max_hight
{23,22,24,23,1,(*fun23)},// 第2層【machine】->max_low
{24,23,25,24,1,(*fun24)},// 第2層【machine】->max_middle
{25,24,26,25,1,(*fun25)},// 第2層【machine】->【setpoint】(small_wPID)
{26,25,27,26,1,(*fun26)},// 第2層【machine】->【KP】(small_wPID)
{27,26,28,27,1,(*fun27)},// 第2層【machine】->【KI】(small_wPID)
{28,27,29,28,1,(*fun28)},// 第2層【machine】->【KD】(small_wPID)
{29,28,4,29,1,(*fun29)},// 第2層【machine】->k調節差速
{30,3,32,31,0,(*fun30)},// 第2層 【camera】->【read picture】
{31,31,31,31,30,(*fun31)},// 第2層 【camera】->【read picture】具體實現
{32,30,2,33,0,(*fun32)},// 第2層 【camera】->【load picture】
{33,33,33,33,32,(*fun33)},// 第2層 【camera】->【load picture】具體實現
{34,19,37,35,34,(*fun34)},// 第1層 【wenhao】
{35,47,36,35,34,(*fun35)},// 第2層 【wenhao】【KP】
{36,35,47,36,34,(*fun36)},// 第2層 【wenhao】【KD】
{37,34,40,38,37,(*fun37)},//第1層 【middle s】
{38,46,39,38,37,(*fun38)},//第2層 【middle s】【KP】
{39,38,46,39,37,(*fun39)},//第2層 【middle s】【KD】
{40,37,48,41,40,(*fun40)},//第1層 【coder】
{41,51,42,41,40,(*fun41)},//第2層 【coder】【LP】
{42,41,43,42,40,(*fun42)},//第2層 【coder】->【LI】
{43,42,44,43,40,(*fun43)},//第2層 【coder】【LD】
{44,43,45,44,40,(*fun44)},//第2層 【coder】【RP】
{45,44,51,45,40,(*fun45)},//第2層 【coder】->【RI】
//{46,45,41,46,40,(*fun46)},//第2層 【coder】【RD】
{46,39,38,46,37,(*fun46)},//第2層 【middle s】【目標值】
{47,36,35,47,34,(*fun47)},//第2層 【wenhao】【目標值】
{48,40,52,49,48,(*fun48)},//第1層 【flash】
{49,50,50,49,48,(*fun49)},//第1層 【flash】-【if save】 //左右按鍵控制yes or no
{50,49,49,50,48,(*fun50)},//第1層 【flash】-【if read】
{51,45,41,51,40,(*fun51)},//第2層 【coder】->【RD】
{52,48,59,53,52,(*fun52)},//第1層 【huandao50】舵機pd //入環和在環和出環
{53,69,54,53,52,(*fun53)},//第2層 【入環 speed】(50)
{54,53,55,54,52,(*fun54)},//第2層 【在環 speed】(50)
{55,54,56,55,52,(*fun55)},//第2層 【出環 speed】(50)
{56,55,57,56,52,(*fun56)},//第2層 【入環】舵機p(50)
{57,56,58,57,52,(*fun57)},//第2層 【入環】舵機d(50)
{58,57,67,58,52,(*fun58)},//第2層 【在環】舵機p(50)
{59,52,70,60,59,(*fun59)},//第1層 【打腳行】
{60,66,61,60,59,(*fun60)},//第2層 【打腳行-直到】
{61,60,62,61,59,(*fun61)},//第2層 【打腳行-彎道】
{62,61,63,62,59,(*fun62)},//第2層 【打腳行-小s】
{63,62,64,63,59,(*fun63)},//第2層 【打腳行-中s】
{64,63,65,64,59,(*fun64)},//第2層 【打腳行-環島-入環】
{65,64,66,65,59,(*fun65)},//第2層 【打腳行-環島-在環】
{66,65,60,66,59,(*fun66)},//第2層 【打腳行-環島-出環】
{67,58,68,67,52,(*fun67)},//第2層 【在環】舵機d(50)
{68,67,69,68,52,(*fun68)},//第2層 【出環】舵機p(50)
{69,68,53,69,52,(*fun69)},//第2層 【出環】舵機d (50)
{70,59,71,75,70,(*fun70)},//第1層 【huandao_60】舵機pd //入環和在環和出環
{71,70,72,84,71,(*fun71)},//第1層 【huandao_70】舵機pd //入環和在環和出環
{72,71,73,93,72,(*fun72)},//第1層 【huandao_80】舵機pd //入環和在環和出環
{73,72,74,102,73,(*fun73)},//第1層 【huandao_90】舵機pd //入環和在環和出環
{74,73,120,111,74,(*fun74)},//第1層 【huandao_100】舵機pd //入環和在環和出環
{75,83,76,75,70,(*fun75)},//第2層 【入環 speed】 (60)
{76,75,77,76,70,(*fun76)},//第2層 【在環 speed】(60)
{77,76,78,77,70,(*fun77)},//第2層 【出環 speed】(60)
{78,77,79,78,70,(*fun78)},//第2層 【入環】舵機p (60)
{79,78,80,79,70,(*fun79)},//第2層 【入環】舵機d (60)
{80,79,81,80,70,(*fun80)},//第2層 【在環】舵機p (60)
{81,80,82,81,70,(*fun81)},//第2層 【在環】舵機d (60)
{82,81,83,82,70,(*fun82)},//第2層 【出環】舵機p (60)
{83,82,75,83,70,(*fun83)},//第2層 【出環】舵機d (60)
{84,92,85,84,71,(*fun84)},//第2層 【入環 speed】(70)
{85,84,86,85,71,(*fun85)},//第2層 【在環 speed】(70)
{86,85,87,86,71,(*fun86)},//第2層 【出環 speed】(70)
{87,86,88,87,71,(*fun87)},//第2層 【入環】舵機p (70)
{88,87,89,88,71,(*fun88)},//第2層 【入環】舵機d (70)
{89,88,90,89,71,(*fun89)},//第2層 【在環】舵機p (70)
{90,89,91,90,71,(*fun90)},//第2層 【在環】舵機d (70)
{91,90,92,91,71,(*fun91)},//第2層 【出環】舵機p (70)
{92,91,84,92,71,(*fun92)},//第2層 【出環】舵機d (70)
{93,102,94,93,72,(*fun93)},//第2層 【入環 speed】(80)
{94,93,95,94,72,(*fun94)},//第2層 【在環 speed】(80)
{95,94,96,95,72,(*fun95)},//第2層 【出環 speed】(80)
{96,95,97,96,72,(*fun96)},//第2層 【入環】舵機p (80)
{97,96,98,97,72,(*fun97)},//第2層 【入環】舵機d (80)
{98,97,99,98,72,(*fun98)},//第2層 【在環】舵機p (80)
{99,98,100,99,72,(*fun99)},//第2層 【在環】舵機d (80)
{100,99,101,100,72,(*fun100)},//第2層 【出環】舵機p (80)
{101,100,93,101,72,(*fun101)},//第2層 【出環】舵機d (80)
{102,110,103,102,73,(*fun102)},//第2層 【入環 speed】(90)
{103,102,104,103,73,(*fun103)},//第2層 【在環 speed】(90)
{104,103,105,104,73,(*fun104)},//第2層 【出環 speed】(90)
{105,104,106,105,73,(*fun105)},//第2層 【入環】舵機p (90)
{106,105,107,106,73,(*fun106)},//第2層 【入環】舵機d (90)
{107,106,108,107,73,(*fun107)},//第2層 【在環】舵機p (90)
{108,107,109,108,73,(*fun108)},//第2層 【在環】舵機d (90)
{109,108,110,109,73,(*fun109)},//第2層 【出環】舵機p (90)
{110,109,102,110,73,(*fun110)},//第2層 【出環】舵機d (90)
{111,119,112,111,74,(*fun111)},//第2層 【入環 speed】(100)
{112,111,113,112,74,(*fun112)},//第2層 【在環 speed】(100)
{113,112,114,113,74,(*fun113)},//第2層 【出環 speed】(100)
{114,113,115,114,74,(*fun114)},//第2層 【入環】舵機p (100)
{115,114,116,115,74,(*fun115)},//第2層 【入環】舵機d (100)
{116,115,117,116,74,(*fun116)},//第2層 【在環】舵機p (100)
{117,116,118,117,74,(*fun117)},//第2層 【在環】舵機d (100)
{118,117,119,118,74,(*fun118)},//第2層 【出環】舵機p (100)
{119,118,111,119,74,(*fun119)},//第2層 【出環】舵機d (100)
{120,74,129,121,120,(*fun120)},//第1層 【選擇環島1-8的大小】
{121,128,122,121,120,(*fun121)},//第2層 【選擇環島1的大小】
{122,121,123,122,120,(*fun122)},//第2層 【選擇環島2的大小】
{123,122,124,123,120,(*fun123)},//第2層 【選擇環島3的大小】
{124,123,125,124,120,(*fun124)},//第2層 【選擇環島4的大小】
{125,124,126,125,120,(*fun125)},//第2層 【選擇環島5的大小】
{126,125,127,126,120,(*fun126)},//第2層 【選擇環島6的大小】
{127,126,128,127,120,(*fun127)},//第2層 【選擇環島7的大小】
{128,127,121,128,120,(*fun128)},//第2層 【選擇環島8的大小】
{129,120,138,130,129,(*fun129)},//第1層 【選擇差速的大小】
{130,137,131,130,129,(*fun130)},//第2層 【小S差速】
{131,130,132,131,129,(*fun131)},//第2層 【中S差速】
{132,131,133,132,129,(*fun132)},//第2層 【huan50差速】
{133,132,134,133,129,(*fun133)},//第2層 【huan60差速】
{134,133,135,134,129,(*fun134)},//第2層 【huan70差速】
{135,134,136,135,129,(*fun135)},//第2層 【huan80差速】
{136,135,137,136,129,(*fun136)},//第2層 【huan90差速】
{137,136,130,137,129,(*fun137)},//第2層 【huan100差速】
{138,129,139,142,138,(*fun138)},//第1層 【deltaP_max】
{139,138,140,150,139,(*fun139)},//第1層 【deltaP_min】
{140,139,141,158,140,(*fun140)},//第1層 【deltaD_max】
{141,140,0,166,141,(*fun141)},//第1層 【deltaD_max】
{142,149,143,142,138,(*fun142)},//第2層 【0】
{143,142,144,143,138,(*fun143)},//第2層 【1】
{144,143,145,144,138,(*fun144)},//第2層 【2】
{145,144,146,145,138,(*fun145)},//第2層 【3】
{146,145,147,146,138,(*fun146)},//第2層 【4】
{147,146,148,147,138,(*fun147)},//第2層 【5】
{148,147,149,148,138,(*fun148)},//第2層 【6】
{149,148,142,149,138,(*fun149)},//第2層 【7】
{150,157,151,150,139,(*fun150)},//第2層 【0】
{151,150,152,151,139,(*fun151)},//第2層 【1】
{152,151,153,152,139,(*fun152)},//第2層 【2】
{153,152,154,153,139,(*fun153)},//第2層 【3】
{154,153,155,154,139,(*fun154)},//第2層 【4】
{155,154,156,155,139,(*fun155)},//第2層 【5】
{156,155,157,156,139,(*fun156)},//第2層 【6】
{157,156,150,157,139,(*fun157)},//第2層 【7】
{158,165,159,158,140,(*fun158)},//第2層 【0】
{159,158,160,159,140,(*fun159)},//第2層 【1】
{160,159,161,160,140,(*fun160)},//第2層 【2】
{161,160,162,161,140,(*fun161)},//第2層 【3】
{162,161,163,162,140,(*fun162)},//第2層 【4】
{163,162,164,163,140,(*fun163)},//第2層 【5】
{164,163,165,164,140,(*fun164)},//第2層 【6】
{165,164,158,165,140,(*fun165)},//第2層 【7】
{166,173,167,166,141,(*fun166)},//第2層 【0】
{167,166,168,167,141,(*fun167)},//第2層 【1】
{168,167,169,168,141,(*fun168)},//第2層 【2】
{169,168,170,169,141,(*fun169)},//第2層 【3】
{170,169,171,170,141,(*fun170)},//第2層 【4】
{171,170,172,171,141,(*fun171)},//第2層 【5】
{172,171,173,172,141,(*fun172)},//第2層 【6】
{173,172,166,173,141,(*fun173)},//第2層 【7】
};
菜單圖示
菜單缺點:
1、當有些目錄沒有用處想刪除時,不易刪除,需要改動所有的索引值,因爲一旦遊標指向不存在的索引值將會導致棧溢出.
2、框架一旦定下,修改及其困難,在目錄逐漸擴大時,這種弊端體現地越發明顯。