⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 co_dict.c

📁 在pic单片机上实现canopen协议通讯
💻 C
📖 第 1 页 / 共 2 页
字号:
		case 0x20:		// Manufacturer specific
			_pTmpDBase = (rom unsigned char *)_db_manufacturer_g1;
			_tDBaseLen = sizeof(_db_manufacturer_g1)/sizeof(DICT_OBJECT_TEMPLATE);
			break;
		case 0x30:
			_pTmpDBase = (rom unsigned char *)_db_manufacturer_g2;
			_tDBaseLen = sizeof(_db_manufacturer_g2)/sizeof(DICT_OBJECT_TEMPLATE);
			break;
		case 0x40:
			_pTmpDBase = (rom unsigned char *)_db_manufacturer_g3;
			_tDBaseLen = sizeof(_db_manufacturer_g3)/sizeof(DICT_OBJECT_TEMPLATE);
			break;
		case 0x50:
			_pTmpDBase = (rom unsigned char *)_db_manufacturer_g4;
			_tDBaseLen = sizeof(_db_manufacturer_g4)/sizeof(DICT_OBJECT_TEMPLATE);
			break;
			
		case 0x60:		// Standard
			_pTmpDBase = (rom unsigned char *)_db_standard_g1;
			_tDBaseLen = sizeof(_db_standard_g1)/sizeof(DICT_OBJECT_TEMPLATE);
			break;
		case 0x70:
			_pTmpDBase = (rom unsigned char *)_db_standard_g2;
			_tDBaseLen = sizeof(_db_standard_g2)/sizeof(DICT_OBJECT_TEMPLATE);
			break;
		case 0x80:
			_pTmpDBase = (rom unsigned char *)_db_standard_g3;
			_tDBaseLen = sizeof(_db_standard_g3)/sizeof(DICT_OBJECT_TEMPLATE);
			break;
		case 0x90:
			_pTmpDBase = (rom unsigned char *)_db_standard_g4;
			_tDBaseLen = sizeof(_db_standard_g4)/sizeof(DICT_OBJECT_TEMPLATE);
			break;
					
		case 0x10:
			switch (_tMplex.index.bytes.B1.byte & 0x0F)
			{
				case 0x00:		// Device specific information
					_pTmpDBase = (rom unsigned char *)_db_device;
					_tDBaseLen = sizeof(_db_device)/sizeof(DICT_OBJECT_TEMPLATE);
					break;
					
				case 0x02:		// SDO Server/Client
					_pTmpDBase = (rom unsigned char *)_db_sdo;
					_tDBaseLen = sizeof(_db_sdo)/sizeof(DICT_OBJECT_TEMPLATE);
					break;
					
				case 0x04:		// PDO Receive Comm
					if (_tMplex.index.bytes.B0.byte == 0x00)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo1_rx_comm;
						_tDBaseLen = sizeof(_db_pdo1_rx_comm)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else 
					#if CO_NUM_OF_PDO > 1
					if (_tMplex.index.bytes.B0.byte == 0x01)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo2_rx_comm;
						_tDBaseLen = sizeof(_db_pdo2_rx_comm)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else
					#endif
					#if CO_NUM_OF_PDO > 2
					if (_tMplex.index.bytes.B0.byte == 0x02)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo3_rx_comm;
						_tDBaseLen = sizeof(_db_pdo3_rx_comm)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else 
					#endif
					#if CO_NUM_OF_PDO > 3
					if (_tMplex.index.bytes.B0.byte == 0x03)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo4_rx_comm;
						_tDBaseLen = sizeof(_db_pdo4_rx_comm)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else 
					#endif 
					{
						// Index not found in database
						uDict.ret = E_OBJ_NOT_FOUND;
						return;
					}
					break;
					
					
				case 0x06:		// PDO Receive Map					
					if (_tMplex.index.bytes.B0.byte == 0x00)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo1_rx_map;
						_tDBaseLen = sizeof(_db_pdo1_rx_map)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else 
					#if CO_NUM_OF_PDO > 1
					if (_tMplex.index.bytes.B0.byte == 0x01)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo2_rx_map;
						_tDBaseLen = sizeof(_db_pdo2_rx_map)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else
					#endif
					#if CO_NUM_OF_PDO > 2
					if (_tMplex.index.bytes.B0.byte == 0x02)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo3_rx_map;
						_tDBaseLen = sizeof(_db_pdo3_rx_map)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else 
					#endif
					#if CO_NUM_OF_PDO > 3
					if (_tMplex.index.bytes.B0.byte == 0x03)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo4_rx_map;
						_tDBaseLen = sizeof(_db_pdo4_rx_map)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else  
					#endif
					{
						// Index not found in database
						uDict.ret = E_OBJ_NOT_FOUND;
						return;
					}
					break;
					
					
				case 0x08:		// PDO Transmit Comm				
					if (_tMplex.index.bytes.B0.byte == 0x00)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo1_tx_comm;
						_tDBaseLen = sizeof(_db_pdo1_tx_comm)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else 
					#if CO_NUM_OF_PDO > 1
					if (_tMplex.index.bytes.B0.byte == 0x01)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo2_tx_comm;
						_tDBaseLen = sizeof(_db_pdo2_tx_comm)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else
					#endif
					#if CO_NUM_OF_PDO > 2
					if (_tMplex.index.bytes.B0.byte == 0x02)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo3_tx_comm;
						_tDBaseLen = sizeof(_db_pdo3_tx_comm)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else 
					#endif
					#if CO_NUM_OF_PDO > 3
					if (_tMplex.index.bytes.B0.byte == 0x03)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo4_tx_comm;
						_tDBaseLen = sizeof(_db_pdo4_tx_comm)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else  
					#endif
					{
						// Index not found in database
						uDict.ret = E_OBJ_NOT_FOUND;
						return;
					}
					break;
				
				
				case 0x0A:		// PDO Transmit Map					
					if (_tMplex.index.bytes.B0.byte == 0x00)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo1_tx_map;
						_tDBaseLen = sizeof(_db_pdo1_tx_map)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else 
					#if CO_NUM_OF_PDO > 1
					if (_tMplex.index.bytes.B0.byte == 0x01)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo2_tx_map;
						_tDBaseLen = sizeof(_db_pdo2_tx_map)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else
					#endif
					#if CO_NUM_OF_PDO > 2
					if (_tMplex.index.bytes.B0.byte == 0x02)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo3_tx_map;
						_tDBaseLen = sizeof(_db_pdo3_tx_map)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else 
					#endif
					#if CO_NUM_OF_PDO > 3
					if (_tMplex.index.bytes.B0.byte == 0x03)
					{
						_pTmpDBase = (rom unsigned char *)_db_pdo4_tx_map;
						_tDBaseLen = sizeof(_db_pdo4_tx_map)/sizeof(DICT_OBJECT_TEMPLATE);
					}
					else  
					#endif
					{
						// Index not found in database
						uDict.ret = E_OBJ_NOT_FOUND;
						return;
					}
					break;
					
					
//				case 0x05:
//				case 0x07:
//				case 0x09:
//				case 0x0B:
//					_pTmpDBase = (rom unsigned char *)_db_pdo_tx_map;
//					_tDBaseLen = sizeof(_db_pdo_tx_map)/sizeof(DICT_OBJECT_TEMPLATE);
//					break;
				
				default:
					// Index not found in database
					uDict.ret = E_OBJ_NOT_FOUND;
					return;
			}
			break;

		default:
			// Index not found in database
			uDict.ret = E_OBJ_NOT_FOUND;
			return;
	}

	
	// Adjust the status
	uDict.ret = E_OBJ_NOT_FOUND;
	
	// Copy the index and sub-index to local memory
	*(_DATA4 *)(&(_uDictTemp[0])) = *(rom _DATA4 *)_pTmpDBase;

	// Scan the database and load the pointer
	while(_tDBaseLen)
	{					
		// Match the index 
		if ((_uDictTemp[1] == _tMplex.index.bytes.B1.byte) &&
			(_uDictTemp[0] == _tMplex.index.bytes.B0.byte))
		{
			// Adjust the status
			uDict.ret = E_SUBINDEX_NOT_FOUND;
													
			// If the sub index matches then return success code
			if ((_uDictTemp[2] == _tMplex.sindex.byte) ||
			 	(_uDictTemp[3] & FSUB_BIT))
			{
				// Copy control information
		    	*((DICT_OBJECT_TEMPLATE *)(&(uDict.obj->index))) = *((rom DICT_OBJECT_TEMPLATE *)(_pTmpDBase));
		    				    	
		    	// If functionally defined sub-index, copy sub-index from request
		    	if (_uDictTemp[3] & FSUB_BIT) uDict.obj->subindex = _tMplex.sindex.byte;
						
				// If function specific then call the app function for 
				// read/write, mapping, and length info
				if (_uDictTemp[3] & FDEF_BIT) //if (uDict.obj->ctl & FDEF_BIT)
				{
					uDict.ret = E_SUCCESS;
					uDict.cmd = DICT_OBJ_INFO;
					uDict.obj->p.pFunc();	
					return;
				}
				else
				{
					uDict.ret = E_SUCCESS;
					return;
				}
			}
		}

		// Adjust the pointer
		_pTmpDBase += sizeof(DICT_OBJECT_TEMPLATE);
		
		_tDBaseLen--;
		
		// Copy the index and sub-index to local memory
		*(_DATA4 *)(&(_uDictTemp[0])) = *(rom _DATA4 *)_pTmpDBase;
	}
	return;
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -