Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import React, { useState } from 'react'
- import TirePressure from "./tuning/TirePressure"
- import Gearing from "./tuning/Gearing"
- import Alignment from "./tuning/Alignment"
- import AntirollBars from './tuning/AntirollBars'
- import Springs from './tuning/Springs'
- import Damping from './tuning/Damping'
- const TuneEditor = () => {
- const [tuneValues, setTuneValues] = useState({
- file: "", fileName: "", error: "",
- tirePressureFront: 35.0, tirePressureRear: 35.0,
- finalDrive: 4.2,
- firstGear: 3.3,
- secondGear: 3.3,
- thirdGear: 3.3,
- fourthGear: 3.3,
- fifthGear: 3.3,
- sixthGear: 3.3,
- seventhGear: 3.3,
- eighthGear: 3.3,
- ninthGear: 3.3,
- tenthGear: 3.3,
- camberFront: 0.0, camberRear: 0.0,
- toeFront: 0.0, toeRear: 0.0,
- caster: 4.0,
- arbsFront: 32.5, arbsRear: 32.5,
- springsFront: 50.0, springsRear: 50.0,
- rideHeightFront: 50.0, rideHeightRear: 50.0,
- reboundFront: 10.0, reboundRear: 10.0,
- bumpFront: 10.0, bumpRear: 10.0,
- })
- const onTuneFileUpload = async (e) => {
- const uploadedFile = e.target.files[0]
- let byteArray = await fileToByteArray(uploadedFile)
- if(byteArray.length === 378) {
- setTuneValues({
- ...tuneValues,
- file: byteArray, fileName: uploadedFile.name,
- tirePressureFront: getValue(byteArray, 242, 15.0, 40.0, 10.0),
- tirePressureRear: getValue(byteArray, 286, 15.0, 40.0, 10.0),
- //finalDrive: getValue(byteArray, 202, 0.48, 5.52, 100.0),
- //firstGear: getValue(byteArray, 338, 0.48, 5.52, 100.0),
- //secondGear: getValue(byteArray, 342, 0.48, 5.52, 100.0),
- //thirdGear: getValue(byteArray, 346, 0.48, 5.52, 100.0),
- //fourthGear: getValue(byteArray, 350, 0.48, 5.52, 100.0),
- //fifthGear: getValue(byteArray, 354, 0.48, 5.52, 100.0),
- //sixthGear: getValue(byteArray, 358, 0.48, 5.52, 100.0),
- //seventhGear: getValue(byteArray, 362, 0.48, 5.52, 100.0),
- //eighthGear: getValue(byteArray, 366, 0.48, 5.52, 100.0),
- //ninthGear: getValue(byteArray, 370, 0.48, 5.52, 100.0),
- //tenthGear: getValue(byteArray, 374, 0.48, 5.52, 100.0),
- //camberFront: getNegValue(byteArray, 246),
- //camberRear: getNegValue(byteArray, 290),
- //toeFront: getNegValue(byteArray, 250),
- //toeRear: getNegValue(byteArray, 294),
- //caster: getValue(byteArray, 254, 1.0, 6.0, 100.0),
- arbsFront: getValue(byteArray, 262, 1.0, 64.0, 10.0),
- arbsRear: getValue(byteArray, 262, 1.0, 64.0, 10.0),
- springsFront:getOther(byteArray, 258, 100),
- springsRear: getOther(byteArray, 302, 100),
- rideHeightFront:getOther(byteArray, 266, 100),
- rideHeightRear: getOther(byteArray, 310, 100),
- //reboundFront: getValue(byteArray, 274, 1.0, 19.0, 10.0),
- //reboundRear: getValue(byteArray, 318, 1.0, 19.0, 10.0),
- //bumpFront: getValue(byteArray, 270, 1.0, 19.0, 10.0),
- //bumpRear: getValue(byteArray, 314, 1.0, 19.0, 10.0),
- })
- } else {
- setTuneValues({...tuneValues, error: "File is not 378 bytes."})
- }
- }
- function downloadFile() {
- setValue(242, tuneValues.tirePressureFront, 15.0, 40.0)
- setValue(286, tuneValues.tirePressureRear, 15.0, 40.0)
- setValue(202, tuneValues.finalDrive, 2.2, 3.9)
- setValue(338, tuneValues.firstGear, 0.48, 5.52)
- setValue(342, tuneValues.secondGear, 0.48, 5.52)
- setValue(346, tuneValues.thirdGear, 0.48, 5.52)
- setValue(350, tuneValues.fourthGear, 0.48, 5.52)
- setValue(354, tuneValues.fifthGear, 0.48, 5.52)
- setValue(358, tuneValues.sixthGear, 0.48, 5.52)
- setValue(362, tuneValues.seventhGear, 0.48, 5.52)
- setValue(366, tuneValues.eighthGear, 0.48, 5.52)
- setValue(370, tuneValues.ninthGear, 0.48, 5.52)
- setValue(374, tuneValues.tenthGear, 0.48, 5.52)
- setValue(246, tuneValues.camberFront, -5.0, 10.0)
- setValue(290, tuneValues.camberRear, -5.0, 10.0)
- setValue(250, tuneValues.toeFront, -5.0, 10.0)
- setValue(294, tuneValues.toeRear, -5.0, 10.0)
- setValue(254, tuneValues.caster, 1.0, 6.0)
- setValue(262, tuneValues.arbsFront, 1.0, 64.0)
- setValue(306, tuneValues.arbsRear, 1.0, 64.0)
- setValue(258, tuneValues.springsFront, 0, 100)
- setValue(302, tuneValues.springsRear, 0, 100)
- setValue(266, tuneValues.rideHeightFront, 0, 100)
- setValue(310, tuneValues.rideHeightRear, 0, 100)
- setValue(274, tuneValues.reboundFront, 1.0, 19.0)
- setValue(318, tuneValues.reboundRear, 1.0, 19.0)
- setValue(270, tuneValues.bumpFront, 1.0, 19.0)
- setValue(314, tuneValues.bumpRear, 1.0, 19.0)
- let element = document.createElement('a')
- element.href = window.URL.createObjectURL(new Blob([new Uint8Array(tuneValues.file)], {type: 'application/octet-stream'}))
- element.download = tuneValues.fileName
- element.style.display = 'none'
- document.body.appendChild(element)
- element.click()
- document.body.removeChild(element)
- }
- const onSliderChange = (e) => setTuneValues({ ...tuneValues, [e.target.id]: e.target.value })
- function setValue(start, tuneValue, min, range) {
- const reversedValue = (tuneValue - min) / range
- const f = new Float32Array(1)
- f[0] = reversedValue
- const array = new Int8Array(f.buffer)
- const tuneArray = tuneValues.file
- tuneArray[start] = array[0]
- tuneArray[start + 1] = array[1]
- tuneArray[start + 2] = array[2]
- tuneArray[start + 3] = array[3]
- setTuneValues({ ...tuneValues, file: tuneArray })
- }
- function getValue(byteArray, start, min, range, round) {
- const arr = byteArray.slice(start, start + 4)
- const floatArr = new Float32Array(new Uint8Array(arr).buffer)[0]
- return Math.round((floatArr * range + min) * round) / round
- }
- function getOther(byteArray, start, other){
- const arr = byteArray.slice(start, start + 4)
- const floatArr = new Float32Array(new Uint8Array(arr).buffer)[0]
- return Math.round((floatArr * other) * 100) / 100
- }
- function getNegValue(byteArray, start) {
- const arr = byteArray.slice(start, start + 4)
- const floatArr = new Float32Array(new Uint8Array(arr).buffer)[0]
- const result = (floatArr * 10.0) + (-5.0)
- if(result < 0) {
- return (Math.round(result * -10.0) / -10.0);
- } else {
- return Math.round(result * 10.0) / 10.0;
- }
- }
- function fileToByteArray(file) {
- return new Promise((resolve, reject) => {
- try {
- let reader = new FileReader()
- let fileByteArray = []
- reader.readAsArrayBuffer(file)
- reader.onloadend = (evt) => {
- if (evt.target.readyState === FileReader.DONE) {
- let arrayBuffer = evt.target.result,
- array = new Uint8Array(arrayBuffer)
- for (let byte of array) {
- fileByteArray.push(byte)
- }
- }
- resolve(fileByteArray)
- }
- }
- catch (e) {
- reject(e)
- }
- })
- }
- return (
- <div>
- <section>
- <h1>Upload Tune File</h1>
- <p>All values will be saved when you click download.</p>
- <input onChange={onTuneFileUpload} type="file" />
- <p style={{color: "red"}}>{tuneValues.error}</p>
- <br/>
- </section>
- <TirePressure onSliderChange={onSliderChange} tuneValues={tuneValues} />
- <Gearing onSliderChange={onSliderChange} tuneValues={tuneValues} />
- <Alignment onSliderChange={onSliderChange} tuneValues={tuneValues} />
- <AntirollBars onSliderChange={onSliderChange} tuneValues={tuneValues} />
- <Springs onSliderChange={onSliderChange} tuneValues={tuneValues} />
- <Damping onSliderChange={onSliderChange} tuneValues={tuneValues} />
- <section>
- <h1>Finish</h1>
- <p>Replace the file you uploaded with the file downloaded here. Make sure the file name is exactly the same,
- remove any trailing text like `_1` or `(1)`. Microsoft tune files have NO extension, steam tune files will end in .Data
- </p>
- <input type="button" onClick={downloadFile} value="Download" />
- <br />
- </section>
- </div>
- )
- }
- export default TuneEditor
Advertisement
Add Comment
Please, Sign In to add comment