GeekyDeaks / sim-to-motec

Simple scripts to convert sim telemetry to MoTeC i2 log files
37 stars 5 forks source link

Camber AMS2 #11

Open adrianozanetti1978 opened 7 months ago

adrianozanetti1978 commented 7 months ago

Is there no possibility of an update yet, bringing camber data extraction to AM2?

GeekyDeaks commented 6 months ago

Hi! Sorry, missed this one. I don't see camber reported in the shared memory. If you can you identify it, please let me know the variable name and I'll add it.

adrianozanetti1978 commented 6 months ago

value and memory and camber

Camber: 1.3125410092129641e-08 memory: 845250090

adrianozanetti1978 commented 6 months ago

<?xml version="1.0" encoding="utf-8"?>

0 "No description" Float
AMS2AVX.exe+2628F8C
1 "No description" Float
AMS2AVX.exe+2628FDC
2 "No description" Float
AMS2AVX.exe+262902C
3 "No description" Float
AMS2AVX.exe+262907C
adrianozanetti1978 commented 6 months ago

cambagem.txt

GeekyDeaks commented 6 months ago

ah, you are getting the values directly from the game memory. Unfortunately, the current approach is using the shared memory only. If I get time I might look at how it could be done, but do you know if that location is likely to change if the game is updated?

adrianozanetti1978 commented 6 months ago

Yes, I'm using a project I made, very easy to use to extract this data, if you have time I can help you test it. If it doesn't take up your time...

adrianozanetti1978 commented 6 months ago

import ctypes import psutil import time

Busca o PID do processo do jogo Automobilista 2 pelo nome do executável

for processo in psutil.process_iter(['pid', 'name']): if processo.info['name'] == 'AMS2AVX.exe': AMS2AVX_PID = processo.info['pid'] break else: raise RuntimeError("Processo AMS2AVX.exe não encontrado")

Abre o processo do jogo

processo = ctypes.windll.kernel32.OpenProcess(0x10, False, AMS2AVX_PID)

if processo:

Endereço da memória a ser lido

endereco = 169345024

# Buffer para armazenar os dados lidos
buffer = ctypes.c_int()

# Leitura da memória
ctypes.windll.kernel32.ReadProcessMemory(processo, endereco, ctypes.byref(buffer), ctypes.sizeof(buffer), None)

# Valor lido
valor = buffer.value

print("Valor lido:", valor)

# Fecha o processo
ctypes.windll.kernel32.CloseHandle(processo)

else: print("Não foi possível abrir o processo do jogo.")

Função para ler o valor do camber da memória do jogo

def ler_camber(pid, endereco): processo = ctypes.windll.kernel32.OpenProcess(0x10, False, pid) if processo: valor_camber = ctypes.c_float() ctypes.windll.kernel32.ReadProcessMemory(processo, endereco, ctypes.byref(valor_camber), ctypes.sizeof(valor_camber), None) ctypes.windll.kernel32.CloseHandle(processo) return valor_camber.value else: print("Não foi possível abrir o processo do jogo.") return None

Função para ler o valor da cambagem de uma roda da memória do jogo

def ler_cambagem(pid, endereco): processo = ctypes.windll.kernel32.OpenProcess(0x10, False, pid) if processo: valor_cambagem = ctypes.c_float() endereco_c = ctypes.cast(endereco, ctypes.POINTER(ctypes.c_void_p)) ctypes.windll.kernel32.ReadProcessMemory(processo, endereco_c, ctypes.byref(valor_cambagem), ctypes.sizeof(valor_cambagem), None) ctypes.windll.kernel32.CloseHandle(processo) return valor_cambagem.value else: print("Não foi possível abrir o processo do jogo.") return None

PID do processo do jogo Automobilista 2

AMS2_PID = AMS2AVX_PID # Substitua 1234 pelo PID real do Automobilista 2

Endereço da memória onde o valor do camber está armazenado (em formato hexadecimal)

endereco_camber = 169345024 # Substitua pelo endereço real (em hexadecimal)

Endereços de memória onde os valores de cambagem das rodas estão armazenados

endereco_cambagem_dianteira_esquerda = int("0x142628F8C", 16) # Substitua pelo endereço real endereco_cambagem_dianteira_direita = int("142628FDC", 16) # Substitua pelo endereço real endereco_cambagem_traseira_esquerda = int("14262902C", 16) # Substitua pelo endereço real endereco_cambagem_traseira_direita = int("14262907C", 16) # Substitua pelo endereço real

Loop para ler continuamente os valores de cambagem das quatro rodas

while True: cambagem_dianteira_esquerda = ler_cambagem(AMS2_PID, endereco_cambagem_dianteira_esquerda) cambagem_dianteira_direita = ler_cambagem(AMS2_PID, endereco_cambagem_dianteira_direita) cambagem_traseira_esquerda = ler_cambagem(AMS2_PID, endereco_cambagem_traseira_esquerda) cambagem_traseira_direita = ler_cambagem(AMS2_PID, endereco_cambagem_traseira_direita)

if None not in [cambagem_dianteira_esquerda, cambagem_dianteira_direita, cambagem_traseira_esquerda,
                cambagem_traseira_direita]:
    print("Cambagem Dianteira Esquerda:", cambagem_dianteira_esquerda)
    print("Cambagem Dianteira Direita:", cambagem_dianteira_direita)
    print("Cambagem Traseira Esquerda:", cambagem_traseira_esquerda)
    print("Cambagem Traseira Direita:", cambagem_traseira_direita)

time.sleep(1)  # Aguarda 1 segundo antes de ler novamente (pode ajustar conforme necessário)
break