| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807 |
- #define LOG_TAG "dotled" // 该模块对应的标签。不定义时,默认:NO_TAG
- #define LOG_LVL LOG_LVL_DBG // LOG_LVL_DBG // 该模块对应的日志输出级别。不
- #include <ulog.h> // 必须在 LOG_TAG 与 LOG_LVL 下面
- #include "dotled.h"
- #include <easyflash.h>
- #include "sys_config.h"
- extern uint32_t month;
- extern uint32_t day;
- extern uint32_t year;
- extern uint32_t hour;
- extern uint32_t min;
- extern uint32_t sec;
- extern uint8_t week;
- extern led_t *SENSORLED;
- extern led_t *COMMLED;
- extern led_t *DOTLED;
- #define RS485_DOTLED_EN GET_PIN(D, 1)
- #ifndef dot_mod
- #define DOTLED_UART_NAME "uart3" /* 串口设备名称 */
- #else
- #define DOTLED_UART_NAME "uart6" /* 串口设备名称 */
- #endif
- /* 串口设备句柄 */
- static rt_device_t dotled;
- #define timed_events_TITLE (1 << 0) //标题刷新计时
- #define timed_events_MAIN (1 << 1) //内容刷新计时
- #define timed_events_RTC (1 << 2) //时间显示刷新计时
- #define timed_events_MAIN1 (1 << 3) //内容刷新计时
- #define timed_events_onoff (1 << 4) //
- /* 定时事件控制块 */
- static struct rt_event timed_events;
- /* 定时器的控制块 */
- static rt_timer_t dotled_timed_task;
- #define dis_buff_len 40 * qxz.Param.Num_sensors
- /*1米*0.5米屏幕点阵为 96*48 */
- /*1米* 1米屏幕点阵为 96*96 */
- /*2米* 1米屏幕点阵为192*96 */
- static char dotledtitle[60]; // LED显示屏抬头,最大显示30个汉字
- static char dotledtitle_down[60]; // LED显示屏下发抬头内容,最大显示30个汉字
- static uint32_t title_timeout = 0; // 下发后抬头显示超时失效时间。
- static uint16_t main_keeptime = 16; //主显示区单页面显示时长,0.5s步进
- /*屏幕显示行数 1 * 0.5米为96*48点阵,显示3行
- *屏幕显示行数 1 * 1米为96*96点阵, 显示6行
- *屏幕显示行数 2 * 1米为192*96点阵, 显示5行
- */
- static uint16_t screen_line = 12;
- //点阵屏尺寸规格区分标志位
- //static uint8_t dotled_size = 0;
- static char *green = "\\C2";
- static char *red = "\\C1";
- /*发送显示数据使用缓存指针*/
- static uint8_t *Dis_Comm = RT_NULL;
- //static uint8_t *dis_buff = RT_NULL;
- //转义字符,输入:待转义字符指针,长度
- uint16_t Escape_character(uint8_t *buff, uint16_t len);
- void Time2BCD(char *bcd_buf);
- static uint8_t frame[8] = {0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5}; //包头
- static uint8_t header[12] = {0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x02}; //帧头,5K1,5K2屏幕区分
- //十进制转ASCII码
- #define KB2ASC(x) (u8)(0x30 + x)
- //ASCII码转十进制
- #define ASC2KB(x) (u8)(x % (0x30))
- #define PLOY 0xa001 //0x8005 反转
- uint8_t crc16(uint8_t *data, uint8_t size);
- //获取字符串长度
- uint8_t sizeof_s(char *str);
- //把str1的内容copy到str2
- //*str1:字符串1指针
- //*str2:字符串2指针
- void strcopy(char *str1, char *str2);
- /* 定时器超时函数 */
- static void dotled_timed(void *parameter)
- {
- static rt_uint32_t cnt = 0;
- cnt++;
- rt_uint8_t temp;
- if (cnt % ((rt_uint32_t)parameter * main_keeptime * ((qxz.Param.Num_sensors / screen_line) + 3)) == 0)
- {
- rt_event_send(&timed_events, timed_events_TITLE); //定时时间到,发送事件
- }
- if (qxz.Param.Num_sensors % screen_line != 0)
- {
- temp = qxz.Param.Num_sensors / screen_line + 1;
- }
- else
- temp = qxz.Param.Num_sensors / screen_line;
- if (cnt % ((rt_uint32_t)parameter * (uint16_t)(main_keeptime) * (temp + 0)) == 0) //
- {
- rt_event_send(&timed_events, timed_events_MAIN); //定时时间到,发送事件
- rt_event_send(&timed_events, timed_events_MAIN1); //定时时间到,发送事件
- }
- if (cnt % 3600 == 0) //1小时刷新1次
- {
- rt_event_send(&timed_events, timed_events_RTC); //定时时间到,发送事件
- }
- }
- //参数结构变量赋初值
- static bx_5k_area_header bx_5k = {
- .Frame = frame, //帧头 8 bytes (A5)
- .Header = header, //包头 12 bytes (01 00 00 80 00 00 00 00 00 00 FE 02)
- .Len = {0, 0}, //整个发送数据除去帧头,包头,CRC校验后的长度 2 bytes
- .Cmd_dis = {0xa3, 0x06}, //发送实时显示信息命令 A3 06
- .Reply_f = 0x00, //控制器回复标志 01
- .Reserved0 = {0x00, 0x00}, //2D 00→保留字节(此值未使用)
- .Areadealnum = 0, //00→要删除的区域个数
- .AreaNum = 0x01, //区域个数,默认为 0x01,1 bytes
- .AreaLen = {0, 0}, //动态区域0数据长度,2 bytes
- .AreaType = 0x00, //设置区域类型,默认为 0x00 1 bytes
- .AreaX = {0x00, 0}, //设置 X 坐标 2 bytes
- .AreaY = {0x00, 0}, //设置 Y 坐标 2 bytes
- .AreaWidth = {0x80, 0}, //设置屏宽度 2 bytes
- .AreaHeight = {0x34, 0}, //设置屏高度 2 bytes
- .DynamicAreaLoc = 1, //设置动态区编号 1 bytes
- .Lines_sizes = 0, //行间距
- .RunMode = 0, //动态区数据循环模式 1 bytes
- .Timeout = {0x05, 0x00}, //设置超时时间 2 bytes
- .Reserved1 = {0, 0, 0}, //保留 3 bytes
- .SingleLine = 0x02, //设置是否单行显示 1 bytes
- .NewLine = 0x02, //设置是否自动换行 1 bytes
- .DisplayMode = 0x02, //设置显示方式 1 bytes 01静止显示
- .ExitMode = 0x00, //设置退出方式 1 bytes
- .Speed = 0x02, //设置运行速度 1 bytes
- .StayTime = 0x05, //设置停留时间 1 bytes
- .DataLen = {0, 0, 0, 0}, //要显示内容的个数 4 bytes
- .dis_buff = 0, //显示内容
- .crc_data = {0, 0}, //CRC
- };
- #define CN 0
- #define EN 1
- #define W_dic_Lang CN
- /*刷新风向传感器数据*/
- char *Display_Data_wind_direction360(uint16_t direction)
- {
- uint8_t temp;
- direction = direction % 360;
- #ifdef saitong_sensor
- temp = (uint8_t)(direction / 10 / 22.5);
- #else
- temp = (uint8_t)(direction / 22.5);
- #endif
- #if 0
- /*21101073A单色1*0.5屏幕定制*/
- temp = (uint8_t)(direction/10/22.5);
- #endif
- static char direction_op[10];
- rt_memset(direction_op, '\0', 10);
- switch (temp)
- {
- case 0:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " N ");
- }
- else
- {
- sprintf(direction_op, "%s", "北风 ");
- }
- break;
- case 1:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " NE ");
- }
- else
- {
- sprintf(direction_op, "%s", "东北风");
- }
- break;
- case 2:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " NE ");
- }
- else
- {
- sprintf(direction_op, "%s", "东北风");
- }
- break;
- case 3:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " E ");
- }
- else
- {
- sprintf(direction_op, "%s", "东风 ");
- }
- break;
- case 4:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " E ");
- }
- else
- {
- sprintf(direction_op, "%s", "东风 ");
- }
- break;
- case 5:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " ES ");
- }
- else
- {
- sprintf(direction_op, "%s", "东南风");
- }
- break;
- case 6:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " ES ");
- }
- else
- {
- sprintf(direction_op, "%s", "东南风");
- }
- break;
- case 7:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " S ");
- }
- else
- {
- sprintf(direction_op, "%s", "南风 ");
- }
- break;
- case 8:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " S ");
- }
- else
- {
- sprintf(direction_op, "%s", "南风 ");
- }
- break;
- case 9:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " SW ");
- }
- else
- {
- sprintf(direction_op, "%s", "西南风");
- }
- break;
- case 10:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " SW ");
- }
- else
- {
- sprintf(direction_op, "%s", "西南风");
- }
- break;
- case 11:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " W ");
- }
- else
- {
- sprintf(direction_op, "%s", "西风 ");
- }
- break;
- case 12:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " W ");
- }
- else
- {
- sprintf(direction_op, "%s", "西风 ");
- }
- break;
- case 13:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " NW ");
- }
- else
- {
- sprintf(direction_op, "%s", "西北风");
- }
- break;
- case 14:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " NW ");
- }
- else
- {
- sprintf(direction_op, "%s", "西北风");
- }
- break;
- case 15:
- if (W_dic_Lang == EN)
- {
- sprintf(direction_op, "%s", " N ");
- }
- else
- {
- sprintf(direction_op, "%s", "北风 ");
- }
- break;
- default:
- break;
- }
- //rt_kprintf("direction_op %s\n" , direction_op);
- return direction_op;
- }
- //区域1显示数据格式化,返回长度
- uint16_t Area1_dis_format(uint8_t *buff)
- {
- uint16_t i = 0;
- char sensor_value[50] = {0};
- uint16_t total = 0; /* 记录当前数据长度 */
- // char sensor_nop[4] = {0};
- for (i = 0; i < qxz.Param.Num_sensors; i++)
- {
- rt_memset(sensor_value, 0, 50); //判断是否传感器未接或故障,如果是则显示为空
- if (strcmp(sensor[i].eName, "\0") != 0) /*传感器eName不能为空*/
- {
- if (strstr(sensor[i].eValue, "-99.99") == NULL)
- {
- if ((strstr(sensor[i].eName, "WindDirection") != RT_NULL) || (strstr(sensor[i].eName, "360TO_") != RT_NULL))
- strcpy(sensor_value, Display_Data_wind_direction360(sensor[i].value)); //如果是风向则角度转为汉字
- else if (strcmp(sensor[i].eName, "RainSnow") == 0)
- {
- if (sensor[i].value == 0)
- strcpy(sensor_value, " 无 ");
- else if (sensor[i].value == 1)
- strcpy(sensor_value, " 有 ");
- }
- else
- strcpy(sensor_value, sensor[i].eValue);
- }
- if (qxz.Param.Dotled_Option > 1) //大于1,显示双色
- //total += rt_sprintf((char *)(buff + total),sensor[i].dotled_s, green, green, sensor_value);//2.7.8版本
- total += rt_sprintf((char *)(buff + total), sensor[i].dotled_s, red, green, sensor_value);
- else
- total += rt_sprintf((char *)(buff + total), sensor[i].dotled_s, red, red, sensor_value);
- }
- }
- return total; /* 返回前数据长度 */
- }
- uint16_t Area1_dis_format_PART(uint8_t *buff, uint8_t start, uint8_t len)
- {
- uint16_t i = 0;
- char sensor_value[50] = {0};
- uint16_t total = 0; /* 记录当前数据长度 */
- // char sensor_nop[4] = {0};
- //rt_kprintf("Area1_dis_format_PART > ");
- for (i = start; i < start + len; i++)
- {
- //rt_kprintf("%d ",i);
- rt_memset(sensor_value, 0, 50); //判断是否传感器未接或故障,如果是则显示为空
- if (strcmp(sensor[i].eName, "\0") != 0) /*传感器eName不能为空*/
- {
- if (strstr(sensor[i].eValue, "-99.99") == NULL)
- {
- if ((strstr(sensor[i].eName, "WindDirection") != RT_NULL) || (strstr(sensor[i].eName, "360TO_") != RT_NULL))
- strcpy(sensor_value, Display_Data_wind_direction360(sensor[i].value)); //如果是风向则角度转为汉字
- else if (strcmp(sensor[i].eName, "RainSnow") == 0)
- {
- if (sensor[i].value == 0)
- strcpy(sensor_value, " 无 ");
- else if (sensor[i].value == 1)
- strcpy(sensor_value, " 有 ");
- }
- else
- strcpy(sensor_value, sensor[i].eValue);
- }
- if (qxz.Param.Dotled_Option > 1) //大于1,显示双色
- //total += rt_sprintf((char *)(buff + total), sensor[i].dotled_s,green, green, sensor_value);//2.7.8版本
- total += rt_sprintf((char *)(buff + total), sensor[i].dotled_s, red, green, sensor_value);
- else
- total += rt_sprintf((char *)(buff + total), sensor[i].dotled_s, red, red, sensor_value);
- }
- }
- //rt_kprintf("\n");
- // rt_kprintf(" >>> %s \n" , buff);
- return total; /* 返回前数据长度 */
- }
- void controller_type(uint8_t type)
- {
- switch (type)
- {
- case 1:
- header[10] = 0x51;
- break;
- case 2:
- header[10] = 0x52;
- break;
- case 3:
- header[10] = 0x53;
- break;
- default:
- break;
- }
- }
- static SYSTEMTIMESET TimeSet = {
- .Frame = frame, //帧头 8 bytes (A5)
- .Header = header, //包头 12 bytes (01 00 00 80 00 00 00 00 00 00 FE 02)
- .Len = {0, 0}, //整个发送数据除去帧头,包头,CRC校验后的长度 2 bytes
- .Cmd_Group = 0xA2,
- .Cmd = 0x03,
- .Response = 0x02,
- // .Reserved = {0,0},
- .DataLen = {0, 0},
- .System_time = 0,
- .crc_data = {0, 0}, //CRC
- };
- //控制卡校准时间
- void DotLED_TIMESET(uint8_t set)
- {
- uint16_t add_len = 0; //整个数据总长度
- uint16_t total = 0; /* 记录当前数据长度 */
- uint16_t crc_data = 0;
- // uint16_t i, j, t = 0;
- uint16_t t = 0;
- static uint8_t SETIME_RUN1TIME = 1; /*清除功能1次标志*/
- if ((hour == 1) || (set == 1)) //每天1点对时或强制对时
- {
- if (SETIME_RUN1TIME == 1)
- {
- rt_memset(Dis_Comm, '\0', dis_buff_len + 300);
- Time2BCD((char *)TimeSet.System_time);
- total = 8;
- TimeSet.Len[0] = (char)((total + 5) & 0xff); /*计算动态区域0数据长度*/
- TimeSet.Len[1] = (char)((total + 5) >> 8);
- TimeSet.DataLen[0] = (char)(total & 0xff); /**/
- TimeSet.DataLen[1] = (char)(total >> 8);
- rt_memcpy(Dis_Comm + add_len, TimeSet.Header, 12);
- add_len = 12;
- rt_memcpy(Dis_Comm + add_len, TimeSet.Len, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &TimeSet.Cmd_Group, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &TimeSet.Cmd, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &TimeSet.Response, 1);
- add_len += 1;
- // rt_memcpy(Dis_Comm + add_len , TimeSet.Reserved, 2);add_len += 2;
- rt_memcpy(Dis_Comm + add_len, TimeSet.DataLen, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, TimeSet.System_time, total);
- add_len += total;
- t = (TimeSet.Len[1] << 8) + TimeSet.Len[0];
- t = t + 14; //加Data_Field_1+数据长度2
- crc_data = CRC16_IBM(Dis_Comm, t); /*先计算出CRC值再来查询转义字符*/
- Dis_Comm[t] = crc_data >> 8;
- t = t + 1;
- Dis_Comm[t] = crc_data;
- t = t + 1;
- t = Escape_character(Dis_Comm, t); //字符转义处理
- Dis_Comm[t] = 0x5a;
- rt_pin_write(RS485_DOTLED_EN, PIN_HIGH);
- rt_device_write(dotled, 0, TimeSet.Frame, 8);
- rt_device_write(dotled, 0, (Dis_Comm), t + 1);
- char *led_blink_mode_1 = "50,50,"; //10Hz闪烁
- led_set_mode(DOTLED, 5, led_blink_mode_1);
- rt_pin_write(RS485_DOTLED_EN, PIN_LOW); /*485输入使能*/
- SETIME_RUN1TIME = 0; /*只运行一次*/
- rt_thread_mdelay(1000);
- }
- }
- else
- SETIME_RUN1TIME = 1; /*其他时间运行1次标志复位*/
- }
- //char time_test[] = "\\DL月\\DD日\\C3\\DH时\\DM分";//\\DS秒";
- static char time_YM[] = "\\C3 20\\DY年\\DL月"; //"\\C3\\DY 年\\DL月\\DD日\\C3\\DH时\\DM分\\DS秒
- static char time_DHM[] = "\\C3\\DD日\\C3\\DH时\\DM分";
- static char time_YMDHM[] = " 20\\DY年\\DL月\\DD日 \\C3 \\DH时\\DM分";
- //抬头:区域0显示函数,显示抬头
- void DotLED_DisplayTime(uint8_t x, uint8_t y, uint8_t Width, uint8_t Height, uint8_t TURNON_RUN)
- {
- uint16_t add_len = 0; //整个数据总长度
- uint16_t total = 0; /* 记录当前数据长度 */
- rt_uint32_t e;
- uint16_t crc_data = 0;
- uint16_t i, j, t = 0;
- if ((rt_event_recv(&timed_events, timed_events_RTC,
- RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
- 0, &e) == RT_EOK) ||
- (TURNON_RUN == 1)) //定时时间到或者开机运行1次
- {
- rt_thread_mdelay(1000);
- rt_memset(Dis_Comm, '\0', dis_buff_len + 300);
- rt_memset(bx_5k.dis_buff, '\0', dis_buff_len);
- bx_5k.AreaX[0] = (char)(x & 0xff);
- bx_5k.AreaX[1] = (char)((x >> 8) | 0x80); //最高位置一,以像素点为单位
- // bx_5k.AreaX[1] = (char)( x >> 8);
- bx_5k.AreaY[0] = (char)(y & 0xff);
- bx_5k.AreaY[1] = (char)(y >> 8);
- bx_5k.AreaWidth[0] = (char)(Width & 0xff);
- bx_5k.AreaWidth[1] = (char)((Width >> 8) | 0x80); //最高位置一,以像素点为单位
- // bx_5k.AreaWidth[1] = (char)( Width >> 8);
- bx_5k.AreaHeight[0] = (char)(Height & 0xff);
- bx_5k.AreaHeight[1] = (char)(Height >> 8);
- bx_5k.DynamicAreaLoc = 0x00; //设置动态区域为0
- bx_5k.Lines_sizes = 0; //行间距
- bx_5k.RunMode = 0x00; //动态区域运行模式,动态区数据循环显示*/
- bx_5k.Timeout[0] = 0x03; //
- bx_5k.Timeout[1] = 0x00; //超时时间
- bx_5k.SingleLine = 0x02; //设置是否单行显示 :01单行显示02多行显示
- bx_5k.NewLine = 0x01; //设置是否自动换行:01不自动换行 02自动换行
- /*正常显示抬头效果配置*/
- bx_5k.DisplayMode = 0x02; //设置显示方式:02快速打出/03向左移动
- bx_5k.ExitMode = 0x00; //设置退出方式
- bx_5k.Speed = 0x02; //设置运行速度
- bx_5k.StayTime = 0x05; //设置停留时间 0x01为0.5s
- if (qxz.Param.Dotled_Option != 1) //5k1显示整个内容
- {
- if (qxz.Param.application_model == 0) //当前应用模式:环境气象站
- total += sprintf((char *)bx_5k.dis_buff + total, "%s", time_YM); //显示抬头\\C3\\DH时\\DM分\\DS秒
- else if (qxz.Param.application_model == 1) //当前应用模式:墒情监测站
- total += sprintf((char *)bx_5k.dis_buff + total, "%s", time_DHM); //显示抬头\\C3\\DH时\\DM分\\DS秒
- }
- else
- total += sprintf((char *)bx_5k.dis_buff + total, "%s", time_YMDHM); //显示抬头\\C3\\DH时\\DM分\\DS秒
- bx_5k.Len[0] = (char)((total + 9 + 27) & 0xff); /*计算动态区域0数据长度*/
- bx_5k.Len[1] = (char)((total + 9 + 27) >> 8);
- bx_5k.AreaLen[0] = (char)((total + 27) & 0xff); /*计算动态区域0数据长度*/
- bx_5k.AreaLen[1] = (char)((total + 27) >> 8);
- bx_5k.DataLen[0] = (char)(total & 0xff); /*实际显示内容长度,实际占32位,只实现了16位*/
- bx_5k.DataLen[1] = (char)(total >> 8);
- rt_memcpy(Dis_Comm + add_len, bx_5k.Header, 12);
- add_len = 12;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Len, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Cmd_dis, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Reply_f, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Reserved0, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Areadealnum, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.AreaNum, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaLen, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.AreaType, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaX, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaY, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaWidth, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaHeight, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.DynamicAreaLoc, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Lines_sizes, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.RunMode, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Timeout, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Reserved1, 3);
- add_len += 3;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.SingleLine, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.NewLine, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.DisplayMode, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.ExitMode, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Speed, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.StayTime, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.DataLen, 4);
- add_len += 4;
- rt_memcpy(Dis_Comm + add_len, (uint8_t *)bx_5k.dis_buff, total);
- add_len += total;
- t = (bx_5k.Len[1] << 8) + bx_5k.Len[0];
- t = t + 14; //加Data_Field_1+数据长度2
- crc_data = CRC16_IBM(Dis_Comm, t); /*先计算出CRC值再来查询转义字符*/
- Dis_Comm[t] = crc_data >> 8;
- t = t + 1;
- Dis_Comm[t] = crc_data;
- t = t + 1;
- t = Escape_character(Dis_Comm, t); //字符转义处理
- Dis_Comm[t] = 0x5a;
- rt_pin_write(RS485_DOTLED_EN, PIN_HIGH); /*485输出使能*/
- rt_device_write(dotled, 0, bx_5k.Frame, 8);
- rt_device_write(dotled, 0, (Dis_Comm), t + 1);
- char *led_blink_mode_1 = "50,50,"; //10Hz闪烁
- led_set_mode(DOTLED, 5, led_blink_mode_1);
- rt_pin_write(RS485_DOTLED_EN, PIN_LOW); /*485输入使能*/
- }
- }
- //抬头:区域0显示函数,显示抬头
- void DotLED_DisplayArea0(uint8_t x, uint8_t y, uint8_t Width, uint8_t Height, uint8_t TURNON_RUN)
- {
- uint16_t add_len = 0; //整个数据总长度
- uint16_t total = 0; /* 记录当前数据长度 */
- rt_uint32_t e;
- uint16_t crc_data = 0;
- uint16_t i, j, t = 0;
- if ((rt_event_recv(&timed_events, timed_events_TITLE,
- RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
- 0, &e) == RT_EOK) ||
- (TURNON_RUN == 1)) //定时时间到或者开机运行1次
- {
- rt_memset(Dis_Comm, '\0', dis_buff_len + 300);
- rt_memset(bx_5k.dis_buff, '\0', dis_buff_len);
- bx_5k.AreaX[0] = (char)(x & 0xff);
- bx_5k.AreaX[1] = (char)((x >> 8) | 0x80); //最高位置一,以像素点为单位
- // bx_5k.AreaX[1] = (char)( x >> 8);
- bx_5k.AreaY[0] = (char)(y & 0xff);
- bx_5k.AreaY[1] = (char)(y >> 8);
- bx_5k.AreaWidth[0] = (char)(Width & 0xff);
- bx_5k.AreaWidth[1] = (char)((Width >> 8) | 0x80); //最高位置一,以像素点为单位
- // bx_5k.AreaWidth[1] = (char)( Width >> 8);
- bx_5k.AreaHeight[0] = (char)(Height & 0xff);
- bx_5k.AreaHeight[1] = (char)(Height >> 8);
- bx_5k.DynamicAreaLoc = 0x00; //设置动态区域为0
- bx_5k.Lines_sizes = 0; //行间距
- bx_5k.RunMode = 0x00; //动态区域运行模式,动态区数据循环显示*/
- bx_5k.Timeout[0] = 0x00; //
- bx_5k.Timeout[1] = 0x00; //超时时间
- bx_5k.SingleLine = 0x01; //设置是否单行显示 :单行显示
- bx_5k.NewLine = 0x01; //设置是否自动换行:不自动换行
- if (title_timeout == 0) //正常显示气象站抬头
- {
- /*正常显示抬头效果配置*/
- bx_5k.DisplayMode = 0x02; //设置显示方式:02快速打出/03向左移动/05向上移动
- bx_5k.ExitMode = 0x00; //设置退出方式
- bx_5k.Speed = 0x02; //设置运行速度
- bx_5k.StayTime = 0xa0; //设置停留时间 0x01为5s
- total += sprintf((char *)bx_5k.dis_buff + total, "%s", dotledtitle); //显示抬头
- }
- else //滚动显示下发内容
- {
- /*显示自定义抬头滚动效果配置*/
- bx_5k.DisplayMode = 0x03; //设置显示方式:02快速打出/03向左移动
- bx_5k.ExitMode = 0x00; //设置退出方式
- bx_5k.Speed = 0x04; //设置运行速度
- bx_5k.StayTime = 0x01; //设置停留时间 0x01为0.5s
- total += sprintf((char *)bx_5k.dis_buff + total, "%s", dotledtitle_down); //显示抬头
- }
- bx_5k.Len[0] = (char)((total + 9 + 27) & 0xff); /*计算动态区域0数据长度*/
- bx_5k.Len[1] = (char)((total + 9 + 27) >> 8);
- bx_5k.AreaLen[0] = (char)((total + 27) & 0xff); /*计算动态区域0数据长度*/
- bx_5k.AreaLen[1] = (char)((total + 27) >> 8);
- bx_5k.DataLen[0] = (char)(total & 0xff); /*实际显示内容长度,实际占32位,只实现了16位*/
- bx_5k.DataLen[1] = (char)(total >> 8);
- rt_memcpy(Dis_Comm + add_len, bx_5k.Header, 12);
- add_len = 12;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Len, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Cmd_dis, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Reply_f, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Reserved0, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Areadealnum, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.AreaNum, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaLen, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.AreaType, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaX, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaY, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaWidth, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaHeight, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.DynamicAreaLoc, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Lines_sizes, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.RunMode, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Timeout, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Reserved1, 3);
- add_len += 3;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.SingleLine, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.NewLine, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.DisplayMode, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.ExitMode, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Speed, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.StayTime, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.DataLen, 4);
- add_len += 4;
- rt_memcpy(Dis_Comm + add_len, (uint8_t *)bx_5k.dis_buff, total);
- add_len += total;
- t = (bx_5k.Len[1] << 8) + bx_5k.Len[0];
- t = t + 14; //加Data_Field_1+数据长度2
- crc_data = CRC16_IBM(Dis_Comm, t); /*先计算出CRC值再来查询转义字符*/
- Dis_Comm[t] = crc_data >> 8;
- t = t + 1;
- Dis_Comm[t] = crc_data;
- t = t + 1;
- t = Escape_character(Dis_Comm, t); //字符转义处理
- Dis_Comm[t] = 0x5a;
- rt_pin_write(RS485_DOTLED_EN, PIN_HIGH); /*485输出使能*/
- rt_device_write(dotled, 0, bx_5k.Frame, 8);
- rt_device_write(dotled, 0, (Dis_Comm), t + 1);
- char *led_blink_mode_1 = "50,50,"; //10Hz闪烁
- led_set_mode(DOTLED, 5, led_blink_mode_1);
- rt_pin_write(RS485_DOTLED_EN, PIN_LOW); /*485输入使能*/
- rt_thread_mdelay(1000);
- }
- }
- //内容:区域1显示函数
- void DotLED_DisplayArea1(uint8_t x, uint8_t y, uint8_t Width, uint8_t Height, uint8_t keeptime)
- {
- uint16_t add_len = 0; //整个数据总长度
- uint16_t total = 0; /* 记录当前数据长度 */
- uint16_t crc_data = 0;
- uint16_t i, j, t = 0;
- rt_uint32_t e;
- if (rt_event_recv(&timed_events, timed_events_MAIN,
- RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
- 0, &e) == RT_EOK)
- {
- rt_memset(Dis_Comm, '\0', dis_buff_len + 300);
- rt_memset(bx_5k.dis_buff, '\0', dis_buff_len);
- bx_5k.AreaX[0] = (char)(x & 0xff);
- bx_5k.AreaX[1] = (char)((x >> 8) | 0x80); //最高位置一,以像素点为单位
- // bx_5k.AreaX[1] = (char)( x >> 8);
- bx_5k.AreaY[0] = (char)(y & 0xff);
- bx_5k.AreaY[1] = (char)(y >> 8);
- bx_5k.AreaWidth[0] = (char)(Width & 0xff);
- bx_5k.AreaWidth[1] = (char)((Width >> 8) | 0x80); //最高位置一,以像素点为单位
- // bx_5k.AreaWidth[1] = (char)( Width >> 8);
- bx_5k.AreaHeight[0] = (char)(Height & 0xff);
- bx_5k.AreaHeight[1] = (char)(Height >> 8);
- bx_5k.DynamicAreaLoc = 0x01; //设置动态区域为1
- bx_5k.Lines_sizes = 0; //行间距
- bx_5k.RunMode = 0x02; //动态区域运行模式,动态区数据循环显示,超过设定时间后数据仍未更新时不再显示*/
- bx_5k.Timeout[0] = 0xa0; //
- bx_5k.Timeout[1] = 0x00; //超时10s
- bx_5k.SingleLine = 0x02; //设置是否单行显示 :多行显示
- bx_5k.NewLine = 0x02; //设置是否自动换行:自动换行
- bx_5k.DisplayMode = 0x02; //设置显示方式:快速打出
- bx_5k.ExitMode = 0x00; //设置退出方式
- bx_5k.Speed = 0x02; //设置运行速度
- bx_5k.StayTime = keeptime; //设置停留时间 0x01为0.5s
- total = Area1_dis_format(bx_5k.dis_buff);
- bx_5k.Len[0] = (char)((total + 9 + 27) & 0xff); /*计算动态区域0数据长度*/
- bx_5k.Len[1] = (char)((total + 9 + 27) >> 8);
- bx_5k.AreaLen[0] = (char)((total + 27) & 0xff); /*计算动态区域0数据长度*/
- bx_5k.AreaLen[1] = (char)((total + 27) >> 8);
- bx_5k.DataLen[0] = (char)(total & 0xff); /*实际显示内容长度,实际占32位,只实现了16位*/
- bx_5k.DataLen[1] = (char)(total >> 8);
- rt_memcpy(Dis_Comm + add_len, bx_5k.Header, 12);
- add_len = 12;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Len, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Cmd_dis, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Reply_f, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Reserved0, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Areadealnum, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.AreaNum, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaLen, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.AreaType, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaX, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaY, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaWidth, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaHeight, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.DynamicAreaLoc, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Lines_sizes, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.RunMode, 1);
- add_len += 1; //动态区域运行模式
- rt_memcpy(Dis_Comm + add_len, bx_5k.Timeout, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Reserved1, 3);
- add_len += 3;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.SingleLine, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.NewLine, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.DisplayMode, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.ExitMode, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Speed, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.StayTime, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.DataLen, 4);
- add_len += 4;
- rt_memcpy(Dis_Comm + add_len, (uint8_t *)bx_5k.dis_buff, total);
- add_len += total;
- t = (bx_5k.Len[1] << 8) + bx_5k.Len[0];
- t = t + 14; //加Data_Field_1+数据长度2
- crc_data = CRC16_IBM(Dis_Comm, t); /*先计算出CRC值再来查询转义字符*/
- Dis_Comm[t] = crc_data >> 8;
- t = t + 1;
- Dis_Comm[t] = crc_data;
- t = t + 1;
- t = Escape_character(Dis_Comm, t); //字符转义处理
- Dis_Comm[t] = 0x5a;
- rt_pin_write(RS485_DOTLED_EN, PIN_HIGH); /*485输出使能*/
- rt_device_write(dotled, 0, bx_5k.Frame, 8);
- rt_device_write(dotled, 0, Dis_Comm, t + 1);
- char *led_blink_mode_1 = "50,50,"; //10Hz闪烁
- led_set_mode(DOTLED, 5, led_blink_mode_1);
- rt_pin_write(RS485_DOTLED_EN, PIN_LOW); /*485输入使能*/
- rt_thread_mdelay(1000);
- }
- }
- //显示清屏
- void DotLED_DisplayClear(void)
- {
- uint16_t add_len = 0; //整个数据总长度
- uint16_t total = 0; /* 记录当前数据长度 */
- char clr[] = {0x05, 0x00, 0xA3, 0x10, 0x01, 0x00, 0x00};
- uint16_t crc_data = 0;
- uint16_t i, j, t = 0;
- rt_memset(Dis_Comm, '\0', dis_buff_len + 300);
- rt_memcpy(Dis_Comm + add_len, bx_5k.Header, 12);
- add_len = 12;
- rt_memcpy(Dis_Comm + add_len, clr, 7);
- add_len += 7;
- t = add_len;
- crc_data = CRC16_IBM(Dis_Comm, t); /*先计算出CRC值再来查询转义字符*/
- Dis_Comm[t] = crc_data >> 8;
- t = t + 1;
- Dis_Comm[t] = crc_data;
- t = t + 1;
- t = Escape_character(Dis_Comm, t); //字符转义处理
- Dis_Comm[t] = 0x5a;
- rt_pin_write(RS485_DOTLED_EN, PIN_HIGH); /*485输出使能*/
- rt_device_write(dotled, 0, bx_5k.Frame, 8);
- rt_device_write(dotled, 0, (Dis_Comm), t + 1);
- char *led_blink_mode_1 = "50,50,"; //10Hz闪烁
- led_set_mode(DOTLED, 5, led_blink_mode_1);
- rt_pin_write(RS485_DOTLED_EN, PIN_LOW); /*485输入使能*/
- }
- //内容:区域1显示函数
- void DotLED_DisplayArea(uint8_t x, uint8_t y, uint8_t Width, uint8_t Height, uint8_t keeptime, uint8_t DynamicArea)
- {
- uint16_t add_len = 0; //整个数据总长度
- uint16_t total = 0; /* 记录当前数据长度 */
- uint16_t crc_data = 0;
- uint16_t i, j, t = 0;
- rt_uint32_t e;
- // if (rt_event_recv(&timed_events, timed_events_MAIN,
- // RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
- // 0, &e) == RT_EOK)
- if (1)
- {
- rt_memset(Dis_Comm, '\0', dis_buff_len + 300);
- rt_memset(bx_5k.dis_buff, '\0', dis_buff_len);
- bx_5k.AreaX[0] = (char)(x & 0xff);
- bx_5k.AreaX[1] = (char)((x >> 8) | 0x80); //最高位置一,以像素点为单位
- // bx_5k.AreaX[1] = (char)( x >> 8);
- bx_5k.AreaY[0] = (char)(y & 0xff);
- bx_5k.AreaY[1] = (char)(y >> 8);
- bx_5k.AreaWidth[0] = (char)(Width & 0xff);
- bx_5k.AreaWidth[1] = (char)((Width >> 8) | 0x80); //最高位置一,以像素点为单位
- // bx_5k.AreaWidth[1] = (char)( Width >> 8);
- bx_5k.AreaHeight[0] = (char)(Height & 0xff);
- bx_5k.AreaHeight[1] = (char)(Height >> 8);
- bx_5k.DynamicAreaLoc = DynamicArea; //设置动态区域为1
- bx_5k.Lines_sizes = 0; //行间距
- bx_5k.RunMode = 0x02; //动态区域运行模式,动态区数据循环显示,超过设定时间后数据仍未更新时不再显示*/
- bx_5k.Timeout[0] = 0xa0; //
- bx_5k.Timeout[1] = 0x00; //超时10s
- bx_5k.SingleLine = 0x02; //设置是否单行显示 :多行显示
- bx_5k.NewLine = 0x02; //设置是否自动换行:自动换行
- bx_5k.DisplayMode = 0x02; //设置显示方式:快速打出
- bx_5k.ExitMode = 0x00; //设置退出方式
- bx_5k.Speed = 0x02; //设置运行速度
- bx_5k.StayTime = keeptime; //设置停留时间 0x01为0.5s
- total = Area1_dis_format(bx_5k.dis_buff);
- bx_5k.Len[0] = (char)((total + 9 + 27) & 0xff); /*计算动态区域0数据长度*/
- bx_5k.Len[1] = (char)((total + 9 + 27) >> 8);
- bx_5k.AreaLen[0] = (char)((total + 27) & 0xff); /*计算动态区域0数据长度*/
- bx_5k.AreaLen[1] = (char)((total + 27) >> 8);
- bx_5k.DataLen[0] = (char)(total & 0xff); /*实际显示内容长度,实际占32位,只实现了16位*/
- bx_5k.DataLen[1] = (char)(total >> 8);
- rt_memcpy(Dis_Comm + add_len, bx_5k.Header, 12);
- add_len = 12;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Len, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Cmd_dis, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Reply_f, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Reserved0, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Areadealnum, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.AreaNum, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaLen, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.AreaType, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaX, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaY, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaWidth, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaHeight, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.DynamicAreaLoc, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Lines_sizes, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.RunMode, 1);
- add_len += 1; //动态区域运行模式
- rt_memcpy(Dis_Comm + add_len, bx_5k.Timeout, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Reserved1, 3);
- add_len += 3;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.SingleLine, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.NewLine, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.DisplayMode, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.ExitMode, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Speed, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.StayTime, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.DataLen, 4);
- add_len += 4;
- rt_memcpy(Dis_Comm + add_len, (uint8_t *)bx_5k.dis_buff, total);
- add_len += total;
- t = (bx_5k.Len[1] << 8) + bx_5k.Len[0];
- t = t + 14; //加Data_Field_1+数据长度2
- crc_data = CRC16_IBM(Dis_Comm, t); /*先计算出CRC值再来查询转义字符*/
- Dis_Comm[t] = crc_data >> 8;
- t = t + 1;
- Dis_Comm[t] = crc_data;
- t = t + 1;
- t = Escape_character(Dis_Comm, t); //字符转义处理
- Dis_Comm[t] = 0x5a;
- rt_pin_write(RS485_DOTLED_EN, PIN_HIGH); /*485输出使能*/
- rt_device_write(dotled, 0, bx_5k.Frame, 8);
- rt_device_write(dotled, 0, Dis_Comm, t + 1);
- char *led_blink_mode_1 = "50,50,"; //10Hz闪烁
- led_set_mode(DOTLED, 5, led_blink_mode_1);
- rt_pin_write(RS485_DOTLED_EN, PIN_LOW); /*485输入使能*/
- rt_thread_mdelay(1000);
- }
- }
- /**
- * @brief 仅刷新部分区域的数据
- *
- * @param x 显示区域
- * @param y
- * @param Width
- * @param Height
- * @param keeptime 保留时间
- * @param DynamicArea 动态区
- * @param start 起始要素
- * @param len 要素数量
- */
- void DotLED_DisplayArea_PART(uint8_t x, uint8_t y, uint8_t Width, uint8_t Height, uint8_t keeptime, uint8_t DynamicArea, uint8_t start, uint8_t len)
- {
- uint16_t add_len = 0; //整个数据总长度
- uint16_t total = 0; /* 记录当前数据长度 */
- uint16_t crc_data = 0;
- uint16_t i, j, t = 0;
- rt_uint32_t e;
- rt_memset(Dis_Comm, '\0', dis_buff_len + 300);
- rt_memset(bx_5k.dis_buff, '\0', dis_buff_len);
- bx_5k.AreaX[0] = (char)(x & 0xff);
- bx_5k.AreaX[1] = (char)((x >> 8) | 0x80); //最高位置一,以像素点为单位
- // bx_5k.AreaX[1] = (char)( x >> 8);
- bx_5k.AreaY[0] = (char)(y & 0xff);
- bx_5k.AreaY[1] = (char)(y >> 8);
- bx_5k.AreaWidth[0] = (char)(Width & 0xff);
- bx_5k.AreaWidth[1] = (char)((Width >> 8) | 0x80); //最高位置一,以像素点为单位
- // bx_5k.AreaWidth[1] = (char)( Width >> 8);
- bx_5k.AreaHeight[0] = (char)(Height & 0xff);
- bx_5k.AreaHeight[1] = (char)(Height >> 8);
- bx_5k.DynamicAreaLoc = DynamicArea; //设置动态区域为1
- bx_5k.Lines_sizes = 0; //行间距
- bx_5k.RunMode = 0x02; //动态区域运行模式,动态区数据循环显示,超过设定时间后数据仍未更新时不再显示*/
- bx_5k.Timeout[0] = 0xa0; //
- bx_5k.Timeout[1] = 0x00; //超时10s
- bx_5k.SingleLine = 0x02; //设置是否单行显示 :多行显示
- bx_5k.NewLine = 0x02; //设置是否自动换行:自动换行
- bx_5k.DisplayMode = 0x02; //设置显示方式:快速打出
- bx_5k.ExitMode = 0x00; //设置退出方式
- bx_5k.Speed = 0x02; //设置运行速度
- bx_5k.StayTime = keeptime; //设置停留时间 0x01为0.5s
- total = Area1_dis_format_PART(bx_5k.dis_buff, start, len);
- bx_5k.Len[0] = (char)((total + 9 + 27) & 0xff); /*计算动态区域0数据长度*/
- bx_5k.Len[1] = (char)((total + 9 + 27) >> 8);
- bx_5k.AreaLen[0] = (char)((total + 27) & 0xff); /*计算动态区域0数据长度*/
- bx_5k.AreaLen[1] = (char)((total + 27) >> 8);
- bx_5k.DataLen[0] = (char)(total & 0xff); /*实际显示内容长度,实际占32位,只实现了16位*/
- bx_5k.DataLen[1] = (char)(total >> 8);
- rt_memcpy(Dis_Comm + add_len, bx_5k.Header, 12);
- add_len = 12;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Len, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Cmd_dis, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Reply_f, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Reserved0, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Areadealnum, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.AreaNum, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaLen, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.AreaType, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaX, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaY, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaWidth, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.AreaHeight, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.DynamicAreaLoc, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Lines_sizes, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.RunMode, 1);
- add_len += 1; //动态区域运行模式
- rt_memcpy(Dis_Comm + add_len, bx_5k.Timeout, 2);
- add_len += 2;
- rt_memcpy(Dis_Comm + add_len, bx_5k.Reserved1, 3);
- add_len += 3;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.SingleLine, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.NewLine, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.DisplayMode, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.ExitMode, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.Speed, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, &bx_5k.StayTime, 1);
- add_len += 1;
- rt_memcpy(Dis_Comm + add_len, bx_5k.DataLen, 4);
- add_len += 4;
- rt_memcpy(Dis_Comm + add_len, (uint8_t *)bx_5k.dis_buff, total);
- add_len += total;
- t = (bx_5k.Len[1] << 8) + bx_5k.Len[0];
- t = t + 14; //加Data_Field_1+数据长度2
- crc_data = CRC16_IBM(Dis_Comm, t); /*先计算出CRC值再来查询转义字符*/
- Dis_Comm[t] = crc_data >> 8;
- t = t + 1;
- Dis_Comm[t] = crc_data;
- t = t + 1;
- t = Escape_character(Dis_Comm, t); //字符转义处理
- Dis_Comm[t] = 0x5a;
- rt_pin_write(RS485_DOTLED_EN, PIN_HIGH); /*485输出使能*/
- rt_device_write(dotled, 0, bx_5k.Frame, 8);
- rt_device_write(dotled, 0, Dis_Comm, t + 1);
- char *led_blink_mode_1 = "50,50,"; //10Hz闪烁
- led_set_mode(DOTLED, 5, led_blink_mode_1);
- rt_pin_write(RS485_DOTLED_EN, PIN_LOW); /*485输入使能*/
- rt_thread_mdelay(1000);
- }
- //获取字符串长度
- uint8_t sizeof_s(char *str)
- {
- uint8_t len = 0;
- while (1)
- {
- if (*str == '\0')
- break; //拷贝完成了.
- len++;
- str++;
- }
- return len;
- }
- //把str1的内容copy到str2
- //*str1:字符串1指针
- //*str2:字符串2指针
- void strcopy(char *str1, char *str2)
- {
- while (1)
- {
- *str2 = *str1; //拷贝
- if (*str1 == '\0')
- break; //拷贝完成了.
- str1++;
- str2++;
- }
- }
- //转义字符,输入:待转义字符指针,长度
- uint16_t Escape_character(uint8_t *buff, uint16_t len)
- {
- uint16_t i, j, t;
- uint8_t temp;
- t = len;
- for (i = 0; i < t; i++)
- {
- /*5A转义*/
- if (buff[i] == 0x5A)
- {
- buff[i] = 0x5B;
- /* 保存最右边的元素 */
- temp = buff[t];
- /* 从检测到需要转移的字符开始往右移动一个位值 */
- for (j = t; j > i; j--)
- {
- buff[j] = buff[j - 1];
- }
- /* 数组加一位把最右边的元素补到最右边 */
- t = t + 1;
- buff[t] = temp;
- /* 0X5A后面跟0x02 */
- buff[i + 1] = 0x02;
- }
- /*A6转义*/
- if (buff[i] == 0xA6)
- {
- if (buff[i + 1] != 0x02) /*判断不是转义后的数据*/
- {
- buff[i] = 0xA6;
- /* 保存最右边的元素 */
- temp = buff[t];
- /* 从检测到需要转移的字符开始往右移动一个位值 */
- for (j = t; j > i; j--)
- {
- buff[j] = buff[j - 1];
- }
- /* 数组加一位把最右边的元素补到最右边 */
- t = t + 1;
- buff[t] = temp;
- /* 0X5A后面跟0x01 */
- buff[i + 1] = 0x01;
- }
- }
- /*A5转义*/
- if (buff[i] == 0xA5)
- {
- buff[i] = 0xA6;
- /* 保存最右边的元素 */
- temp = buff[t];
- /* 从检测到需要转移的字符开始往右移动一个位值 */
- for (j = t; j > i; j--)
- {
- buff[j] = buff[j - 1];
- }
- /* 数组加一位把最右边的元素补到最右边 */
- t = t + 1;
- buff[t] = temp;
- /* 0X5A后面跟0x02 */
- buff[i + 1] = 0x02;
- }
- /*5B转义*/
- if (buff[i] == 0x5B)
- {
- if (buff[i + 1] != 0x02) /*判断不是转义后的数据*/
- {
- buff[i] = 0x5B;
- /* 保存最右边的元素 */
- temp = buff[t];
- /* 从检测到需要转移的字符开始往右移动一个位值 */
- for (j = t; j > i; j--)
- {
- buff[j] = buff[j - 1];
- }
- /* 数组加一位把最右边的元素补到最右边 */
- t = t + 1;
- buff[t] = temp;
- /* 0X5A后面跟0x01 */
- buff[i + 1] = 0x01;
- }
- }
- }
- return t;
- }
- /*******************************************************************************************
- 函数名称: String2BcdTime
- 描 述 : 把文件名字符串转为BCD码时间
- 输入参数: 将要转换的保存文件名字符串的数组 ,以及转换之后将要保存bcd时间的数组
- 输出参数: 无
- 返 回 : 无
- ********************************************************************************************/
- void Time2BCD(char *bcd_buf)
- {
- /* 文件名格式为: “2018-09-15 12:25:26 1” */
- /* BCD 时间格式为 “18200915122526” */
- char time_buf[50] = "\0";
- sprintf(time_buf, "%d-%02d-%02d %02d:%02d:%02d %d", year, month,
- day, hour, min, sec, week);
- bcd_buf[0] = (unsigned char)((time_buf[2] - '0') << 4) + (time_buf[3] - '0');
- bcd_buf[1] = (unsigned char)((time_buf[0] - '0') << 4) + (time_buf[1] - '0');
- bcd_buf[2] = (unsigned char)((time_buf[5] - '0') << 4) + (time_buf[6] - '0');
- bcd_buf[3] = (unsigned char)((time_buf[8] - '0') << 4) + (time_buf[9] - '0');
- bcd_buf[4] = (unsigned char)((time_buf[11] - '0') << 4) + (time_buf[12] - '0');
- bcd_buf[5] = (unsigned char)((time_buf[14] - '0') << 4) + (time_buf[15] - '0');
- bcd_buf[6] = (unsigned char)((time_buf[17] - '0') << 4) + (time_buf[18] - '0');
- bcd_buf[7] = (unsigned char)(time_buf[20] - '0');
- }
- /*控制led开关标志位*/
- uint8_t led_onoff_flag = 0;
- #ifdef DOTLED_ONOFF
- /* 定时事件控制块 */
- static struct rt_event onoff_events;
- static rt_timer_t dotled_onoff_task;
- char on_off[] = {0x06, 0x00, 0xA3, 0x00, 0x02, 0x01, 0x00, 0x01};
- uint8_t onoff_buff[21] = {0};
- static rt_uint32_t onoff_cnt = 0;
- //屏幕开关机
- void DotLED_TURN_ON_OFF(uint8_t OnOffFlag)
- {
- uint16_t add_len = 0; //整个数据总长度
- uint16_t total = 0; /* 记录当前数据长度 */
- uint16_t crc_data = 0;
- uint16_t i, j, t = 0;
- rt_memset(onoff_buff, '\0', sizeof(onoff_buff));
- if (OnOffFlag == 0)
- {
- on_off[7] = 0x02;
- if (dotled_onoff_task != RT_NULL)
- {
- rt_timer_stop(dotled_onoff_task);
- }
- led_onoff_flag = 0; //切换标志位
- }
- else if (OnOffFlag == 1) //开启屏幕后启动定时器
- {
- on_off[7] = 0x01; /* 启动定时器 1 */
- if (dotled_onoff_task != RT_NULL)
- {
- rt_timer_start(dotled_onoff_task);
- }
- led_onoff_flag = 1; //切换标志位
- }
- else
- return;
- rt_memcpy(onoff_buff + add_len, header, 12);
- add_len = 12;
- rt_memcpy(onoff_buff + add_len, on_off, 8);
- add_len += 8;
- t = add_len;
- crc_data = CRC16_IBM(onoff_buff, t); /*先计算出CRC值再来查询转义字符*/
- t = Escape_character(onoff_buff, t); //字符转义处理
- onoff_buff[t] = crc_data >> 8;
- t = t + 1;
- onoff_buff[t] = crc_data;
- t = t + 1;
- onoff_buff[t] = 0x5a;
- rt_pin_write(RS485_DOTLED_EN, PIN_HIGH); /*485输出使能*/
- rt_device_write(dotled, 0, bx_5k.Frame, 8);
- rt_device_write(dotled, 0, onoff_buff, t + 1);
- char *led_blink_mode_1 = "50,50,"; //10Hz闪烁
- led_set_mode(DOTLED, 5, led_blink_mode_1);
- rt_pin_write(RS485_DOTLED_EN, PIN_LOW); /*485输入使能*/
- rt_thread_mdelay(1000);
- }
- void test_on(void)
- {
- DotLED_TURN_ON_OFF(1);
- }
- void test_off(void)
- {
- DotLED_TURN_ON_OFF(0);
- }
- /* 导出到 msh 命令列表中 */
- MSH_CMD_EXPORT(test_on, led test on);
- MSH_CMD_EXPORT(test_off, led test off);
- /* 关闭超时定时器超时函数 */
- static void onoff_timed(void *parameter)
- {
- onoff_cnt++;
- if ((onoff_cnt % 3600 == 0) && (onoff_cnt > 0)) //1小时后超时关闭
- {
- rt_event_send(&onoff_events, timed_events_onoff); //定时时间到,发送事件
- onoff_cnt = 0;
- }
- }
- void led_timeout_off(void)
- {
- rt_uint32_t e;
- if (rt_event_recv(&onoff_events, timed_events_onoff,
- RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
- 0, &e) == RT_EOK)
- {
- DotLED_TURN_ON_OFF(0);
- }
- }
- #endif
- static void dotled_thread_entry(void *parameter)
- {
- /*延时等待开机年月日时间全部标量赋值*/
- rt_thread_mdelay(20000);
- rt_pin_mode(RS485_DOTLED_EN, PIN_MODE_OUTPUT);
- DotLED_TIMESET(1); //开机对rtc时间
- rt_thread_mdelay(1000);
- uint8_t Screen_Cnt = 0;
- uint8_t len = 0;
- uint8_t All_elem = 0;
- while (qxz.Param.Dotled_Option >= 1 && qxz.Param.Dotled_Option <= 3)
- {
- All_elem = qxz.Param.Num_sensors;
- for (uint8_t c = 0; c < qxz.Param.Num_sensors; c++)
- {
- if (strstr(sensor[c].eName, "ALINE") != NULL)
- {
- All_elem++;
- }
- if (strstr(sensor[c].eName, "SLINE") != NULL)
- {
- All_elem--;
- }
- }
- //rt_kprintf("All_elem = %d > %d \n" , qxz.Param.Num_sensors,All_elem);
- screen_line = qxz.Param.dotled_p0.Height / qxz.Param.dotled_p0.front; //每页可以显示的条数
- main_keeptime = qxz.Param.dotled_p0.keep_time; //每页停留时间
- Screen_Cnt = All_elem / screen_line; //一共需要翻几页
- if (Screen_Cnt == 0)
- {
- Screen_Cnt = 1;
- }
- if (Screen_Cnt * screen_line < All_elem)
- {
- Screen_Cnt += 1;
- }
- //rt_kprintf("Ready To Display \n");
- //rt_kprintf("There are %d pages, %d lines per page, and a total of %d elem_space > %d s\n\n", Screen_Cnt, screen_line, All_elem, main_keeptime);
- for (uint8_t b = 0; b < qxz.Param.Num_sensors; b += len)
- {
- //rt_kprintf("if %d == %d \n" , (b + screen_line) , All_elem);
- if ((b + screen_line) >= All_elem && (Screen_Cnt * screen_line) > All_elem)
- {
- len = (Screen_Cnt * screen_line) % All_elem;
- len = screen_line - len;
- //rt_kprintf(" len = %d\n" ,len);
- }
- else
- {
- len = screen_line;
- }
- for (uint8_t d = b; d < b + len; d++)
- {
- //rt_kprintf("for (uint8_t d = b > %s %d\n" ,sensor[d + 0].eName,len);
- if (d > b && strstr(sensor[d - 1].eName, "ALINE") != NULL && len > 0)
- {
- len--;
- }
- if (strstr(sensor[d + 1].eName, "SLINE") != NULL && len > 0)
- {
- len++;
- //rt_kprintf("sensor[d - 1].eName ++ %s\n" , sensor[d - 1].eName);
- }
- }
- //rt_kprintf("DotLED_DisplayArea_PART B = %d len = %d\n\n\n" ,b,len);
- DotLED_DisplayArea_PART(qxz.Param.dotled_p0.Start_x, qxz.Param.dotled_p0.Start_y,
- qxz.Param.dotled_p0.Width, qxz.Param.dotled_p0.Height,
- (qxz.Param.dotled_p0.keep_time * 2), 0,
- b, len);
- if (qxz.Param.dotled_p0.keep_time > 0)
- {
- rt_thread_mdelay(qxz.Param.dotled_p0.keep_time * 850);
- }
- }
- DotLED_TIMESET(0); //对rtc时间
- rt_thread_mdelay(500);
- }
- }
- // led点阵屏控制线程
- static int dotled_thread(int argc, char *argv[])
- {
- rt_err_t ret = RT_EOK;
- char uart_name[RT_NAME_MAX];
- struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 初始化配置参数 */
- uint8_t dotled_size;
- #ifndef dot_mod
- if (qxz.Param.Dotled_Option >= 1 && qxz.Param.Dotled_Option <= 3) //led点阵屏使能
- {
- #endif
- /*按照屏幕型号赋值整屏显示数据的行数*/
- // ef_get_env_blob("Dotled_Size", &dotled_size, sizeof(dotled_size), RT_NULL);
- // if (dotled_size == 1)screen_line = 3;
- // else if (dotled_size == 2)screen_line = 6;
- // else if (dotled_size == 3)screen_line = 5;
- controller_type(qxz.Param.Dotled_Option); //计算控制卡型号
- Dis_Comm = (unsigned char *)rt_malloc(dis_buff_len + 300);
- if (Dis_Comm == RT_NULL)
- {
- log_i("Dis_Comm out of memory");
- ret = RT_ERROR;
- goto __exit;
- }
- bx_5k.dis_buff = (unsigned char *)rt_malloc(dis_buff_len);
- if (Dis_Comm == RT_NULL)
- {
- log_i("bx_5k.dis_buff out of memory");
- ret = RT_ERROR;
- goto __exit;
- }
- /* 初始化事件对象 */
- ret = rt_event_init(&timed_events, "event", RT_IPC_FLAG_FIFO);
- if (ret != RT_EOK)
- {
- log_i("init event failed.\n");
- return ret;
- }
- /* 创建定时器 1 周期定时器 */
- dotled_timed_task = rt_timer_create("dotled_timer", dotled_timed,
- (void *)1, 1000,
- RT_TIMER_FLAG_PERIODIC);
- /* 启动定时器 1 */
- if (dotled_timed_task != RT_NULL)
- rt_timer_start(dotled_timed_task);
- #ifdef DOTLED_ONOFF
- /* 初始化事件对象 */
- ret = rt_event_init(&onoff_events, "event_on", RT_IPC_FLAG_FIFO);
- if (ret != RT_EOK)
- {
- log_i("init event failed.\n");
- return ret;
- }
- /* 创建定时器 用于开关屏超时控制 */
- dotled_onoff_task = rt_timer_create("dotled_onoff", onoff_timed,
- (void *)1, 1000,
- RT_TIMER_FLAG_PERIODIC);
- /* 启动定时器 1 */
- if (dotled_onoff_task != RT_NULL)
- rt_timer_start(dotled_onoff_task);
- #endif
- /* 查找串口设备 */
- rt_strncpy(uart_name, DOTLED_UART_NAME, RT_NAME_MAX);
- dotled = rt_device_find(uart_name);
- if (!dotled)
- {
- rt_kprintf("find %s failed!\n", uart_name);
- return RT_ERROR;
- }
- /* step2:修改串口配置参数 */
- config.baud_rate = BAUD_RATE_57600; //修改波特率为57600
- config.data_bits = DATA_BITS_8; //数据位 8
- config.stop_bits = STOP_BITS_1; //停止位 1
- config.bufsz = 1024; //修改缓冲区 buff size 为 128
- config.parity = PARITY_NONE; //无奇偶校验位
- /* step3:控制串口设备。通过控制接口传入命令控制字,与控制参数 */
- rt_device_control(dotled, RT_DEVICE_CTRL_CONFIG, &config);
- rt_device_open(dotled, RT_DEVICE_FLAG_INT_RX);
- /* 创建 serial 线程 */
- rt_thread_t thread1 = rt_thread_create("dotled", dotled_thread_entry, RT_NULL, 2048, 17, 10);
- /* 创建成功则启动线程 */
- if (thread1 != RT_NULL)
- {
- rt_thread_startup(thread1);
- }
- else
- {
- ret = RT_ERROR;
- }
- #ifndef dot_mod
- }
- else
- ret = RT_EEMPTY;
- #endif
- __exit:
- if (ret == RT_EOK)
- {
- return ret;
- }
- else
- {
- rt_free(Dis_Comm);
- Dis_Comm = RT_NULL;
- rt_free(bx_5k.dis_buff);
- bx_5k.dis_buff = RT_NULL;
- }
- return ret;
- }
- INIT_APP_EXPORT(dotled_thread);
|