/* * bsp_com_helper.c * * Created on: Oct 9, 2024 * Author: akeguo */ #include "bsp_com_helper.h" #include #include "DLT/DLTuc.h" #include "BHBF_ROBOT.h" void Dispatch_t(DispacherController *uartHandler) { //2ms一次 if (uartHandler->Dispacher_Enable == 1) { if (uartHandler->DispacherNumber > 0) //列表中有数据 { uartHandler->Dispacher_Counter++; if (uartHandler->Dispacher_Counter >= uartHandler->DispacherCallTime / 2 / (uartHandler->DispacherNumber)) //多长时间运行一次 { uartHandler->Dispacher_Counter = 0; if (uartHandler->pHead != NULL && uartHandler->pHead->pNext != NULL) { uartHandler->pHead->dispache(); uartHandler->pHead = uartHandler->pHead->pNext; } else { } } } } } void Dispatcher_List_Add_t(DispacherController *uartHandler, void (*dispache)(void)) //调度器添加列表 { Dispatcher *pTmp = NULL; //临时指针2 if (uartHandler->pHead == NULL && uartHandler->pTail == NULL) //头尾部都为空 { uartHandler->pHead = uartHandler->pTail = (Dispatcher*) malloc( sizeof(Dispatcher)); uartHandler->pHead->dispache = dispache; uartHandler->pTail->dispache = dispache; uartHandler->pHead->pNext = uartHandler->pTail; uartHandler->pTail->pNext = uartHandler->pHead; uartHandler->DispacherNumber++; } else { //临时指针2用于逐个申请内存 pTmp = (Dispatcher*) malloc(sizeof(Dispatcher)); pTmp->dispache = dispache; pTmp->pNext = uartHandler->pHead; //set the new dispatcher .next to the header, thus make it a circle //临时指针1的next指向刚分配内存的临时指针2 uartHandler->pTail->pNext = pTmp; uartHandler->pTail = pTmp; //set pTail the last node of this ring uartHandler->DispacherNumber++; } } void ComHardWare_List_Add_t(HardWareController *uartHandler, char *name, char value,uint32_t bitFlag) { ComHardWare *pTmp = NULL; //临时指针2 if (uartHandler->pComHWHead == NULL && uartHandler->pComHWTail == NULL) //头尾部都为空 { uartHandler->pComHWHead = uartHandler->pComHWTail = (ComHardWare*) malloc(sizeof(ComHardWare)); memset(uartHandler->pComHWHead->Name, '\0', sizeof(uartHandler->pComHWHead->Name)); memcpy(uartHandler->pComHWHead->Name, name, strlen(name)); uartHandler->pComHWHead->IsOnline = value; uartHandler->pComHWHead->BitFlag = bitFlag; uartHandler->pComHWHead->pNext = NULL; } else { pTmp = (ComHardWare*) malloc(sizeof(ComHardWare)); memset(pTmp->Name, '\0', sizeof(pTmp->Name)); memcpy(pTmp->Name, name, strlen(name)); pTmp->BitFlag = bitFlag; pTmp->IsOnline = value; pTmp->pNext = NULL; //set the new dispatcher .next to the header, thus make it a circle uartHandler->pComHWTail->pNext = pTmp; uartHandler->pComHWTail = pTmp; } } char str1[50] = "\0"; void PCOMHardWare_Check_t(HardWareController *uartHandler) { uartHandler->HardWare_Check_Counter++; // if (uartHandler->HardWare_Check_Counter*2 // >= uartHandler->DispacherCallTime * 6) //make sure every if (uartHandler->HardWare_Check_Counter * 2 >= uartHandler->DispacherCallTime) //make sure every { ComHardWare *ptr = uartHandler->pComHWHead; if (!ptr) { uartHandler->HardWare_Check_Counter = 0; //printf("链表为空\n"); return; } char IsAbnornalStatus = 0; //check invalid state while (ptr != NULL) { if (ptr->IsOnline != 1) { memset(str1, '\0', 50); memcpy(str1, ptr->Name, strlen(ptr->Name)); LOGFF(DL_ERROR, "connecting Error %s", ptr->Name); SET_BIT_1(SystemErrorCode,ptr->BitFlag); //*SystemErrorCode=*SystemErrorCode|(1<BitFlag); IsAbnornalStatus = 1; }else { //*SystemErrorCode=*SystemErrorCode|(1<BitFlag); SET_BIT_0(SystemErrorCode,ptr->BitFlag); } ptr = ptr->pNext; } //set invalid state ptr = uartHandler->pComHWHead; while (ptr != NULL) { ptr->IsOnline = 0; ptr = ptr->pNext; } uartHandler->HardWare_Check_Counter = 0;//perform the check of connection } } int Set_PCOMHardWare_t(HardWareController *uartHandler, char *name, char value) { ComHardWare *ptr = uartHandler->pComHWHead; char finddata = 0; if (ptr == NULL) { return 0; } while (ptr != NULL) { if (strcmp(ptr->Name, name) == 0) { ptr->IsOnline = value; finddata = 1; return finddata; } else { ptr = ptr->pNext; } } return finddata; }