// ========================================================================= // 函数功能:删除整个菜单分支包括祖先节点 // 输入参数:pMenuitem,待删除的菜单分支祖先节点 // 输出参数: // 返回值 :true成功 false失败 // 说明 :删除当前菜单项的所有后代菜单以及当前菜单(逻辑上和物理上),通过循环删除 // 端节点来实现 // ========================================================================= bool_t DelMenuBranchCompletely(struct menu_item * pMenuitem) { bool_t result=false; struct menu_item *temp_menuitem=pMenuitem; if((struct tagRscNode *)pMenuitem==pg_menuitem_root)//this is an menuitem root node { printf("Invalid para---DelMenuBranchCompletely\n"); return result; } while((temp_menuitem=SearchSubTernalMenuitem(pMenuitem))!=NULL) { printf("begin to delete the menuitem=%s\n",temp_menuitem->node.name); Rsc_DelNode((struct tagRscNode *)temp_menuitem); Mb_Free(pg_menuitem_pool, temp_menuitem); } if(Rsc_GetParent((struct tagRscNode *)pMenuitem)==pg_menuitem_root) { menuitem_tree_count--; } printf("begin to delete the menuitem=%s\n",pMenuitem->node.name); Rsc_DelNode((struct tagRscNode *)(&(pMenuitem->node))); Mb_Free(pg_menuitem_pool, pMenuitem); result=true; return result; }
// ============================================================================= // 功能:新增SPI总线结点到SPI总线类型结点,并初始化tagSPI_CB控制块结构体 // 参数:NewSPIParam,新增总线参数,参数说明详细请参照tagSPI_Param结构体 // 返回:返回建立的资源结点指针,失败时返回NULL // ============================================================================= struct tagSPI_CB *SPI_BusAdd(struct tagSPI_Param *NewSPIParam) { struct tagSPI_CB *NewSPI; if(NULL == NewSPIParam) goto exit_from_param; //避免重复建立同名的SPI总线 if(NULL != Rsc_SearchSon(&s_SPIBusType,NewSPIParam->BusName)) goto exit_from_readd; NewSPI = (struct tagSPI_CB *)M_Malloc(sizeof(struct tagSPI_CB),0); if(NewSPI == NULL) goto exit_from_malloc; //将总线结点挂接到总线类型结点的子结点 Rsc_AddSon(&s_SPIBusType,&NewSPI->SPI_BusNode, sizeof(struct tagSPI_CB),RSC_SPIBUS,NewSPIParam->BusName); if(&NewSPI->SPI_BusNode == NULL) goto exit_from_add_node; //创建总线信号量和阻塞信号量 NewSPI->SPI_BusSemp= Lock_SempCreate(1,1,CN_SEMP_BLOCK_FIFO,"spi bus semp"); if(NewSPI->SPI_BusSemp== NULL) goto exit_from_spi_bus_semp; NewSPI->SPI_BlockSemp = Lock_SempCreate(1,0,CN_SEMP_BLOCK_FIFO,"spi block semp"); if(NewSPI->SPI_BlockSemp== NULL) goto exit_from_spi_buf_semp; //tagSPI_CB控制块初始化 NewSPI->SpecificFlag = NewSPIParam->SpecificFlag; NewSPI->pTransferTxRx = NewSPIParam->pTransferTxRx; NewSPI->pCsActive = NewSPIParam->pCsActive; NewSPI->pCsInActive = NewSPIParam->pCsInActive; NewSPI->pBusCtrl = NewSPIParam->pBusCtrl; NewSPI->pTransferPoll = NewSPIParam->pTransferPoll; //缓冲区初始化 NewSPI->SPI_Buf.pBuf = NewSPIParam->SPIBuf; NewSPI->SPI_Buf.MaxLen = NewSPIParam->SPIBufLen; NewSPI->SPI_Buf.Offset = 0; printk("%s Added Succeeded!\r\n",NewSPIParam->BusName); return NewSPI; exit_from_spi_buf_semp: Lock_SempDelete(NewSPI->SPI_BusSemp); exit_from_spi_bus_semp: Rsc_DelNode(&NewSPI->SPI_BusNode); exit_from_add_node: free(NewSPI); exit_from_malloc: exit_from_readd: exit_from_param: return NULL; }
// ============================================================================= // 功能:删除在SPI总线类型上的SPI结点,若被删除的总线上有器件结点,则删除会不成功 // 参数:DelSPI,删除SPI控制块指针 // 返回:true,删除成功;false,删除失败 // ============================================================================= bool_t SPI_BusDelete_s(struct tagSPI_CB *DelSPI) { bool_t result; if(NULL == DelSPI) return false; if(NULL == Rsc_DelNode(&DelSPI->SPI_BusNode)) { result = false; } else { result = true; } return result; }
// ============================================================================= // 功能:删除DjyBus总线根结点上的一个总线类型结点,该类型结点不能有子结点 // 参数:DelBusType,待删除的总线类型结点 // 返回:TRUE,删除成功;false,删除失败 // ============================================================================= bool_t DjyBus_BusTypeDelete_s(struct tagRscNode * DelBusType) { bool_t result; if(DelBusType == NULL) return false; if(NULL == Rsc_DelNode(DelBusType)) { result = false; } else { result = true; } return result; }
// ============================================================================= // 功能:删除SPI总线上的器件,从总线子结点中删除 // 参数:DelDev,删除的器件指针 // 返回:true,删除成功;false,删除失败 // ============================================================================= bool_t SPI_DevDelete_s(struct tagSPI_Device *DelDev) { bool_t result; if(NULL == DelDev) return false; if(NULL == Rsc_DelNode(&DelDev->DevNode)) { result = false; } else { result = true; } return result; }
//----卸载输入设备------------------------------------------------------------- //功能: 把输入设备从资源接点删除,从"input device"资源的子资源中,找到 // "device_name"资源接点,删除之,并把内存释放到pg_stdin_device_pool // 内存池中 //参数: device_name,目标设备的资源名 //返回: true = 成功删除,0=失败。 //----------------------------------------------------------------------------- bool_t Stddev_UnInstallDevice(char *device_name) { struct tagRscNode *temp; struct tagStdinDeviceRsc *djy_stdin; djy_stdin = (struct tagStdinDeviceRsc *)Rsc_SearchSon( &s_ptStdinDeviceRscTree->stdin_device_node,device_name); if(djy_stdin == NULL) return false; temp = &djy_stdin->stdin_device_node; if(Rsc_DelNode(temp) != NULL) { Mb_Free(g_ptStdinDevicePool,djy_stdin); return true; } else return false; }
// ============================================================================= // 函数功能:TPL_Init // 传输层资源树根节点初始化 // 输入参数:暂时无意义 // 输出参数: // 返回值 :true成功 false失败 // 说明 :注意,该初始化函数应该在所有的传输层协议初始化之前执行,否则添加的协议无效 // ============================================================================= bool_t TPL_Init(ptu32_t para) { bool_t result; static struct tagRscNode treenode; result =false; //创建资源树 pgNetRscNodeTree = Rsc_AddTree(&treenode,sizeof(struct tagRscNode), RSC_RSCNODE,NULL); if (NULL != pgNetRscNodeTree) { //创建资源树互斥锁 pgNetRscNodeSync = Lock_MutexCreate(NULL); if (NULL == pgNetRscNodeSync) { Rsc_DelNode(pgNetRscNodeTree); pgNetRscNodeTree = NULL; } else { result = true; } } return result; }
bool_t install_vncserver_mirrordisplay(rfbScreenInfoPtr rfbserver) { bool_t ret=false; struct tagDisplayRsc *base_display; struct tagGkWinRsc *desktop; struct tagDisplayRsc *mirror_display;//我们的镜像显示器 if(NULL==rfbserver) { return ret; } //通过桌面找到显示器,这种方法有点out ---TODO desktop = GK_ApiGetDesktop("sim_display"); if(NULL==desktop)//找不到桌面。 { return ret; } base_display=desktop->disp; if(NULL==base_display)//找不到主显示器 { return ret; } if((base_display->pixel_format>>8)<8)//暂时不支持8位像素格式 { return ret; } vncclip_pool = Mb_CreatePool((void*)s_vncclip_rsc, cn_limit_vncclip, sizeof(struct tagClipRect), 20,100, "vncclip_pool"); if(NULL == vncclip_pool) { debug_printf("#fatalerror--create the vncclip_pool failed!\n"); return ret; } mirror_display=M_MallocLc(sizeof(struct tagDisplayRsc),0); if(NULL==mirror_display) { debug_printf("#fatalerror--malloc mirror display mem failed!\n"); Mb_DeletePool(vncclip_pool); return ret; } memset(mirror_display,0,sizeof(struct tagDisplayRsc)); //初始化镜像显示器的一些必备属性,跟主显示器保持一致--TODO, mirror_display->pixel_format = base_display->pixel_format; mirror_display->width = base_display->width; if(cn_vnc_keyboard_visual_enable) { mirror_display->height = base_display->height + cn_vnc_keyboard_height; } else { mirror_display->height = base_display->height; } mirror_display->frame_buffer = NULL; mirror_display->draw.bm_to_screen=vnc_bm_to_screen; ret= GK_InstallDisplayMirror(base_display,mirror_display,"vnc_server_disp"); if(ret)//安装成功 { //区域设置 rfbserver->width=mirror_display->width; rfbserver->height=mirror_display->height; rfbserver->rfbServerFormat.bitsPerPixel=(mirror_display->pixel_format>>8); rfbserver->frameBuffer=M_MallocLc(rfbserver->width*\ (rfbserver->height)*(rfbserver->rfbServerFormat.bitsPerPixel/8),0); if(NULL==rfbserver->frameBuffer) { Rsc_DelNode((struct tagRscNode *)mirror_display); free(mirror_display); Mb_DeletePool(vncclip_pool); debug_printf("#fatalerror--malloc rfbserver frame buf failed!\n"); return ret; } //镜像显示器和其基础显示器公用一个buf。 //初始化一些rfbserver的参数 debug_printf("fram buf = %08x %d bytes\n",rfbserver->frameBuffer,\ rfbserver->width*(rfbserver->height)*(rfbserver->rfbServerFormat.bitsPerPixel/8)); memset(rfbserver->frameBuffer,0,rfbserver->width*(rfbserver->height)*(rfbserver->rfbServerFormat.bitsPerPixel/8)); rfbserver->clip_head=NULL; //像素格式 // rfbserver->rfbServerFormat.bitsPerPixel=rfbserver->bitsPerPixel; //感觉rfbScreen对于色彩的设置有点冗余,可以考虑只用format就好了,后续修正--TODO rfbserver->rfbServerFormat.bigEndian=false; rfbserver->rfbServerFormat.trueColour=true; rfbserver->paddedWidthInBytes=(rfbserver->rfbServerFormat.bitsPerPixel/8)*rfbserver->width; switch(rfbserver->rfbServerFormat.bitsPerPixel)//目前就列举这几种吧,后续的再行补充 { case 8://332格式 debug_printf("the server vmirror_display used 332 format!\n"); rfbserver->rfbServerFormat.redShift=5; rfbserver->rfbServerFormat.greenShift=2; rfbserver->rfbServerFormat.blueShift=0; rfbserver->rfbServerFormat.redMax=((1<<3)-1); rfbserver->rfbServerFormat.greenMax=((1<<3)-1); rfbserver->rfbServerFormat.blueMax=((1<<2)-1); rfbserver->rfbServerFormat.depth=8; break; case 16://565格式 debug_printf("the server vmirror_display used 565 format!\n"); rfbserver->rfbServerFormat.redShift=11; rfbserver->rfbServerFormat.greenShift=5; rfbserver->rfbServerFormat.blueShift=0; rfbserver->rfbServerFormat.redMax=((1<<5)-1); rfbserver->rfbServerFormat.greenMax=((1<<6)-1); rfbserver->rfbServerFormat.blueMax=((1<<5)-1); rfbserver->rfbServerFormat.depth=16; break; case 32://真彩色888 debug_printf("the server vmirror_display used 888 format!\n"); rfbserver->rfbServerFormat.redShift=16; rfbserver->rfbServerFormat.greenShift=8; rfbserver->rfbServerFormat.blueShift=0; rfbserver->rfbServerFormat.redMax=((1<<8)-1); rfbserver->rfbServerFormat.greenMax=((1<<8)-1); rfbserver->rfbServerFormat.blueMax=((1<<8)-1); rfbserver->rfbServerFormat.depth=24; break; default://不应该处理,后果很严重,后虚修补bug--TODO break; } vncscreen=rfbserver; vnc_set_vncclip_pool(vncclip_pool); rfbserver->mirror_display = mirror_display; return ret; } else {