Commit c2f1720f authored by Matthew Dawson's avatar Matthew Dawson
Browse files

Handle sub objects some.

Sub objects are just random integers in a uint32 array.  Start handling single
objects.  Eventually, multiple object arrays need to be handled, but that
requires adjusting MLObject first.
parent caa722a2
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -542,17 +542,28 @@ public class MatFileReader
                int heapIndex = mcosDataBuf.getInt();

                String propertyName = strs[nameIndex - 1];
                MLArray property;
                switch (flag) {
                    case 0:
                        properties.put(propertyName, new MLChar(propertyName, strs[heapIndex-1]));
                        property = new MLChar(propertyName, strs[heapIndex-1]);
                        break;
                    case 1:
                        properties.put(propertyName, mcosInfo.get(heapIndex+2));
                        property = mcosInfo.get(heapIndex+2);
                        break;
                    case 2:
                        // @todo: Handle a boolean.
                        throw new UnsupportedOperationException("Mat file parsing does not yet support booleans!");
                    default:
                        throw new UnsupportedOperationException("Don't yet support parameter type: " + flag + "!");
                }
                if (property instanceof MLUInt32) {
                    int[][] data = ((MLUInt32) property).getArray();
                    if (data[0][0] == 0xdd000000 && data[1][0] == 0x02 && data[2][0] == 0x01 && data[3][0] == 0x01) {
                        MatMCOSObjectInformation objectInformation = objectInfoList.get(data[4][0] - 1);
                        property = new MLObject(propertyName, classNamesList.get(objectInformation.classId - 1), objectInformation.structure);
                    }
                }
                properties.put(propertyName, property);
            }
            segment4Properties.add(properties);
            mcosDataBuf.position((mcosDataBuf.position() + 0x07) & ~0x07);
+29 −0
Original line number Diff line number Diff line
@@ -7,7 +7,10 @@ import ca.mjdsystems.jmatio.io.MatFileFilter;
import ca.mjdsystems.jmatio.io.MatFileReader;
import ca.mjdsystems.jmatio.io.MatFileType;
import ca.mjdsystems.jmatio.io.SimulinkDecoder;
import ca.mjdsystems.jmatio.types.MLChar;
import ca.mjdsystems.jmatio.types.MLDouble;
import ca.mjdsystems.jmatio.types.MLObject;
import ca.mjdsystems.jmatio.types.MLStructure;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
@@ -40,6 +43,32 @@ public class SimulinkMatTest
        // First check that the root element is correct.
        assertThat(data, is(notNullValue()));
        assertThat(data.getClassName(), is("Data"));
        MLStructure dataO = data.getObject();
        assertThat(dataO.getAllFields().size(), is(10));
        assertThat(((MLChar) dataO.getField("function_name")).getString(0), is("quad_fcn_subtype"));
        assertThat(((MLChar) dataO.getField("function_inputs")).getString(0), is("c,a,b:{x:real|(a=0 => x /= 0) AND (a /= 0 => (x^2) - 4*a*c >= 0)}"));
        assertThat(((MLDouble) dataO.getField("open")).get(0), is(1.0));
        assertThat(((MLDouble) dataO.getField("fig")).get(0), is(notNullValue())); // This can be anything, just not null!
        assertThat(((MLDouble) dataO.getField("multi_mode")).get(0), is(1.0));
        assertThat(((MLDouble) dataO.getField("checked")).get(0), is(0.0));

        // Next, make sure the settings structure came out right.  Not super important, but a good test.
        MLStructure settings = (MLStructure) dataO.getField("settings");
        assertThat(settings.getAllFields().size(), is(5));
        assertThat(((MLDouble) settings.getField("set")).get(0), is(1.0));
        assertThat(((MLDouble) settings.getField("inputs")), is(notNullValue()));
        assertThat(((MLDouble) settings.getField("count")).get(0), is(1000.0));
        assertThat(((MLDouble) settings.getField("range")).get(0), is(100.0));
        assertThat(((MLDouble) settings.getField("except")).get(0), is(0.0));

        // Next, verify Grid2, as it is easiest.
        MLObject Grid2 = (MLObject) dataO.getField("Grid2");
        assertThat(Grid2.getClassName(), is("Grid"));

        System.out.println(Grid2.getObject().getField("cells").contentToString());
        System.out.println(Grid2.getObject().contentToString());


    }

    // This just ensures the SimulinkDecoder actually decodes correctly.