コード例 #1
0
	int MaterialMonitorSim::GetInPlaceStatus(int *pStatus)
	{
		UniqueLock uniqueLock(m_mtx);

		int returnValue = IDTLIB_SUCCESS;
		if (pStatus == NULL)
		{
			returnValue = FCB_NULL_PARAM;
			LOG_EXT(LEVEL_ERROR, "Status pointer is null (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		if (!m_bInitialized)
		{
			returnValue = HW_NOT_INITIALIZED;
			LOG_EXT(LEVEL_ERROR, "Hardware not initialized (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		LOG_EXT(LEVEL_INFO, "Getting in-place status:");
		if (m_behavior == NULL)
		{
			*pStatus = (1 << m_ucCartridgesCount) - 1;
		}
		else
		{
			*pStatus = m_behavior->Status;
		}

		LOG_EXT(LEVEL_INFO, "Status: 0x" << setfill('0') << setw(8) << hex << *pStatus << ".");
		return returnValue;
	}
コード例 #2
0
ファイル: MaterialMonitor.cpp プロジェクト: SlavaC1/ControlSW
	int MaterialMonitor::GetInPlaceStatus(int *pStatus)
	{
		UniqueLock uniqueLock(m_mtx);

		int returnValue = IDTLIB_SUCCESS;
		if (pStatus == NULL)
		{
			returnValue = FCB_NULL_PARAM;
			LOG_EXT(LEVEL_ERROR, "Status pointer is null (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		if (!m_bInitialized)
		{
			returnValue = HW_NOT_INITIALIZED;
			LOG_EXT(LEVEL_ERROR, "Hardware not initialized (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		LOG_EXT(LEVEL_DEBUG, "Getting in-place status:");
		returnValue = m_tagAdapter->GetInPlaceStatus(pStatus);
		if (returnValue == IDTLIB_SUCCESS)
		{
			LOG_EXT(LEVEL_DEBUG, "Status: " "0x" << setfill('0') << setw(4) << hex << *pStatus << ".");
		}
		else
		{
			LOG_EXT(LEVEL_ERROR, "Error Getting in-place status (error code 0x" << hex << (short)returnValue << ").");
		}

		return returnValue;
	}
コード例 #3
0
	int MaterialMonitorSim::ResetCartridgeInfo(unsigned char ucCartridgeNum)
	{
		if (ucCartridgeNum >= m_ucCartridgesCount)
		{
			LOG_EXT(LEVEL_ERROR, "Cannot select cartridge #" << (unsigned short)ucCartridgeNum << ": cartridges count is " << (unsigned short)m_ucCartridgesCount << ".");
			return FCB_SELECT_CHANNEL_FAILED;
		}

		m_authenticated &= ~(1 << ucCartridgeNum);
		LOG_EXT(LEVEL_INFO, "Cartridge #" << (unsigned short)ucCartridgeNum << " was removed successfully.");
		return IDTLIB_SUCCESS;
	}
int mods_init_tegradc(void)
{
#if defined(CONFIG_TEGRA_NVSD)
	int i;
	int ret = 0;
	LOG_ENT();
	for (i = 0; i < TEGRA_MAX_DC; i++) {
		struct tegra_dc *dc = tegra_dc_get_dc(i);
		if (!dc)
			continue;

		tegra_dc_saved_sd_settings[i] = dc->out->sd_settings;
		dc->out->sd_settings = &mods_sd_settings[i];

		if (dc->enabled)
			nvsd_init(dc, dc->out->sd_settings);

		if (!tegra_dc_saved_sd_settings[i])
			ret = nvsd_create_sysfs(&dc->ndev->dev);
	}
	LOG_EXT();
	return ret;
#else
	return 0;
#endif
}
コード例 #5
0
/******************************
 * INIT/EXIT MODULE FUNCTIONS *
 ******************************/
static int __init mods_init_module(void)
{
	int rc;

	LOG_ENT();

	/* Initilize memory tracker */
	mods_init_mem();

	rc = misc_register(&mods_dev);
	if (rc < 0)
		return -EBUSY;

	mods_init_irq();

#ifdef CONFIG_ARCH_TEGRA
	mods_init_clock_api();
#endif

	mods_info_printk("driver loaded, version %x.%02x\n",
			 (MODS_DRIVER_VERSION>>8),
			 (MODS_DRIVER_VERSION&0xFF));
	LOG_EXT();
	return OK;
}
コード例 #6
0
	int MaterialMonitorSim::InitHW(char* pcHsmTarget, unsigned short pcHsmTargetLength, unsigned char *pucCartridgesCount)
	{
		int returnValue = BaseMaterialMonitor::InitHW(useHsmSimulator, pucCartridgesCount);
		if (returnValue != IDTLIB_SUCCESS)
		{
			return returnValue;
		}

		UniqueLock uniqueLock(m_mtx);

		m_bInitialized = false;
		if (m_behavior == NULL)
		{
			m_ucCartridgesCount = MAX_CARTRIDGES_COUNT;
		}
		else
		{
			m_ucCartridgesCount = m_behavior->CartridgesCount;
		}

		*pucCartridgesCount = m_ucCartridgesCount;
		m_bInitialized = true;
		LOG_EXT(LEVEL_INFO, "HW initialized successfully. Number of cartridges: " << (unsigned short)(*pucCartridgesCount) << ".");
		return IDTLIB_SUCCESS;
	}
コード例 #7
0
ファイル: storage.c プロジェクト: astifter/BetteryWatch
static void app_log_storage_log(unsigned int how) {
    battery_estimate_data* be = &(storage.battery_estimate);

    LOG_EXT(how, "storage.selectedVersion: %s", storage.selectedVersion);
    LOG_EXT(how, "storage.battery_estimate.previous_state_timestamp: %ld", be->previous_state_timestamp);
    LOG_EXT(how, "storage.battery_estimate.previous_state.charge_percent: %d", be->previous_state.charge_percent);
    LOG_EXT(how, "storage.battery_estimate.previous_state.is_charging: %d", be->previous_state.is_charging);
    LOG_EXT(how, "storage.battery_estimate.previous_state.is_plugged: %d", be->previous_state.is_plugged);
    LOG_EXT(how, "storage.battery_estimate.average_data_write_head: %d", be->average_data_write_head);
    battery_estimate_data_log(be->averate_data, battery_estimate_data_average_data_num, how);
    LOG_EXT(how, "storage.last_full_timestamp: %ld", storage.last_full_timestamp);
    LOG_EXT(how, "storage.battery_display: %d", storage.battery_display);
}
コード例 #8
0
ファイル: MaterialMonitor.cpp プロジェクト: SlavaC1/ControlSW
	/// <summary>
	/// Initializes a new instance of the <see cref="MaterialMonitor"/> class.
	/// </summary>
	MaterialMonitor::MaterialMonitor()
		: BaseMaterialMonitor(), m_certificates(NULL), m_veriferS(NULL), m_bVerified(false)
	{
		m_tagAdapter = IDTagAdapterFactory::CreateIDTagAdapter();
		m_ucCartridgesCount = 0;
#if (ENABLE_BURNING == 1)
		m_bCorrupt = false;
#endif

		LOG_EXT(LEVEL_INFO, "IDT-Srv initialized.");
	}
コード例 #9
0
	void LoadBehavior(void* arg, const char* fileName)
	{
		MaterialMonitorSim* materialMonitorSim = (MaterialMonitorSim*)arg;
		UniqueLock(materialMonitorSim->GetMutex());

		string path(SIMULATOR_FOLDER);
		path.append(1, PATH_SEPARATOR);
		path.append(BEHAVIORS_FOLDER);
		path.append(1, PATH_SEPARATOR);
		path.append(fileName);
		Behavior* behavior = BehaviorParser::ParseBehavior(path.c_str());
		materialMonitorSim->SetBehavior(behavior);
		if (behavior != NULL)
		{
			LOG_EXT(LEVEL_INFO, "Behavior '" << fileName << "' was loaded.");
		}
		else
		{
			LOG_EXT(LEVEL_WARN, "Error loading behavior '" << fileName << "': invalid file.");
		}
	}
コード例 #10
0
ファイル: MaterialMonitor.cpp プロジェクト: SlavaC1/ControlSW
	/// <summary>
	/// Initializes underlying hardware.
	/// </summary>
	/// <returns>0 on success, non-zero for failures.</returns>
	int MaterialMonitor::InitHW(unsigned char *pucCartridgesCount)
	{
		UniqueLock uniqueLock(m_mtx);

		int returnValue = IDTLIB_SUCCESS;
		if (pucCartridgesCount == NULL)
		{
			returnValue = FCB_NULL_PARAM;
			LOG_EXT(LEVEL_FATAL, "Error initializing HW (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		m_bInitialized = false;
		returnValue = m_tagAdapter->InitHW(pucCartridgesCount);
		if (returnValue != IDTLIB_SUCCESS)
		{
			LOG_EXT(LEVEL_FATAL, "Error initializing HW (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		if (m_ucCartridgesCount != *pucCartridgesCount)
		{
			m_ucCartridgesCount = *pucCartridgesCount;
			if (m_certificates != NULL)
			{
				delete[] m_certificates;
			}

			m_certificates = new IDCertificate*[m_ucCartridgesCount];
		}

		for (unsigned char uc = 0; uc < m_ucCartridgesCount; uc++)
		{
			m_certificates[uc] = NULL;
		}

		LOG_EXT(LEVEL_INFO, "HW initialized successfully. Number of cartridges: " << (unsigned short)(*pucCartridgesCount) << ".");
		m_bInitialized = true;
		return returnValue;
	}
コード例 #11
0
/*********************
 * MAPPING FUNCTIONS *
 *********************/
static int mods_register_mapping(
	struct file *fp,
	struct SYS_MEM_MODS_INFO *p_mem_info,
	NvU64 dma_addr,
	NvU64 virtual_address,
	NvU32 mapping_length)
{
	struct SYS_MAP_MEMORY *p_map_mem;
	MODS_PRIVATE_DATA(private_data, fp);

	LOG_ENT();

	mods_debug_printk(DEBUG_MEM_DETAILED,
			  "mapped dma 0x%llx, virt 0x%llx, size 0x%x\n",
			  dma_addr, virtual_address, mapping_length);

	MODS_KMALLOC(p_map_mem, sizeof(*p_map_mem));
	if (unlikely(!p_map_mem)) {
		LOG_EXT();
		return -ENOMEM;
	}
	memset(p_map_mem, 0, sizeof(*p_map_mem));

	if (p_mem_info == NULL)
		p_map_mem->contiguous = true;
	else
		p_map_mem->contiguous = false;
	p_map_mem->dma_addr = dma_addr;
	p_map_mem->virtual_addr = virtual_address;
	p_map_mem->mapping_length = mapping_length;
	p_map_mem->p_mem_info = p_mem_info;

	list_add(&p_map_mem->list, private_data->mods_mapping_list);
	LOG_EXT();
	return OK;
}
コード例 #12
0
ファイル: storage.c プロジェクト: astifter/BetteryWatch
// Makes sure storage is populated (by checking and, on absence, writing
// defaults) and then reading values.
void storage_init(void) {
    LOG_FUNC();

    // THIS MUST NEVER BE ENABLED */for (unsigned int i = 0; i <= MAXIMUM_EVER_USED; i++) {
    // THIS MUST NEVER BE ENABLED */    if ((i % 10000) == 0) {
    // THIS MUST NEVER BE ENABLED */        LOG_EXT(LOG_STORAGE, "storage_init(): working key %d", i);
    // THIS MUST NEVER BE ENABLED */    }
    // THIS MUST NEVER BE ENABLED */    if (persist_exists(i)) {
    // THIS MUST NEVER BE ENABLED */        LOG_EXT(LOG_STORAGE, "storage_init(): deleting key %d", i);
    // THIS MUST NEVER BE ENABLED */        persist_delete(i);
    // THIS MUST NEVER BE ENABLED */    }
    // THIS MUST NEVER BE ENABLED */}

    if (!persist_exists(SELECTED_VERSION)) {
        persist_write_string(SELECTED_VERSION, "Regular");
        LOG_EXT(LOG_STORAGE, "storage_init(): init %d with data %s", SELECTED_VERSION, "Regular");
    }
    persist_read_string(SELECTED_VERSION, storage.selectedVersion, 64);
    if (!persist_exists(BATTERY_ESTIMATE)) {
        persist_write_data(BATTERY_ESTIMATE, (void*)&battery_estimate_data_init, sizeof(battery_estimate_data));
        LOG_EXT(LOG_STORAGE, "storage_init(): init %d", BATTERY_ESTIMATE);
    }
    persist_read_data(BATTERY_ESTIMATE, (void*)&(storage.battery_estimate), sizeof(battery_estimate_data));
    if (!persist_exists(LAST_FULL_TIMESTAMP)) {
        persist_write_int(LAST_FULL_TIMESTAMP, (time_t)-1);
        LOG_EXT(LOG_STORAGE, "storage_init(): init %d with data %ld", LAST_FULL_TIMESTAMP, (time_t)-1);
    }
    storage.last_full_timestamp = persist_read_int(LAST_FULL_TIMESTAMP);
    if (!persist_exists(BATTERY_DISPLAY)) {
        persist_write_int(BATTERY_DISPLAY, 7);
        LOG_EXT(LOG_STORAGE, "storage_init(): init %d with data %d", BATTERY_DISPLAY, 1);
    }
    storage.battery_display = persist_read_int(BATTERY_DISPLAY);

    app_log_storage_log(LOG_STORAGE_SU);
}
コード例 #13
0
static void __exit mods_exit_module(void)
{
	LOG_ENT();
	mods_cleanup_irq();

	misc_deregister(&mods_dev);

#ifdef CONFIG_ARCH_TEGRA
	mods_shutdown_clock_api();
#endif

	/* Check for memory leakage */
	mods_check_mem();

	mods_info_printk("driver unloaded\n");
	LOG_EXT();
}
コード例 #14
0
	MaterialMonitorSim::MaterialMonitorSim(void)
		: BaseMaterialMonitor(), m_authenticated(0), m_behavior(NULL)
	{
		pthread_mutex_init(&m_simLifetimeMutex, NULL);
		pthread_cond_init(&m_simLifetimeCV, NULL);

		m_timelineFile = SIMULATOR_FOLDER;
		m_timelineFile.append(1, PATH_SEPARATOR);
		m_timelineFile.append(BEHAVIORS_FOLDER);
		m_timelineFile.append(1, PATH_SEPARATOR);
		m_timelineFile.append(TIMELINE_FILE);

		pthread_attr_init(&m_thLoadBehaviorTimelineAttr);
		pthread_attr_setdetachstate(&m_thLoadBehaviorTimelineAttr, PTHREAD_CREATE_JOINABLE);
		pthread_create(&m_thLoadBehaviorTimeline, NULL, LoadBehaviorTimeline, this);

		LOG_EXT(LEVEL_INFO, "RS-Sim initialized.");
	}
コード例 #15
0
ファイル: mods_dev.c プロジェクト: jwise/mods-driver
int esc_mods_pio_write(struct file *pfile, MODS_PIO_WRITE  *p)
{
    LOG_ENT();
    switch (p->DataSize)
    {
        case 1:
            MODS_PIO_WRITE_BYTE(p->Data, p->Port);
            break;
        case 2:
            MODS_PIO_WRITE_WORD(p->Data, p->Port);
            break;
        case 4:
            MODS_PIO_WRITE_DWORD(p->Data, p->Port);
            break;
        default:
            return -EINVAL;
    }
    LOG_EXT();
    return OK;
}
コード例 #16
0
ファイル: mods_dev.c プロジェクト: jwise/mods-driver
int esc_mods_pio_read(struct file *pfile, MODS_PIO_READ *p)
{
    LOG_ENT();
    switch (p->DataSize)
    {
        case 1:
            p->Data = MODS_PIO_READ_BYTE(p->Port);
            break;
        case 2:
            p->Data = MODS_PIO_READ_WORD(p->Port);
            break;
        case 4:
            p->Data = MODS_PIO_READ_DWORD(p->Port);
            break;
        default:
            return -EINVAL;
    }
    LOG_EXT();
    return OK;
}
コード例 #17
0
ファイル: MaterialMonitor.cpp プロジェクト: SlavaC1/ControlSW
	static void *ExecuteVerifyMessage(void* args)
	{
		VerifyParameters* executeVerifyParameters = new VerifyParameters;
		*executeVerifyParameters = *((VerifyParameters*)args);

		try
		{
			*executeVerifyParameters->Verified = executeVerifyParameters->Verifier->VerifyMessage(
				executeVerifyParameters->Message,
				executeVerifyParameters->MessageLength,
				executeVerifyParameters->SignedMessage,
				executeVerifyParameters->SignedMessageLength);
		}
		catch (exception& e)
		{
			LOG_EXT(LEVEL_ERROR, "Error verifying message: " << e.what() << ".");
			*executeVerifyParameters->Verified = false;
		}

		delete executeVerifyParameters;
		return NULL;
	}
コード例 #18
0
ファイル: MaterialMonitor.cpp プロジェクト: SlavaC1/ControlSW
	/// <summary>
	/// Authenticates cartridge by verifying its certificate and its signature of a random token.
	/// </summary>
	/// <param name="ucCartridgeNum">The cartridge number.</param>
	/// <param name="aucPubKS">Stratasys public key.</param>
	/// <param name="aucIdd">The tag identification data (output parameter).</param>
	/// <param name="usIddLength">The tag identification data length (output parameter).</param>
	/// <param name="uiCurrentVolume">The tag current volume (output parameter).</param>
	/// <returns>0 on success, non-zero for failures.</returns>
	int MaterialMonitor::AuthenticateCartridge(unsigned char ucCartridgeNum, const unsigned char *aucPubKS, unsigned char *aucIdd, unsigned short *usIddLength, unsigned int *uiCurrentVolume)
	{
		UniqueLock uniqueLock(m_mtx);

		int returnValue = IDTLIB_SUCCESS;
		if (aucPubKS == NULL && m_pubKS == NULL)
		{
			returnValue = INVALID_HOST_KEY;
			LOG_EXT(LEVEL_ERROR, "Invalid host key (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		if (aucIdd == NULL || usIddLength == NULL || uiCurrentVolume == NULL)
		{
			returnValue = AUTHENTICATE_NULL_PARAMS;
			LOG_EXT(LEVEL_ERROR, "Invalid parameters (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		if (!m_bInitialized)
		{
			returnValue = HW_NOT_INITIALIZED;
			LOG_EXT(LEVEL_ERROR, "Hardware not initialized (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		try
		{
			LOG_EXT(LEVEL_INFO, "Cartridge #" << (unsigned short)ucCartridgeNum << " authentication started:");
			LOG_EXT(LEVEL_INFO, "Reset cartridge #"<< (unsigned short)ucCartridgeNum << " info...");
			int returnValue = ResetCartridgeInfo(ucCartridgeNum);
			if (returnValue != IDTLIB_SUCCESS)
			{
				LOG_EXT(LEVEL_ERROR, "Error resetting cartridge #"<< (unsigned short)ucCartridgeNum << " info (number of cartridges: " << (unsigned short)m_ucCartridgesCount << ", error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			LOG_EXT(LEVEL_INFO, "Switching to cartridge #"<< (unsigned short)ucCartridgeNum << "...");
			returnValue = m_tagAdapter->SwitchToCartridge(ucCartridgeNum);
			if (returnValue != IDTLIB_SUCCESS)
			{
				LOG_EXT(LEVEL_ERROR, "Error switching to cartridge #"<< (unsigned short)ucCartridgeNum << " (number of cartridges: " << (unsigned short)m_ucCartridgesCount << ", error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			LOG_EXT(LEVEL_INFO, "Reading ID certificate...");
			unsigned char aucBuffer[CERTIFICATE_SIZE];
			memset(aucBuffer, 0, sizeof(aucBuffer));
			returnValue = ReadIDCertificate(aucBuffer);
			if (returnValue != IDTLIB_SUCCESS)
			{
				LOG_EXT(LEVEL_ERROR, "Error reading ID certificate (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			bool isEmpty = m_tagAdapter->IsCertificateEmpty(aucBuffer);
			if (isEmpty)
			{
				returnValue = EMPTY_CERTIFICATE_FILE;
				LOG_EXT(LEVEL_ERROR, "Tag is blank (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			LOG_EXT(LEVEL_DEBUG, "Extracting cartridge #" << (unsigned short)ucCartridgeNum << " public key...");
			IDCertificate *certificate = new IDCertificate();
			unsigned short certificateSize;
			try
			{
				certificateSize = (unsigned short)certificate->Decode(aucBuffer);
			}
			catch (exception& e)
			{
				delete certificate;
				returnValue = INVALID_CERTIFICATE_FILE;
				LOG_EXT(LEVEL_ERROR, "Invalid certificate (error code 0x" << hex << (short)returnValue << "): " << e.what() << ".");
				return returnValue;
			}

			*usIddLength = certificateSize - SIGNATURE_SIZE - PUBLIC_KEY_SIZE;
			memcpy(aucIdd, aucBuffer, *usIddLength);

			ECDSA<EC2N, SHA256>::PublicKey* pubKS;
			if (aucPubKS != NULL)
			{
				pubKS = LoadPublicKey(aucPubKS);
				if (pubKS == NULL)
				{
					delete certificate;
					return INVALID_HOST_KEY;
				}
			}
			else
			{
				pubKS = m_pubKS;
			}

			LOG_EXT(LEVEL_INFO, "Verifying ID certificate...");
			SetVerifier(pubKS);
			pthread_t verifierThread;
			VerifyParameters* verifyParameters = CreateVerifyParameters(
				m_veriferS,
				aucBuffer,
				certificateSize - SIGNATURE_SIZE,
				aucBuffer + (certificateSize - SIGNATURE_SIZE),
				SIGNATURE_SIZE);
			CreateVerifierThread(&verifierThread, verifyParameters);

			LOG_EXT(LEVEL_INFO, "Sending random token for IDT to sign...");
			byte aucHostChallenge[TOKEN_SIZE];
			GenerateToken(aucHostChallenge, TOKEN_SIZE);

			byte aucDeviceChallenge[64]; // expected device challenge length
			byte aucSignedDeviceChallenge[SIGNATURE_SIZE];
			unsigned short usDeviceChallengeLength = sizeof(aucDeviceChallenge);
			unsigned short usSignedDeviceChallengeLength = sizeof(aucSignedDeviceChallenge);
			returnValue = ChallengeHostDevice(ucCartridgeNum, aucHostChallenge, TOKEN_SIZE, aucDeviceChallenge, &usDeviceChallengeLength, aucSignedDeviceChallenge, &usSignedDeviceChallengeLength);

			void* status;
			pthread_join(verifierThread, &status);
			delete verifyParameters;
			if (!m_bVerified)
			{
				returnValue = INVALID_CERTIFICATE_SIGNATURE;
				LOG_EXT(LEVEL_ERROR, "Error verifying ID certificate (error code 0x" << hex << (short)returnValue << ").");
				delete certificate;
				return returnValue;
			}

			if (returnValue != IDTLIB_SUCCESS)
			{
				LOG_EXT(LEVEL_ERROR, "Error sending random token to IDT (error code 0x" << hex << (short)returnValue << ").");
				delete certificate;
				return returnValue;
			}

			LOG_EXT(LEVEL_INFO, "Verifying IDT signature...");
			verifyParameters = CreateVerifyParameters(
				certificate->IDD.GetVerifier(),
				aucDeviceChallenge,
				usDeviceChallengeLength,
				aucSignedDeviceChallenge,
				usSignedDeviceChallengeLength);
			CreateVerifierThread(&verifierThread, verifyParameters);

			LOG_EXT(LEVEL_INFO, "Getting current volume...");
			returnValue = GetCurrentVolume(ucCartridgeNum, uiCurrentVolume);

			pthread_join(verifierThread, &status);
			delete verifyParameters;
			if (!m_bVerified)
			{
				returnValue = INVALID_TOKEN_SIGNATURE;
				LOG_EXT(LEVEL_ERROR, "Invalid signature (error code 0x" << hex << (short)returnValue << ").");
				delete certificate;
				return returnValue;
			}

			if (returnValue != IDTLIB_SUCCESS)
			{
				LOG_EXT(LEVEL_ERROR, "Error getting current volume (error code 0x" << hex << (short)returnValue << ").");
				delete certificate;
				return returnValue;
			}

			m_certificates[ucCartridgeNum] = certificate;
			LOG_EXT(LEVEL_INFO, "Cartridge #" << (unsigned short)ucCartridgeNum << " authentication ended successfully. Current weight: " << *uiCurrentVolume << " milligrams.");
			return returnValue;
		}
		catch (exception& e)
		{
			LOG_EXT(LEVEL_ERROR, "Exception caught: " << e.what() << ".");
			return EXCEPTION_CAUGHT;
		}
	}
コード例 #19
0
ファイル: renderer.cpp プロジェクト: williamallas/TIMEngine2
bool init()
{
    GLenum glewerr;
    if((glewerr=glewInit()) != GLEW_OK)
    {
        LOG("glewinit() failed : ",glewGetErrorString(glewerr),"\n");
        return false;
    }
    glGetError();

    std::cout << "Initializing on "<<glGetString(GL_VENDOR)<<" "<<glGetString(GL_RENDERER)<<" using OpenGL "<<glGetString(GL_VERSION)<<"\n";
    LOG("Initializing on ",glGetString(GL_VENDOR)," ",glGetString(GL_RENDERER)," using OpenGL ",glGetString(GL_VERSION),"\n");

    glEnable(GL_DEBUG_OUTPUT);
    glDebugMessageCallback( debugOut, NULL );

    glClearDepth(1);
    openGL.clearDepth();
    openGL.getHardwardProperties();
    openGL.applyAll();

    LOG("\nSupport of bindless_texture: ",glewGetExtension("GL_ARB_bindless_texture")==GL_TRUE);
    LOG("Support of sparse_texture: ",glewGetExtension("GL_ARB_sparse_texture")==GL_TRUE);

    texBufferPool = new TextureBufferPool;

    vertexBufferPool = new VertexBufferPoolType(2 << 20, VertexFormat::VNCT, DrawMode::DYNAMIC);
    indexBufferPool = new IndexBufferPoolType(8 << 20, DrawMode::DYNAMIC);
    indexBufferPool->buffer().bind();

    textureSampler[TextureMode::NoFilter] = Texture::genTextureSampler(false,false,false,false);
    textureSampler[TextureMode::Filtered] = Texture::genTextureSampler(true,true,true,false);
    textureSampler[TextureMode::FilteredNoRepeat] = Texture::genTextureSampler(false,true,true,false);
    textureSampler[TextureMode::OnlyLinearNoRepeat] = Texture::genTextureSampler(false,true,false,false);
    textureSampler[TextureMode::DepthMap] = Texture::genTextureSampler(false,true,false,true);

    ShaderCompiler vDrawQuad(ShaderCompiler::VERTEX_SHADER);
    vDrawQuad.setSource(drawQuad_vertex);
    ShaderCompiler pDrawQuad(ShaderCompiler::PIXEL_SHADER);
    pDrawQuad.setSource(drawQuad_pixel);

    auto optShader = Shader::combine(vDrawQuad.compile({}), pDrawQuad.compile({}));
    if(!optShader.hasValue())
    {
        LOG_EXT("DrawQuad Vertex shader error:\n", vDrawQuad.error());
        LOG_EXT("DrawQuad Pixel shader error:\n", pDrawQuad.error());
        LOG_EXT("DrawQuad Link erorr:", Shader::lastLinkError());
    }
    else
        drawQuadShader = optShader.value();

    ShaderCompiler vDepthPass(ShaderCompiler::VERTEX_SHADER);
    vDepthPass.setSource(depthPass_vertex);
    LOG("No gs for DepthPass shader, expect a warning");
    optShader = Shader::linkVertexShader(vDepthPass.compile({}));
    if(!optShader.hasValue())
    {
        LOG_EXT("DepthPass Vertex shader error:\n", vDepthPass.error());
        LOG_EXT("DepthPass Link erorr:", Shader::lastLinkError());
    }
    else
        depthPassShader = optShader.value();

    VNCT_Vertex vData[4] = {{vec3(-1,-1,0),vec3(),vec2(0,0),vec3()},
                            {vec3(-1, 1,0),vec3(),vec2(0,1),vec3()},
                            {vec3( 1, 1,0),vec3(),vec2(1,1),vec3()},
                            {vec3( 1,-1,0),vec3(),vec2(1,0),vec3()}};
    uint iData[6] = {0,1,2,2,3,0};

    VBuffer* tmpVB = vertexBufferPool->alloc(4);
    IBuffer* tmpIB = indexBufferPool->alloc(6);
    tmpVB->flush(reinterpret_cast<float*>(vData),0,4);
    tmpIB->flush(iData,0,6);
    quadMeshBuffers = new MeshBuffers(tmpVB,tmpIB);

    glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
    if(openGL.hardward(GLState::Hardward::MAJOR_VERSION) > 4 ||
       (openGL.hardward(GLState::Hardward::MAJOR_VERSION)==4 && openGL.hardward(GLState::Hardward::MINOR_VERSION)>=3))
    {
        if(glewGetExtension("GL_ARB_bindless_texture")!=GL_TRUE)
        {
            LOG("You don't support GL_ARB_bindless_texture, you can't run TIMEngine sorry.");
            return false;
        }
        return true;
    }
    else
    {
        LOG("You don't have a sufficient openGL version.");
        return false;
    }

}
コード例 #20
0
void update_time(void) {
  LOG_FUNC();

  if (!ui_updates_enabled) {
      LOG(LOG_FACEUPDATE, "static void update_time(): not done, not enabled");
      return;
  }

  time_t temp = time(NULL);
  struct tm *tick_time = localtime(&temp);

  LOG(LOG_FACEUPDATE, "static void update_time(): display plain time");
  // Use a static (long lived) buffer for the numeric time.
  static char time[] = "00:00";
  // Write the current hours and minutes into the buffer, considerung the
  // 12/24h style.
  if(clock_is_24h_style() == true) {
    strftime(time, sizeof("00:00"), "%H:%M", tick_time);
  } else {
    strftime(time, sizeof("00:00"), "%I:%M", tick_time);
  }
  // Display time in respective layer.
  text_layer_set_text(s_timelayer, time);

  int weekday = tick_time->tm_wday-1;
  if (weekday < 0) weekday += 7;
  LOG(LOG_FACEUPDATE, "static void update_time(): display date");
  LOG_EXT(LOG_FACEUPDATE, "static void update_time(): day: %d", weekday);
  LOG_EXT(LOG_FACEUPDATE, "static void update_time(): mday: %d", tick_time->tm_mday);
  LOG_EXT(LOG_FACEUPDATE, "static void update_time(): month: %d", tick_time->tm_mon);
  // Use a static (long lived) buffer for the numeric date.
  static char date[80];
  strftime(date, 80, "%a, %d. %b", tick_time);
  // Display date in respective layer.
  LOG(LOG_FACEUPDATE, "updating s_date_layer");
  text_layer_set_text(s_datelayer, date);

  // Fetch and print BlueTooth status information.
  LOG(LOG_FACEUPDATE, "updating s_info1_layer");
  text_layer_set_text(s_btlayer, bt_state_string);
  if (bt_state) {
    bitmap_layer_set_bitmap(s_bitmaplayer_bt, s_res_image_bt_active);
  } else {
    bitmap_layer_set_bitmap(s_bitmaplayer_bt, s_res_image_bt_passive);
  }

  LOG(LOG_FACEUPDATE, "updating s_batterylayer");
  static char battery_state_str[6];
  if (battery_state.is_plugged) {
    if (battery_state.is_charging) {
      snprintf(battery_state_str, 6, "charging");
    } else {
      snprintf(battery_state_str, 6, "full");
    }
  } else {
    snprintf(battery_state_str, 6, "%d%%", battery_state.charge_percent);
  }
  text_layer_set_text(s_batterylayer, battery_state_str);
   
  if (storage.last_full_timestamp != -1) {
    static stringbuffer outbound;
    stringbuffer_init(&outbound);
    stringbuffer_append_ti(&outbound, temp - storage.last_full_timestamp);
    text_layer_set_text(s_outboundlayer, outbound.retval);
  } else if (battery_state.is_plugged) {
    text_layer_set_text(s_outboundlayer, "plugged");
  } else {
    text_layer_set_text(s_outboundlayer, "-");
  }
  static stringbuffer inbound;
  stringbuffer_init(&inbound);
  stringbuffer_append_ti(&inbound, battery_estimate_secs);
  text_layer_set_text(s_inboundlayer, inbound.retval);
}
int esc_mods_tegra_dc_config_possible(struct file *fp,
				struct MODS_TEGRA_DC_CONFIG_POSSIBLE *args)
{
	int i;
	struct tegra_dc *dc = tegra_dc_get_dc(args->head);
	struct tegra_dc_win *dc_wins[DC_N_WINDOWS];
#ifndef CONFIG_TEGRA_ISOMGR
	struct clk *emc_clk = 0;
	unsigned long max_bandwidth = 0;
	unsigned long current_emc_freq = 0;
	unsigned long max_available_bandwidth = 0;
#else
	int ret = -EINVAL;
#endif

	LOG_ENT();

	BUG_ON(args->win_num > DC_N_WINDOWS);

	if (!dc) {
		LOG_EXT();
		return -EINVAL;
	}

	for (i = 0; i < args->win_num; i++) {
		int idx = args->windows[i].index;

		if (args->windows[i].flags &
			MODS_TEGRA_DC_WINDOW_FLAG_ENABLED) {
			mods_tegra_dc_set_windowattr_basic(&dc->tmp_wins[idx],
							  &args->windows[i]);
		} else {
			dc->tmp_wins[idx].flags = 0;
		}
		dc_wins[i] = &dc->tmp_wins[idx];
		mods_debug_printk(DEBUG_TEGRADC,
			"esc_mods_tegra_dc_config_possible head %u, "
			"using index %d for window %d\n",
			args->head, i, idx);
	}

	mods_debug_printk(DEBUG_TEGRADC,
		"esc_mods_tegra_dc_config_possible head %u, "
		"dc->mode.pclk %u\n",
		args->head, dc->mode.pclk);

#ifndef CONFIG_TEGRA_ISOMGR
	max_bandwidth = tegra_dc_get_bandwidth(dc_wins, args->win_num);

	emc_clk = clk_get_sys("tegra_emc", "emc");
	if (IS_ERR(emc_clk)) {
		mods_debug_printk(DEBUG_TEGRADC,
		"esc_mods_tegra_dc_config_possible "
		"invalid clock specified when fetching EMC clock\n");
	} else {
		current_emc_freq = clk_get_rate(emc_clk);
		current_emc_freq /= 1000;
		max_available_bandwidth =
			8 * tegra_emc_freq_req_to_bw(current_emc_freq);
		max_available_bandwidth = (max_available_bandwidth / 100) * 50;
	}

	mods_debug_printk(DEBUG_TEGRADC,
		"esc_mods_tegra_dc_config_possible bandwidth needed = %lu,"
		" bandwidth available = %lu\n",
		max_bandwidth, max_available_bandwidth);

	args->possible = (max_bandwidth <= max_available_bandwidth);
#else
	ret = tegra_dc_bandwidth_negotiate_bw(dc, dc_wins, args->win_num);
	args->possible = (ret == 0);
#endif
	for (i = 0; i < args->win_num; i++) {
		args->windows[i].bandwidth = dc_wins[i]->new_bandwidth;
		mods_debug_printk(DEBUG_TEGRADC,
			"esc_mods_tegra_dc_config_possible head %u, "
			"window %d bandwidth %d\n",
			args->head, dc_wins[i]->idx, dc_wins[i]->new_bandwidth);
	}

	LOG_EXT();
	return 0;
}
int esc_mods_tegra_dc_setup_sd(struct file *fp,
	struct MODS_TEGRA_DC_SETUP_SD *args)
{
	int i;
	struct tegra_dc *dc = tegra_dc_get_dc(args->head);
	struct tegra_dc_sd_settings *sd_settings = dc->out->sd_settings;
#if defined(CONFIG_ARCH_TEGRA_12x_SOC)
	u32 val;
#endif
	u32 bw_idx;
	LOG_ENT();

	BUG_ON(args->head > TEGRA_MAX_DC);

	sd_settings->enable = args->enable ? 1 : 0;
	sd_settings->use_auto_pwm = false;
	sd_settings->hw_update_delay = 0;

	sd_settings->aggressiveness = args->aggressiveness;
	sd_settings->bin_width = (1 << args->bin_width_log2);

	sd_settings->phase_in_settings = 0;
	sd_settings->phase_in_adjustments = 0;
	sd_settings->cmd = 0;
	sd_settings->final_agg = args->aggressiveness;
	sd_settings->cur_agg_step = 0;
	sd_settings->phase_settings_step = 0;
	sd_settings->phase_adj_step = 0;
	sd_settings->num_phase_in_steps = 0;

	sd_settings->agg_priorities.agg[0] = args->aggressiveness;

	sd_settings->use_vid_luma = args->use_vid_luma;
	sd_settings->coeff.r = args->csc_r;
	sd_settings->coeff.g = args->csc_g;
	sd_settings->coeff.b = args->csc_b;

	sd_settings->k_limit_enable = (args->klimit != 0);
	sd_settings->k_limit = args->klimit;
	sd_settings->sd_window_enable = true;

	sd_settings->sd_window.h_position = args->win_x;
	sd_settings->sd_window.v_position = args->win_y;
	sd_settings->sd_window.h_size     = args->win_w;
	sd_settings->sd_window.v_size     = args->win_h;

	sd_settings->soft_clipping_enable    = true;
	sd_settings->soft_clipping_threshold = args->soft_clipping_threshold;


	sd_settings->smooth_k_enable = (args->smooth_k_inc != 0);
	sd_settings->smooth_k_incr   = args->smooth_k_inc;

	sd_settings->sd_proc_control = false;
	sd_settings->soft_clipping_correction = false;
	sd_settings->use_vpulse2 = false;

	sd_settings->fc.time_limit = 0;
	sd_settings->fc.threshold  = 0;

	sd_settings->blp.time_constant = 1024;
	sd_settings->blp.step          = 0;


#ifdef CONFIG_TEGRA_SD_GEN2
	bw_idx = 0;
#else
	bw_idx = args->bin_width_log2;
#endif
	for (i = 0; i < MODS_TEGRA_DC_SETUP_BLTF_SIZE; i++) {
		sd_settings->bltf[bw_idx][i/4][i%4] =
			args->bltf[i];
	}

	for (i = 0; i < MODS_TEGRA_DC_SETUP_SD_LUT_SIZE; i++) {
		sd_settings->lut[bw_idx][i].r =
			args->lut[i] & 0xff;
		sd_settings->lut[bw_idx][i].g =
			(args->lut[i] >> 8) & 0xff;
		sd_settings->lut[bw_idx][i].b =
			(args->lut[i] >> 16) & 0xff;
	}

#if defined(CONFIG_TEGRA_NVSD)
	nvsd_init(dc, sd_settings);
#endif
#if defined(CONFIG_ARCH_TEGRA_12x_SOC)
	tegra_dc_io_start(dc);
	val = tegra_dc_readl(dc, DC_DISP_SD_CONTROL);
	val &= ~SD_KINIT_BIAS(0);
	val &= ~SD_CORRECTION_MODE_MAN;
	tegra_dc_writel(dc, val | SD_KINIT_BIAS(args->k_init_bias),
		DC_DISP_SD_CONTROL);
	tegra_dc_io_end(dc);
#endif

	if (dc->enabled) {
		mutex_lock(&dc->lock);
		tegra_dc_get(dc);
		tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
		tegra_dc_put(dc);
		mutex_unlock(&dc->lock);
	}

	LOG_EXT();
	return 0;
}
コード例 #23
0
void app_log_battery_state(BatteryChargeState s) {
    LOG_EXT(LOG_BATTERY, "s.charge_percent: %d", s.charge_percent);
    LOG_EXT(LOG_BATTERY, "s.is_charging: %d", s.is_charging);
    LOG_EXT(LOG_BATTERY, "s.is_plugged: %d", s.is_plugged);
}
コード例 #24
0
	///
	/// Authenticates cartridge.
	///
	int MaterialMonitorSim::AuthenticateCartridge(unsigned char ucCartridgeNum, const unsigned char *aucPubKS, unsigned char *aucIdd, unsigned short *usIddLength, unsigned int *uiCurrentVolume)
	{
		UniqueLock uniqueLock(m_mtx);

		int returnValue = IDTLIB_SUCCESS;
		if (aucPubKS == NULL && m_pubKS == NULL)
		{
			returnValue = INVALID_HOST_KEY;
			LOG_EXT(LEVEL_ERROR, "Invalid host key (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		if (aucIdd == NULL || usIddLength == NULL || uiCurrentVolume == NULL)
		{
			returnValue = AUTHENTICATE_NULL_PARAMS;
			LOG_EXT(LEVEL_ERROR, "Invalid parameters (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		if (!m_bInitialized)
		{
			returnValue = HW_NOT_INITIALIZED;
			LOG_EXT(LEVEL_ERROR, "Hardware not initialized (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		try
		{
			int behaviorReturnValue = GetAuthenticateCartridgeBehavior(ucCartridgeNum, aucPubKS, aucIdd, usIddLength, uiCurrentVolume);

			LOG_EXT(LEVEL_INFO, "Cartridge #" << (unsigned short)ucCartridgeNum << " authentication started:");
			LOG_EXT(LEVEL_INFO, "Switching to cartridge #"<< (unsigned short)ucCartridgeNum << "...");
			if (((m_behavior != NULL) && !IsCartridgeOn(ucCartridgeNum, m_behavior->Status)) ||
				behaviorReturnValue == FCB_SELECT_CHANNEL_FAILED)
			{
				returnValue = FCB_SELECT_CHANNEL_FAILED;
				LOG_EXT(LEVEL_ERROR, "Error switching to cartridge #"<< (unsigned short)ucCartridgeNum << " (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			ResetCartridgeInfo(ucCartridgeNum);

			// read certificate file
			LOG_EXT(LEVEL_INFO, "Getting ID certificate...");
			string sCertificateFileName = GetCartridgeFileName(ucCartridgeNum, CERTIFICATE_FILE);

			FILE *pCertificateFile = fopen(sCertificateFileName.c_str(), "rb");
			if (pCertificateFile == NULL || behaviorReturnValue == INVALID_CERTIFICATE_FILE)
			{
				returnValue = INVALID_CERTIFICATE_FILE;
				LOG_EXT(LEVEL_ERROR, "Error getting ID certificate (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			fseek(pCertificateFile , 0 , SEEK_END);
			size_t fileSize = (size_t)ftell(pCertificateFile);
			rewind(pCertificateFile);
			fread(aucIdd, sizeof(unsigned char), fileSize, pCertificateFile);

			IDCertificate idc;
			*usIddLength = (unsigned short)idc.Decode(aucIdd) - SIGNATURE_SIZE;

			ECDSA<EC2N, SHA256>::PublicKey* pubKS;
			if (aucPubKS != NULL)
			{
				pubKS = LoadPublicKey(aucPubKS);
				if (pubKS == NULL)
				{
					return INVALID_HOST_KEY;
				}
			}
			else
			{
				pubKS = m_pubKS;
			}

			if (returnValue == INVALID_HOST_KEY || behaviorReturnValue == INVALID_HOST_KEY)
			{
				returnValue = INVALID_HOST_KEY;
				LOG_EXT(LEVEL_ERROR, "Invalid host key (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			// verify signature:
			ECDSA<EC2N, SHA256>::Verifier verifier(*pubKS);
			bool ok;
			try
			{
				ok = verifier.VerifyMessage(aucIdd, *usIddLength, aucIdd + *usIddLength, SIGNATURE_SIZE);
			}
			catch (exception& e)
			{
				LOG_EXT(LEVEL_ERROR, "Error verifying ID certificate (error code 0x" << hex << (short)returnValue << "):" << e.what() << ".");
				ok = false;
			}

			if (!ok || behaviorReturnValue == INVALID_CERTIFICATE_SIGNATURE)
			{
				returnValue = INVALID_CERTIFICATE_SIGNATURE;
				LOG_EXT(LEVEL_ERROR, "Error verifying ID certificate (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			// read counter
			returnValue = ReadCounter(ucCartridgeNum, uiCurrentVolume);
			if (returnValue != IDTLIB_SUCCESS)
			{
				if (returnValue == INVALID_VOLUME_SIGNATURE || behaviorReturnValue == INVALID_VOLUME_SIGNATURE)
				{
					LOG_EXT(LEVEL_ERROR, "Error verifying signature (error code 0x" << hex << (short)returnValue << ").");
				}
				else
				{
					LOG_EXT(LEVEL_ERROR, "Error reading counter (error code 0x" << hex << (short)returnValue << ").");
				}

				return returnValue;
			}

			returnValue = behaviorReturnValue;
			if (returnValue == IDTLIB_SUCCESS)
			{
				m_authenticated |= (1 << ucCartridgeNum);
				LOG_EXT(LEVEL_INFO, "Cartridge #" << (unsigned short)ucCartridgeNum << " authentication ended successfully. Current volume: " << *uiCurrentVolume << ".");
			}
			else
			{
				LOG_EXT(LEVEL_ERROR, "Error authenticating cartridge (error code 0x" << hex << (short)returnValue << ").");
			}

			return returnValue;
		}
		catch (exception& e)
		{
			LOG_EXT(LEVEL_ERROR, "Exception caught: " << e.what() << ".");
			return EXCEPTION_CAUGHT;
		}
	}
コード例 #25
0
ファイル: MaterialMonitor.cpp プロジェクト: SlavaC1/ControlSW
	/// <summary>
	/// Verifies cartridge material consumption, by decreasing volume to consume from cartridge current volume,
	/// checking if new value is equals to the expected value and verifying signature.
	/// </summary>
	/// <param name="ucCartridgeNum">The cartridge number.</param>
	/// <param name="uiComsumption">The material volume to consume.</param>
	/// <param name="uiNewVolume">Cartridge new volume.</param>
	/// <returns>0 on success, non-zero for failures.</returns>
	int MaterialMonitor::UpdateConsumption(unsigned char ucCartridgeNum, unsigned int uiComsumption, unsigned int *uiNewVolume)
	{
		UniqueLock uniqueLock(m_mtx);

		int returnValue = IDTLIB_SUCCESS;
		if (uiNewVolume == NULL)
		{
			returnValue = CONSUMPTION_NULL_PARAMS;
			LOG_EXT(LEVEL_ERROR, "Invalid parameters (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		if (!m_bInitialized)
		{
			returnValue = HW_NOT_INITIALIZED;
			LOG_EXT(LEVEL_ERROR, "Hardware not initialized (error code 0x" << hex << (short)returnValue << ").");
			return returnValue;
		}

		try
		{
			LOG_EXT(LEVEL_INFO, "Cartridge #" << (unsigned short)ucCartridgeNum << " material consumption started...");
			LOG_EXT(LEVEL_INFO, "Switching to cartridge #"<< (unsigned short)ucCartridgeNum << "...");
			int returnValue = m_tagAdapter->SwitchToCartridge(ucCartridgeNum);
			if (returnValue != IDTLIB_SUCCESS)
			{
				LOG_EXT(LEVEL_ERROR, "Error switching to cartridge #"<< (unsigned short)ucCartridgeNum << " (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			if (m_certificates == NULL ||
				m_certificates[ucCartridgeNum] == NULL)
			{
				returnValue = CARTRIDGE_NOT_AUTHENTICATED;
				LOG_EXT(LEVEL_ERROR, "Cartridge #"<< (unsigned short)ucCartridgeNum << " not authenticated (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			LOG_EXT(LEVEL_INFO, "Decreasing volume by " << uiComsumption << "...");
			CounterResponse counterResponse;
			returnValue = DecreaseVolume(ucCartridgeNum, uiComsumption, &counterResponse);
			if (returnValue != IDTLIB_SUCCESS)
			{
				LOG_EXT(LEVEL_ERROR, "Error decreasing volume (error code 0x" << hex << (short)returnValue << ").");
				if (returnValue == MATERIAL_OVERCONSUMPTION)
				{
					DecreaseVolume(ucCartridgeNum, 0, &counterResponse);
					*uiNewVolume = counterResponse.GetCounterValue();
				}

				return returnValue;
			}

			LOG_EXT(LEVEL_INFO, "Verifying signature...");
			bool ok = VerifyVolume(m_certificates[ucCartridgeNum]->IDD.GetVerifier(), counterResponse);
			if (!ok)
			{
				returnValue = INVALID_VOLUME_SIGNATURE;
				LOG_EXT(LEVEL_ERROR, "Error verifying signature (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			*uiNewVolume = counterResponse.GetCounterValue();
			LOG_EXT(LEVEL_INFO, "Cartridge #" << (unsigned short)ucCartridgeNum << " material consumption ended successfully. Current weight: " << *uiNewVolume << " milligrams.");
			return returnValue;
		}
		catch (exception& e)
		{
			LOG_EXT(LEVEL_ERROR, "Exception caught: " << e.what() << ".");
			return EXCEPTION_CAUGHT;
		}
	}
コード例 #26
0
	void *LoadBehaviorTimeline(void* arg)
	{
		MaterialMonitorSim* materialMonitorSim = (MaterialMonitorSim*)arg;

		try
		{
			LOG_EXT(LEVEL_INFO, "Loading behavior timeline '.\\" << materialMonitorSim->GetTimelineFile() << "'...");

			XMLDocument doc;
			doc.LoadFile(materialMonitorSim->GetTimelineFile().c_str());

			XMLElement* root = doc.RootElement();
			if (root != NULL)
			{
				XMLElement* behaviorEl = root->FirstChildElement("Behavior");
				XMLElement* lastBehaviorEl = root->LastChildElement("Behavior");
				while (behaviorEl != NULL)
				{
					float interval = 0;
					behaviorEl->QueryFloatAttribute("Interval", &interval);
					LOG_EXT(LEVEL_INFO, "Waiting for behavior for " << interval << " seconds...");
					if (interval > 0)
					{
						// Wait for a specified interval by acquiring a lock;
						// if lock was acquired successfully, destructor was called - shutdown thread.
						timespec ts;
						timeb now;
						ftime(&now);
						ts.tv_sec = now.time + (int)floorf(interval);
						long nsec = now.millitm * 1000000 + (long)((interval - floorf(interval)) * 1000000000);
						ts.tv_sec += nsec / 1000000000;
						ts.tv_nsec = nsec % 1000000000;

						pthread_mutex_t simLifetimeMutex = materialMonitorSim->GetSimLifetimeMutex();
						pthread_cond_t simLifetimeCV = materialMonitorSim->GetSimLifetimeCV();
						pthread_mutex_lock(&simLifetimeMutex);
						int cvStatus = pthread_cond_timedwait(&simLifetimeCV, &simLifetimeMutex, &ts);
						bool timeout;
#ifdef WIN32
						timeout = (cvStatus == WSAETIMEDOUT);
#else
						timeout = (cvStatus == ETIMEDOUT);
#endif

						pthread_mutex_unlock(&simLifetimeMutex);
						if (!timeout)
						{
							break;
						}
					}
					LoadBehavior(materialMonitorSim, behaviorEl->GetText());

					behaviorEl = (behaviorEl == lastBehaviorEl) ? NULL : behaviorEl->NextSiblingElement();
				}

				LOG_EXT(LEVEL_INFO, "Behavior timeline loaded successfully.");
			}
			else
			{
				LOG_EXT(LEVEL_WARN, "Cannot find file root.");
			}
		}
		catch (...)
		{
			LOG_EXT(LEVEL_WARN, "Invalid timeline.");
		}

		return NULL;
	}
コード例 #27
0
	///
	/// Verifies material consumption.
	//
	int MaterialMonitorSim::UpdateConsumption(unsigned char ucCartridgeNum, unsigned int uiComsumption, unsigned int *uiNewVolume)
	{
		UniqueLock uniqueLock(m_mtx);

		try
		{
			int returnValue = IDTLIB_SUCCESS;
			if (uiNewVolume == NULL)
			{
				returnValue = CONSUMPTION_NULL_PARAMS;
				LOG_EXT(LEVEL_ERROR, "Invalid parameters (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			if (!m_bInitialized)
			{
				returnValue = HW_NOT_INITIALIZED;
				LOG_EXT(LEVEL_ERROR, "Hardware not initialized (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			int behaviorReturnValue = GetUpdateConsumptionBehavior(ucCartridgeNum, uiComsumption, uiNewVolume);

			LOG_EXT(LEVEL_INFO, "Cartridge #" << (unsigned short)ucCartridgeNum << " material consumption started...");
			if (!IsCartridgeOn(ucCartridgeNum, m_authenticated) ||
				behaviorReturnValue == CARTRIDGE_NOT_AUTHENTICATED)
			{
				returnValue = CARTRIDGE_NOT_AUTHENTICATED;
				LOG_EXT(LEVEL_ERROR, "Cartridge #"<< (unsigned short)ucCartridgeNum << " not authenticated (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			LOG_EXT(LEVEL_INFO, "Switching to cartridge #"<< (unsigned short)ucCartridgeNum << "...");
			if (((m_behavior != NULL) && !IsCartridgeOn(ucCartridgeNum, m_behavior->Status)) ||
				behaviorReturnValue == FCB_SELECT_CHANNEL_FAILED)
			{
				returnValue = FCB_SELECT_CHANNEL_FAILED;
				LOG_EXT(LEVEL_ERROR, "Error switching to cartridge #"<< (unsigned short)ucCartridgeNum << " (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			LOG_EXT(LEVEL_INFO, "Getting current volume...");
			returnValue = ReadCounter(ucCartridgeNum, uiNewVolume);
			if (returnValue != IDTLIB_SUCCESS)
			{
				if (returnValue == INVALID_VOLUME_SIGNATURE || behaviorReturnValue == INVALID_VOLUME_SIGNATURE)
				{
					LOG_EXT(LEVEL_ERROR, "Error verifying signature (error code 0x" << hex << (short)returnValue << ").");
				}
				else
				{
					LOG_EXT(LEVEL_ERROR, "Error reading counter (error code 0x" << hex << (short)returnValue << ").");
				}

				return returnValue;
			}

			if (*uiNewVolume < uiComsumption || behaviorReturnValue == MATERIAL_OVERCONSUMPTION)
			{
				returnValue = MATERIAL_OVERCONSUMPTION;
				LOG_EXT(LEVEL_ERROR, "Invalid consumption (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			returnValue = behaviorReturnValue;
			if (returnValue == IDTLIB_SUCCESS)
			{
				LOG_EXT(LEVEL_INFO, "Decreasing volume by " << uiComsumption << "...");
				*uiNewVolume -= uiComsumption;
				WriteCounter(ucCartridgeNum, *uiNewVolume);
				LOG_EXT(LEVEL_INFO, "Cartridge #" << (unsigned short)ucCartridgeNum << " material consumption ended successfully. Current volume: " << *uiNewVolume << ".");
			}
			else
			{
				LOG_EXT(LEVEL_ERROR, "Error updating consumption (error code 0x" << hex << (short)returnValue << ").");
			}

			return returnValue;
		}
		catch (exception& e)
		{
			LOG_EXT(LEVEL_ERROR, "Exception caught: " << e.what() << ".");
			return EXCEPTION_CAUGHT;
		}
	}
コード例 #28
0
ファイル: MaterialMonitor.cpp プロジェクト: SlavaC1/ControlSW
	/// <summary>
	/// Generates certificate from material information and burns it into tag.
	/// </summary>
	/// <param name="ucCartridgeNum">The cartridge number.</param>
	/// <param name="aucMaterialInfo">The material information.</param>
	/// <param name="usMaterialInfoLength">The material information length.</param>
	/// <param name="aucPrvKS">SSYS private key.</param>
	/// <param name="aucPubKS">SSYS public key.</param>
	/// <returns>0 on success, non-zero for failures.</returns>
	int MaterialMonitor::BurnIDC(unsigned char ucCartridgeNum, const unsigned char *aucMaterialInfo, unsigned short usMaterialInfoLength, const unsigned char *aucPrvKS, const unsigned char *aucPubKS)
	{
		UniqueLock uniqueLock(m_mtx);

		int returnValue = IDTLIB_SUCCESS;
		bool areParametersValid = true;
		if (m_bCorrupt)
		{
			areParametersValid = (aucMaterialInfo != NULL) &&
				(aucPrvKS != NULL) &&
				((aucPubKS != NULL) || (m_pubKS != NULL));
		}
		else
		{
			areParametersValid = (aucMaterialInfo == NULL) ||
				((aucPrvKS != NULL) && ((aucPubKS != NULL) || (m_pubKS != NULL)));
		}

		if (!areParametersValid)
		{
			returnValue = BURN_NULL_PARAMS;
			LOG_EXT(LEVEL_ERROR, "Invalid parameters.");
			return returnValue;
		}

		try
		{
			LOG_EXT(LEVEL_INFO, "Setting ID certificate for cartridge #" << (unsigned short)ucCartridgeNum << " started:");
			LOG_EXT(LEVEL_INFO, "Switching to cartridge #"<< (unsigned short)ucCartridgeNum << "...");
			returnValue = m_tagAdapter->SwitchToCartridge(ucCartridgeNum);
			if (returnValue != IDTLIB_SUCCESS)
			{
				LOG_EXT(LEVEL_ERROR, "Error switching to cartridge #"<< (unsigned short)ucCartridgeNum << " (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			unsigned char aucCertificate[CERTIFICATE_SIZE];
			unsigned short usCertificateLength = CERTIFICATE_SIZE;
			if (m_bCorrupt)
			{
				ReadIDCertificate(aucCertificate);
			}

			LOG_EXT(LEVEL_INFO, "Logging in to cartridge #"<< (unsigned short)ucCartridgeNum << " ...");
			returnValue = m_tagAdapter->Login();
			if (returnValue != IDTLIB_SUCCESS)
			{
				LOG_EXT(LEVEL_ERROR, "Error logging in to cartridge #"<< (unsigned short)ucCartridgeNum << " (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			if (aucMaterialInfo != NULL)
			{
				LOG_EXT(LEVEL_INFO, "Configuring cartridge #"<< (unsigned short)ucCartridgeNum << "...");
				returnValue = m_tagAdapter->Configure();
				if (returnValue != IDTLIB_SUCCESS)
				{
					LOG_EXT(LEVEL_ERROR, "Error configuring to cartridge #"<< (unsigned short)ucCartridgeNum << " (error code 0x" << hex << (short)returnValue << ").");
					return returnValue;
				}

				unsigned char pubKS[PUBLIC_KEY_SIZE];
				if (aucPubKS != NULL)
				{
					returnValue = SetPubKS(aucPubKS);
					if (returnValue != IDTLIB_SUCCESS)
					{
						LOG_EXT(LEVEL_ERROR, "Error setting host public key (error code 0x" << hex << (short)returnValue << ").");
						return returnValue;
					}
				}

				try
				{
					m_pubKS->Save(ArraySink(pubKS, PUBLIC_KEY_SIZE).Ref());
				}
				catch (...)
				{
					returnValue = INVALID_HOST_KEY;
					LOG_EXT(LEVEL_ERROR, "Invalid host key.");
					return returnValue;
				}

				LOG_EXT(LEVEL_INFO, "Setting keys of cartridge #"<< (unsigned short)ucCartridgeNum << "...");
				returnValue = m_tagAdapter->SetKeys(pubKS);
				if (returnValue != IDTLIB_SUCCESS)
				{
					LOG_EXT(LEVEL_ERROR, "Error setting keys of cartridge #"<< (unsigned short)ucCartridgeNum << " (error code 0x" << hex << (short)returnValue << ").");
					return returnValue;
				}

				LOG_EXT(LEVEL_INFO, "Setting counter of cartridge #"<< (unsigned short)ucCartridgeNum << "...");
				MaterialInformation materialInfo;
				materialInfo.Decode(aucMaterialInfo);
				returnValue = m_tagAdapter->SetCounter((unsigned int)(materialInfo.InitialWeight) * 1000);
				if (returnValue != IDTLIB_SUCCESS)
				{
					LOG_EXT(LEVEL_ERROR, "Error setting counter of cartridge #"<< (unsigned short)ucCartridgeNum << " (error code 0x" << hex << (short)returnValue << ").");
					return returnValue;
				}

				if (m_bCorrupt)
				{
					LOG_EXT(LEVEL_INFO, "Modifying cartridge #"<< (unsigned short)ucCartridgeNum << " certificate...");
					memcpy(aucCertificate, aucMaterialInfo, usMaterialInfoLength);
				}
				else
				{
					LOG_EXT(LEVEL_INFO, "Generate cartridge #"<< (unsigned short)ucCartridgeNum << " certificate...");
					returnValue = m_tagAdapter->GenerateCertificate(aucMaterialInfo, usMaterialInfoLength, aucPrvKS, aucCertificate, &usCertificateLength);
					if (returnValue != IDTLIB_SUCCESS)
					{
						LOG_EXT(LEVEL_ERROR, "Error generating cartridge #"<< (unsigned short)ucCartridgeNum << " certificate (error code 0x" << hex << (short)returnValue << ").");
						return returnValue;
					}

					bool ok;
					LOG_EXT(LEVEL_INFO, "Verifying ID certificate...");
					try
					{
						SetVerifier(m_pubKS);
						ok = m_veriferS->VerifyMessage(aucCertificate, usCertificateLength - SIGNATURE_SIZE, aucCertificate + (usCertificateLength - SIGNATURE_SIZE), SIGNATURE_SIZE);
					}
					catch (exception& e)
					{
						LOG_EXT(LEVEL_ERROR, "Error verifying ID certificate (error code 0x" << hex << (short)returnValue << "): " << e.what() << ".");
						ok = false;
					}

					if (!ok)
					{
						returnValue = INVALID_CERTIFICATE_SIGNATURE;
						LOG_EXT(LEVEL_ERROR, "Error verifying ID certificate (error code 0x" << hex << (short)returnValue << ").");
						return returnValue;
					}
				}

				LOG_EXT(LEVEL_INFO, "Writing certificate into cartridge #"<< (unsigned short)ucCartridgeNum << " ...");
				returnValue = m_tagAdapter->WriteCertificate(aucCertificate, usCertificateLength);
				if (returnValue != IDTLIB_SUCCESS)
				{
					LOG_EXT(LEVEL_ERROR, "Error writing certificate into cartridge #"<< (unsigned short)ucCartridgeNum << " (error code 0x" << hex << (short)returnValue << ").");
					return returnValue;
				}
			}

			LOG_EXT(LEVEL_INFO, "Logging out from cartridge #"<< (unsigned short)ucCartridgeNum << " ...");
			returnValue = m_tagAdapter->Logout();
			if (returnValue != IDTLIB_SUCCESS)
			{
				LOG_EXT(LEVEL_ERROR, "Error logging out from cartridge #"<< (unsigned short)ucCartridgeNum << " (error code 0x" << hex << (short)returnValue << ").");
				return returnValue;
			}

			LOG_EXT(LEVEL_INFO, "Setting ID certificate for cartridge #" << (unsigned short)ucCartridgeNum << " ended successfully.");
			return returnValue;
		}
		catch (exception& e)
		{
			LOG_EXT(LEVEL_ERROR, "Exception caught: " << e.what() << ".");
			return EXCEPTION_CAUGHT;
		}
	}