Esempio n. 1
0
// =========================================================================
// 函数功能:删除整个菜单分支包括祖先节点
// 输入参数: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;

}
Esempio n. 2
0
// =============================================================================
// 功能:新增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;
}
Esempio n. 3
0
// =============================================================================
// 功能:删除在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;
}
Esempio n. 4
0
// =============================================================================
// 功能:删除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;
}
Esempio n. 5
0
// =============================================================================
// 功能:删除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;
}
Esempio n. 6
0
//----卸载输入设备-------------------------------------------------------------
//功能: 把输入设备从资源接点删除,从"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;
}
Esempio n. 7
0
File: tpl.c Progetto: Mars-Wu/djyos
// =============================================================================
// 函数功能: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;
}
Esempio n. 8
0
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
    {