├── .gitattributes ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .gitlab-ci.yml ├── CONTRIBUTING.md ├── Images ├── 2-mass-spring-damper.gif ├── FBDMultipleMSD.png ├── TestedWith.json ├── doubleMSDFreeBodyDiagram.png ├── image_0.png ├── image_1.png ├── image_2.png ├── image_3.png ├── image_4.gif ├── image_5.gif ├── image_6.png ├── image_7.png ├── image_8.png ├── mass_spring_damper_FBD.png └── mass_spring_damper_double_FBD.png ├── InstructorResources └── Solutions │ ├── doubleMassSpringDamperSoln.mlx │ ├── massSpringDamperSoln.mlx │ ├── mfbDoubleSoln.slx │ ├── mfbSoln.slx │ ├── msdDoubleSoln.slx │ ├── msdDoubleVectorizedSoln.slx │ ├── msdMultipleBuildingSoln.slx │ ├── msdMultipleFreqSoln.slx │ ├── msdMultipleSoln.slx │ ├── msdSoln.slx │ ├── msdTuneSoln.slx │ └── multipleMassSpringDamperSoln.mlx ├── LICENSE.md ├── MainMenu.mlx ├── Models ├── mfb.slx ├── mfbDouble.slx ├── msd.slx ├── msdDouble.slx ├── msdDoubleBuilding.slx ├── msdDoubleSimulationOutput.slx ├── msdDoubleVectorized.slx ├── msdMultiple.slx ├── msdMultipleBuilding.slx ├── msdMultipleFreq.slx ├── msdSimulationOutput.slx └── msdTune.slx ├── README.md ├── README.mlx ├── SECURITY.md ├── Scripts ├── doubleMassSpringDamper.mlx ├── massSpringDamper.mlx └── multipleMassSpringDamper.mlx ├── SoftwareTests ├── CheckTestResults.m ├── FunctionTests.m ├── PostFiles │ ├── PostdoubleMassSpringDamper.m │ ├── PostdoubleMassSpringDamperSoln.m │ ├── PostmassSpringDamper.m │ ├── PostmassSpringDamperSoln.m │ ├── PostmultipleMassSpringDamper.m │ └── PostmultipleMassSpringDamperSoln.m ├── PostSmokeTest.m ├── PreFiles │ ├── PredoubleMassSpringDamper.m │ ├── PredoubleMassSpringDamperSoln.m │ ├── PremassSpringDamper.m │ ├── PremassSpringDamperSoln.m │ ├── PremultipleMassSpringDamper.m │ └── PremultipleMassSpringDamperSoln.m ├── RunAllTests.m ├── SmokeTests.m └── SolnSmokeTests.m ├── Utilities ├── ProjectShutdown.m ├── ProjectStartupApp.m └── SurveyLinks.mat ├── mass-spring-damper-systems.prj └── resources └── project ├── -Rce9Lxzt4v7MmBOh-k5NnO_YJM ├── -OLaEciJ4exkuNHkJ0eyeQpFOc4d.xml ├── -OLaEciJ4exkuNHkJ0eyeQpFOc4p.xml ├── 0ZI8NNhIdsg53JnT5HgIM_J61IEd.xml ├── 0ZI8NNhIdsg53JnT5HgIM_J61IEp.xml ├── 3PbMH_ST3q7EmnLBfhgZS9iFdAwd.xml ├── 3PbMH_ST3q7EmnLBfhgZS9iFdAwp.xml ├── AjF9vpML2MtUS5jPkikGlyWknD4d.xml ├── AjF9vpML2MtUS5jPkikGlyWknD4p.xml ├── C6Hgjb0cz76iCmA23O7A5TFVHVEd.xml ├── C6Hgjb0cz76iCmA23O7A5TFVHVEp.xml ├── DCf2H7_WFdnhTYVpihBlMN90nmsd.xml ├── DCf2H7_WFdnhTYVpihBlMN90nmsp.xml ├── FyaTa5jAbbNpTXx8meWki5KFjkId.xml ├── FyaTa5jAbbNpTXx8meWki5KFjkIp.xml ├── Wfr926a1NH8qeQNRXVyup0dVoPsd.xml ├── Wfr926a1NH8qeQNRXVyup0dVoPsp.xml ├── brVh4EtQ-p1f3df7U5taXWEcDU8d.xml ├── brVh4EtQ-p1f3df7U5taXWEcDU8p.xml ├── eoVw5pfVJKGzqfBb47i23v6v-Ggd.xml ├── eoVw5pfVJKGzqfBb47i23v6v-Ggp.xml ├── jYsB6lESBHIrKkzzr0ZhoLpQzw8d.xml ├── jYsB6lESBHIrKkzzr0ZhoLpQzw8p.xml ├── tUt9ouxSp3y7kvoau8MZqEcBlikd.xml ├── tUt9ouxSp3y7kvoau8MZqEcBlikp.xml ├── xScl1psOnyi_pOx_5i_OZOmWjucd.xml └── xScl1psOnyi_pOx_5i_OZOmWjucp.xml ├── EEtUlUb-dLAdf0KpMVivaUlztwA ├── 8stDomWIqQnxJ259v3Ppp4ge0uod.xml ├── 8stDomWIqQnxJ259v3Ppp4ge0uop.xml ├── OqDwzo8DHV6DsCE-krhhwqEonckd.xml ├── OqDwzo8DHV6DsCE-krhhwqEonckp.xml ├── kcCplvrFGG5bIahzBDhjTbLQWE4d.xml ├── kcCplvrFGG5bIahzBDhjTbLQWE4p.xml ├── nyGKSyKL9_WtSG-rJHFV22U0good.xml ├── nyGKSyKL9_WtSG-rJHFV22U0goop.xml ├── sq6NlRukLgeFWAYwTUNRn-0VgqYd.xml ├── sq6NlRukLgeFWAYwTUNRn-0VgqYp.xml ├── tRVv4yUvvjpUU-gPGFyFh_PCezUd.xml └── tRVv4yUvvjpUU-gPGFyFh_PCezUp.xml ├── KAXfQgCar2Yb8zOxgvf9hdmLP1E ├── ZzMM06Xgxh2tESY16NWxjQ4EyKkd.xml ├── ZzMM06Xgxh2tESY16NWxjQ4EyKkp.xml ├── xuq8kAyX4N3Ux9AajkBdbZJJF9kd.xml └── xuq8kAyX4N3Ux9AajkBdbZJJF9kp.xml ├── NjSPEMsIuLUyIpr2u1Js5bVPsOs ├── 2kj09UetkV_lru3gvSPXnY6-nM4d.xml ├── 2kj09UetkV_lru3gvSPXnY6-nM4p.xml ├── KKyDJtbdIBOlaeHmIZd5VX6vqx8d.xml ├── KKyDJtbdIBOlaeHmIZd5VX6vqx8p.xml ├── QWNDYJD5mGW1bWYvPx9DtKnxzw4d.xml ├── QWNDYJD5mGW1bWYvPx9DtKnxzw4p.xml ├── R1RggVhA72agIvELiuhWPRS8F0Id.xml ├── R1RggVhA72agIvELiuhWPRS8F0Ip.xml ├── aEHSZBIY-yve10yGis12Zr5DLZod.xml ├── aEHSZBIY-yve10yGis12Zr5DLZop.xml ├── j4xwF_j8iFTVayUMfxLgMnTbencd.xml ├── j4xwF_j8iFTVayUMfxLgMnTbencp.xml ├── r8LR4nLmg9ai3oHrW1r_-KocQzkd.xml └── r8LR4nLmg9ai3oHrW1r_-KocQzkp.xml ├── Project.xml ├── WZRuNzqc-Db7NcQAZO8Y-R8U9cc ├── 66WgGCcF5RIH9MCEgPmgjZK9k3Ud.xml ├── 66WgGCcF5RIH9MCEgPmgjZK9k3Up.xml ├── AtMjXDrOSm8YDv3_4UFXiyrWqNEd.xml └── AtMjXDrOSm8YDv3_4UFXiyrWqNEp.xml ├── ZN2RlSIbyWXhOxbxxI4hOawbMD4 ├── p5HYYVUpTuYgZwnT8QkkzaoJraUd.xml ├── p5HYYVUpTuYgZwnT8QkkzaoJraUp.xml ├── q4FWbcu8zEbneDjWzNwfvfvjQNAd.xml ├── q4FWbcu8zEbneDjWzNwfvfvjQNAp.xml ├── s-04wUzHjOhlMa1CW_zpJwm8iDMd.xml └── s-04wUzHjOhlMa1CW_zpJwm8iDMp.xml ├── ZdVxxv9BsNz7MGUxtEc6Pq3qh1M ├── QOpe-1pctdftDIjwQLRdjOUZW44d.xml ├── QOpe-1pctdftDIjwQLRdjOUZW44p.xml ├── dFZtimQ9hMsf8Y7-kStpE8jBu80d.xml ├── dFZtimQ9hMsf8Y7-kStpE8jBu80p.xml ├── t3jqKQJuC1eDmZQqzo6s1diJhS0d.xml ├── t3jqKQJuC1eDmZQqzo6s1diJhS0p.xml ├── vN8C5ylrq15h-Ufo3qE9IU00IHcd.xml └── vN8C5ylrq15h-Ufo3qE9IU00IHcp.xml ├── fjRQtWiSIy7hIlj-Kmk87M7s21k ├── NjSPEMsIuLUyIpr2u1Js5bVPsOsd.xml └── NjSPEMsIuLUyIpr2u1Js5bVPsOsp.xml ├── iMwdHOXOBiBXhnA_li8gtEJVTjc ├── RMvf4mEDuznAOqU6SKNmIWErfxgd.xml ├── RMvf4mEDuznAOqU6SKNmIWErfxgp.xml ├── ZTr3GAe6p03ZVs2FdKKE0JsiFMQd.xml ├── ZTr3GAe6p03ZVs2FdKKE0JsiFMQp.xml ├── pidCgrPVf6RHNdoMyruVfScHpF8d.xml ├── pidCgrPVf6RHNdoMyruVfScHpF8p.xml ├── uIbyU9dPEHKvxjdwx5pD9PDDCZYd.xml └── uIbyU9dPEHKvxjdwx5pD9PDDCZYp.xml ├── qaw0eS1zuuY1ar9TdPn1GMfrjbQ ├── -Rce9Lxzt4v7MmBOh-k5NnO_YJMd.xml ├── -Rce9Lxzt4v7MmBOh-k5NnO_YJMp.xml ├── KocSmEw1PpelhlG7ZNeMUdHVtywd.xml ├── KocSmEw1PpelhlG7ZNeMUdHVtywp.xml ├── QMJD9OLFzxcTTbPOoh-ahQ4zTRUd.xml ├── QMJD9OLFzxcTTbPOoh-ahQ4zTRUp.xml ├── R0IsxKENiOKovWZXASFjrmpbBCYd.xml ├── R0IsxKENiOKovWZXASFjrmpbBCYp.xml ├── TMK4UzWHdRLhy_w-CHt9y11Q8XAd.xml ├── TMK4UzWHdRLhy_w-CHt9y11Q8XAp.xml ├── ZN2RlSIbyWXhOxbxxI4hOawbMD4d.xml ├── ZN2RlSIbyWXhOxbxxI4hOawbMD4p.xml ├── ZdVxxv9BsNz7MGUxtEc6Pq3qh1Md.xml ├── ZdVxxv9BsNz7MGUxtEc6Pq3qh1Mp.xml ├── iMwdHOXOBiBXhnA_li8gtEJVTjcd.xml ├── iMwdHOXOBiBXhnA_li8gtEJVTjcp.xml ├── qD-kr16wmwlzR-nIg1IG_vvRrWkd.xml ├── qD-kr16wmwlzR-nIg1IG_vvRrWkp.xml ├── rh0jHbNfmojECiiHH7BQHmZTsWkd.xml ├── rh0jHbNfmojECiiHH7BQHmZTsWkp.xml ├── rnpMu7jn2QWt_rQcz8FJ-MxGzVId.xml ├── rnpMu7jn2QWt_rQcz8FJ-MxGzVIp.xml ├── trBOSMFt-ZFz0tI8PrpBhVjGM5Md.xml └── trBOSMFt-ZFz0tI8PrpBhVjGM5Mp.xml ├── root ├── 6x1BhZX_fLnKpcwqra0qFwv1jIgp.xml ├── EEtUlUb-dLAdf0KpMVivaUlztwAp.xml ├── GiiBklLgTxteCEmomM8RCvWT0nQd.xml ├── GiiBklLgTxteCEmomM8RCvWT0nQp.xml ├── KAXfQgCar2Yb8zOxgvf9hdmLP1Ep.xml ├── NmGqIpAwUJcXFyLjFAGnU9uyN5Yp.xml ├── WZRuNzqc-Db7NcQAZO8Y-R8U9ccp.xml ├── fjRQtWiSIy7hIlj-Kmk87M7s21kp.xml └── qaw0eS1zuuY1ar9TdPn1GMfrjbQp.xml ├── rootp.xml └── uuid-bc8f52a4-b1b1-4d4c-9d13-bc3896bf2f25.xml /.gitattributes: -------------------------------------------------------------------------------- 1 | *.fig binary 2 | *.mat binary 3 | *.mdl binary diff merge=mlAutoMerge 4 | *.mdlp binary 5 | *.mexa64 binary 6 | *.mexw64 binary 7 | *.mexmaci64 binary 8 | *.mlapp binary linguist-language=MATLAB 9 | *.mldatx binary 10 | *.mlproj binary 11 | *.mlx binary merge=mlAutoMerge linguist-language=MATLAB 12 | *.p binary 13 | *.sfx binary 14 | *.sldd binary 15 | *.slreqx binary merge=mlAutoMerge 16 | *.slmx binary merge=mlAutoMerge 17 | *.sltx binary 18 | *.slxc binary 19 | *.slx binary merge=mlAutoMerge linguist-language=Simulink 20 | *.slxp binary 21 | 22 | ## Other common binary file types 23 | *.docx binary 24 | *.exe binary 25 | *.jpg binary 26 | *.pdf binary 27 | *.png binary 28 | *.xlsx binary 29 | 30 | # Ignore HTML 31 | 32 | *.html linguist-detectable=false 33 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: MATLAB Build 2 | 3 | # Controls when the action will run. 4 | on: 5 | push: 6 | branches: [ release ] 7 | pull_request: 8 | branches: [ release ] 9 | workflow_dispatch: 10 | 11 | # Add permission to write GitHub pages 12 | permissions: 13 | contents: write 14 | pages: write 15 | id-token: write 16 | 17 | jobs: 18 | test: 19 | strategy: 20 | fail-fast: false 21 | matrix: 22 | MATLABVersion: [R2024a,R2024b] 23 | runs-on: ubuntu-latest 24 | steps: 25 | # Checks-out your repository 26 | - uses: actions/checkout@v4 27 | 28 | # Sets up a display server 29 | - name: Start display server 30 | if: ${{ always() }} 31 | run: | 32 | sudo apt-get install xvfb 33 | Xvfb :99 & 34 | echo "DISPLAY=:99" >> $GITHUB_ENV 35 | 36 | # Sets up MATLAB 37 | - name: Setup MATLAB 38 | uses: matlab-actions/setup-matlab@v2 39 | with: 40 | release: ${{ matrix.MATLABVersion }} 41 | products: Simulink Symbolic_Math_Toolbox 42 | 43 | 44 | # Run all the tests 45 | - name: Run SmokeTests 46 | uses: matlab-actions/run-command@v2 47 | with: 48 | command: openProject(pwd); RunAllTests; 49 | 50 | # Upload the test results as artifact 51 | - name: Upload TestResults 52 | if: ${{ always() }} 53 | uses: actions/upload-artifact@v4 54 | with: 55 | name: TestResults_${{ matrix.MATLABVersion }} 56 | path: ./public/* 57 | overwrite: true 58 | 59 | badge: 60 | if: ${{ always() }} 61 | needs: [test] 62 | strategy: 63 | fail-fast: false 64 | runs-on: ubuntu-latest 65 | steps: 66 | 67 | # Checks-out your repository 68 | - uses: actions/checkout@v4 69 | 70 | # Sets up R2023b 71 | - name: Setup MATLAB 72 | uses: matlab-actions/setup-matlab@v2 73 | with: 74 | release: R2024b 75 | 76 | # Download the test results from artifact 77 | - name: Download All TestResults 78 | uses: actions/download-artifact@v4 79 | with: 80 | path: public 81 | pattern: TestResults_* 82 | merge-multiple: true 83 | 84 | # Create the test results badge 85 | - name: Run PostSmokeTest 86 | uses: matlab-actions/run-command@v2 87 | with: 88 | command: openProject(pwd); PostSmokeTest; 89 | 90 | # Deploy reports to GitHub pages 91 | - name: Setup Pages 92 | uses: actions/configure-pages@v5 93 | - name: Upload pages artifact 94 | uses: actions/upload-pages-artifact@v3 95 | with: 96 | path: public 97 | - name: Deploy to GitHub Pages 98 | id: deployment 99 | uses: actions/deploy-pages@v4 100 | 101 | # Commit the JSON for the MATLAB releases badge 102 | - name: Commit changed files 103 | continue-on-error: true 104 | run: | 105 | git config user.name "${{ github.workflow }} by ${{ github.actor }}" 106 | git config user.email "<>" 107 | git pull 108 | git add Images/TestedWith.json 109 | git commit Images/TestedWith.json -m "Update CI badges ${{ github.ref_name }}" 110 | git fetch 111 | git push 112 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # List of untracked files to ignore 2 | 3 | # Autosave files 4 | *.asv 5 | *.m~ 6 | *.autosave 7 | *.slx.r* 8 | *.mdl.r* 9 | 10 | # MATLAB Drive 11 | *.MATLABDriveTag 12 | 13 | # Compiled files 14 | *.mex* 15 | *.p 16 | 17 | # Compressed files 18 | *.zip 19 | 20 | # Packaged app and toolbox files 21 | *.mlappinstall 22 | *.mltbx 23 | 24 | # Deployable archives 25 | *.ctf 26 | 27 | # Generated helpsearch folders 28 | helpsearch*/ 29 | 30 | # Defined Simulink cache folder 31 | Utilities/SimulinkCache/* 32 | 33 | # Standard code generation folders 34 | slprj/ 35 | sccprj/ 36 | codegen/ 37 | 38 | # Code generation file 39 | *.eep 40 | *.elf 41 | *.hex 42 | *.bin 43 | 44 | # Cache files 45 | *.slxc 46 | 47 | # Project settings 48 | Utilities/ProjectSettings.mat 49 | 50 | # GitLab page folder 51 | public/ -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | stages: 2 | # Set up two testing paths 3 | - setup 4 | - test 5 | - deploy 6 | - release 7 | 8 | setup-job: 9 | tags: 10 | - matlab 11 | stage: setup 12 | script: 13 | - cd .. 14 | - if (test-path utilities) { rm -r -force utilities } 15 | - git clone git@insidelabs-git.mathworks.com:modular-curriculum-content/utilities.git 16 | - cd $CI_PROJECT_NAME 17 | allow_failure: false 18 | 19 | 20 | smoke-test: 21 | # Smoke tests should run all the time 22 | tags: 23 | # Add additional tags like (e.g. - arduino) as required 24 | # Make sure that the runner you plan to use matches the tags 25 | - matlab 26 | stage: test 27 | parallel: 28 | matrix: 29 | - VERSION: [R2024a,R2024b] 30 | script: 31 | - Set-Alias -Name matlab -Value "C:\Program Files\MATLAB\$VERSION\bin\matlab.exe" 32 | - matlab -batch "openProject(pwd);RunAllTests" 33 | when: always 34 | allow_failure: true 35 | artifacts: 36 | name: "$VERSION" 37 | paths: 38 | - public/* 39 | when: always 40 | 41 | 42 | pages: 43 | tags: 44 | - matlab 45 | stage: deploy 46 | script: 47 | - matlab -batch "openProject(pwd);PostSmokeTest;" 48 | artifacts: 49 | paths: 50 | - public 51 | 52 | file-test: 53 | tags: 54 | - matlab 55 | stage: release 56 | script: 57 | - matlab -batch "proj = openProject(pwd); 58 | addpath(proj.RootFolder+'/InternalFiles/Tests/CI'); 59 | results = runtests('OpenCloseFileTest.m'); 60 | disp(table(results)); assertSuccess(results);" 61 | rules: 62 | # This test should always run when merging to main 63 | # And be available for manual running on any push 64 | - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH 65 | when: always 66 | - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH 67 | when: manual 68 | allow_failure: true 69 | 70 | release-testing: 71 | tags: 72 | - matlab 73 | stage: release 74 | script: 75 | - matlab -batch "proj = openProject(pwd); 76 | cd ..; 77 | addpath(genpath(fullfile('utilities','TestingResources'))); 78 | addpath(genpath(fullfile('utilities','Tools'))); 79 | runCMTests" 80 | rules: 81 | # This test should always run when merging to main 82 | # And be available for manual running on any push 83 | - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH 84 | when: always 85 | - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH 86 | when: manual 87 | allow_failure: true 88 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | >_If you believe you have discovered a security vulnerability, please **do not** open an issue or make a pull request. Follow the instructions in the [SECURITY.md](SECURITY.md) file in this repository._ 4 | 5 | Thank you for your interest in contributing to a MathWorks repository! We encourage contributions large and small to this repository. 6 | 7 | **Contributions do not have to be code!** If you see a way to explain things more clearly or a great example of how to use something, please contribute it (or a link to your content). We welcome issues even if you don't code the solution. We also welcome pull requests to resolve issues that we haven't gotten to yet! 8 | 9 | ## How to give feedback 10 | * **Send us an email:** Contact the [MathWorks teaching resources team.](mailto:onlineteaching@mathworks.com) 11 | * **Open an issue:** Start by [creating an issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/creating-an-issue) in the repository that you're interested in. That will start a conversation with the maintainer. When you are creating a bug report, please include as many details as possible. Please remember that other people do not have your background or understanding of the issue; make sure you are clear and complete in your description. 12 | 13 | ## How to contribute to the repository 14 | * **Work in your own public fork:** If you choose to make a contribution, you should [fork the repository](https://docs.github.com/en/get-started/quickstart/fork-a-repo). This creates an editable copy on GitHub where you can write, test, and refine your changes. We suggest that you keep your changes small and focused on the issue you submitted. 15 | * **Sign a Contributor License Agreement (CLA):** We require that all outside contributors sign a [CLA](https://en.wikipedia.org/wiki/Contributor_License_Agreement) before we can accept your contribution. When you create a pull request (see below), we'll reach out to you if you do not already have one on file. Essentially, the CLA gives us permission to publish your contribution as part of the repository. 16 | * **Make a pull request:** "[Pull Request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests)" is a confusing term, but it means exactly what it says: You're requesting that the maintainers of the repository pull your changes in. If you don't have a CLA on file, we'll reach out to you. Your contribution will be reviewed, and we may ask you to revise your pull request based on our feedback. Once everyone is satisfied, we'll merge your pull request into the repository. 17 | 18 | ## Guidelines 19 | 20 | We don't have best practices for writing MATLAB® code, but we do have some recommendations: 21 | 22 | * You should not have any warnings or errors in the [code analyzer report](http://www.mathworks.com/help/matlab/matlab_prog/matlab-code-analyzer-report.html) 23 | * [Loren Shure's blog](https://blogs.mathworks.com/loren) has [great advice on improving your MATLAB code](https://blogs.mathworks.com/loren/category/best-practice/) 24 | * Examples should be written as [live scripts](https://www.mathworks.com/help/matlab/matlab_prog/what-is-a-live-script-or-function.html) or [Simulink® models](https://www.mathworks.com/help/simulink/index.html). 25 | * We adhere to the [CommonMark](https://commonmark.org/) specification where it does not conflict with GitHub rendering. If you edit your Markdown in Visual Studio Code or a similar editor, it uses [markdownlint](https://github.com/DavidAnson/markdownlint) to highlight issues in your Markdown. 26 | 27 | **Again, thanks for contributing, and we look forward to your issues and pull requests!** 28 | -------------------------------------------------------------------------------- /Images/2-mass-spring-damper.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/2-mass-spring-damper.gif -------------------------------------------------------------------------------- /Images/FBDMultipleMSD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/FBDMultipleMSD.png -------------------------------------------------------------------------------- /Images/TestedWith.json: -------------------------------------------------------------------------------- 1 | {"schemaVersion":1,"label":"Test Status","color":"success","message":"R2024a | R2024b"} 2 | -------------------------------------------------------------------------------- /Images/doubleMSDFreeBodyDiagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/doubleMSDFreeBodyDiagram.png -------------------------------------------------------------------------------- /Images/image_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/image_0.png -------------------------------------------------------------------------------- /Images/image_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/image_1.png -------------------------------------------------------------------------------- /Images/image_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/image_2.png -------------------------------------------------------------------------------- /Images/image_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/image_3.png -------------------------------------------------------------------------------- /Images/image_4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/image_4.gif -------------------------------------------------------------------------------- /Images/image_5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/image_5.gif -------------------------------------------------------------------------------- /Images/image_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/image_6.png -------------------------------------------------------------------------------- /Images/image_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/image_7.png -------------------------------------------------------------------------------- /Images/image_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/image_8.png -------------------------------------------------------------------------------- /Images/mass_spring_damper_FBD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/mass_spring_damper_FBD.png -------------------------------------------------------------------------------- /Images/mass_spring_damper_double_FBD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Images/mass_spring_damper_double_FBD.png -------------------------------------------------------------------------------- /InstructorResources/Solutions/doubleMassSpringDamperSoln.mlx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/InstructorResources/Solutions/doubleMassSpringDamperSoln.mlx -------------------------------------------------------------------------------- /InstructorResources/Solutions/massSpringDamperSoln.mlx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/InstructorResources/Solutions/massSpringDamperSoln.mlx -------------------------------------------------------------------------------- /InstructorResources/Solutions/mfbDoubleSoln.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/InstructorResources/Solutions/mfbDoubleSoln.slx -------------------------------------------------------------------------------- /InstructorResources/Solutions/mfbSoln.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/InstructorResources/Solutions/mfbSoln.slx -------------------------------------------------------------------------------- /InstructorResources/Solutions/msdDoubleSoln.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/InstructorResources/Solutions/msdDoubleSoln.slx -------------------------------------------------------------------------------- /InstructorResources/Solutions/msdDoubleVectorizedSoln.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/InstructorResources/Solutions/msdDoubleVectorizedSoln.slx -------------------------------------------------------------------------------- /InstructorResources/Solutions/msdMultipleBuildingSoln.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/InstructorResources/Solutions/msdMultipleBuildingSoln.slx -------------------------------------------------------------------------------- /InstructorResources/Solutions/msdMultipleFreqSoln.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/InstructorResources/Solutions/msdMultipleFreqSoln.slx -------------------------------------------------------------------------------- /InstructorResources/Solutions/msdMultipleSoln.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/InstructorResources/Solutions/msdMultipleSoln.slx -------------------------------------------------------------------------------- /InstructorResources/Solutions/msdSoln.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/InstructorResources/Solutions/msdSoln.slx -------------------------------------------------------------------------------- /InstructorResources/Solutions/msdTuneSoln.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/InstructorResources/Solutions/msdTuneSoln.slx -------------------------------------------------------------------------------- /InstructorResources/Solutions/multipleMassSpringDamperSoln.mlx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/InstructorResources/Solutions/multipleMassSpringDamperSoln.mlx -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2024, The MathWorks, Inc. 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are 6 | met: 7 | 8 | * Redistributions of source code must retain the above copyright 9 | notice, this list of conditions and the following disclaimer. 10 | * Redistributions in binary form must reproduce the above copyright 11 | notice, this list of conditions and the following disclaimer in 12 | the documentation and/or other materials provided with the distribution 13 | * Neither the name of the The MathWorks, Inc. nor the names 14 | of its contributors may be used to endorse or promote products derived 15 | from this software without specific prior written permission. 16 | 17 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 21 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 | POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /MainMenu.mlx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/MainMenu.mlx -------------------------------------------------------------------------------- /Models/mfb.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Models/mfb.slx -------------------------------------------------------------------------------- /Models/mfbDouble.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Models/mfbDouble.slx -------------------------------------------------------------------------------- /Models/msd.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Models/msd.slx -------------------------------------------------------------------------------- /Models/msdDouble.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Models/msdDouble.slx -------------------------------------------------------------------------------- /Models/msdDoubleBuilding.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Models/msdDoubleBuilding.slx -------------------------------------------------------------------------------- /Models/msdDoubleSimulationOutput.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Models/msdDoubleSimulationOutput.slx -------------------------------------------------------------------------------- /Models/msdDoubleVectorized.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Models/msdDoubleVectorized.slx -------------------------------------------------------------------------------- /Models/msdMultiple.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Models/msdMultiple.slx -------------------------------------------------------------------------------- /Models/msdMultipleBuilding.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Models/msdMultipleBuilding.slx -------------------------------------------------------------------------------- /Models/msdMultipleFreq.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Models/msdMultipleFreq.slx -------------------------------------------------------------------------------- /Models/msdSimulationOutput.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Models/msdSimulationOutput.slx -------------------------------------------------------------------------------- /Models/msdTune.slx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Models/msdTune.slx -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Mass\-Spring\-Damper Systems 3 | 4 | 5 | [![View on File Exchange](https://www.mathworks.com/matlabcentral/images/matlab-file-exchange.svg)](https://www.mathworks.com/matlabcentral/fileexchange/94585-mass-spring-damper-systems) or [![Open in MATLAB Online](https://www.mathworks.com/images/responsive/global/open-in-matlab-online.svg)](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems&project=mass-spring-damper-systems.prj&file=README.mlx) 6 | 7 | [![MATLAB Versions Tested](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FMathWorks-Teaching-Resources%2FMass-Spring-Damper-Systems%2Frelease%2FImages%2FTestedWith.json)](https://MathWorks-Teaching-Resources.github.io/Mass-Spring-Damper-Systems) 8 | 9 | **Curriculum Module** 10 | 11 | _Created with R2020b. Compatible with R2024a and later releases._ 12 | 13 | # Information 14 | 15 | This curriculum module contains interactive [MATLAB® live scripts](https://www.mathworks.com/products/matlab/live-editor.html) and [Simulink® models](https://www.mathworks.com/products/simulink.html) that explore mass\-spring\-damper systems. Students learn to create and work with mass\-spring\-damper models in guided activities. 16 | 17 | 18 | ## Background 19 | 20 | These techniques are motivated by two applications: tuning the damping of a vehicle’s suspension and analyzing a building’s response to an earthquake. Throughout the module, students apply Simulink models to study the dynamics of the physical systems. In the final lesson, students identify the resonant frequencies of a mass\-spring\-damper building model by computing the power spectrum of a displacement signal. 21 | 22 | 23 | The instructions inside the live scripts will guide you through the exercises and activities. Get started with each live script by running it one section at a time. To stop running the script or a section midway (for example, when an animation is in progress), use the image_0.png Stop button in the **RUN** section of the **Live Editor** tab in the MATLAB Toolstrip. 24 | 25 | ## Contact Us 26 | 27 | Contact the [MathWorks teaching resources team](mailto:onlineteaching@mathworks.com) if you would like to provide feedback, or if you have a question. 28 | 29 | 30 | ## Prerequisites 31 | 32 | This module assumes knowledge of free\-body diagram and mechanics. Those interested in additional training should consider completing [MATLAB Onramp](https://matlabacademy.mathworks.com/details/matlab-onramp/gettingstarted) & [Simulink Onramp](https://matlabacademy.mathworks.com/details/simulink-onramp/simulink) as a further learning exploration. 33 | 34 | 35 | ## Getting Started 36 | ### Accessing the Module 37 | ### **On MATLAB Online:** 38 | 39 | Use the [image_1.png](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems) link to download the module. You will be prompted to log in or create a MathWorks account. The project will be loaded, and you will see an app with several navigation options to get you started. 40 | 41 | ### **On Desktop:** 42 | 43 | Download or clone this repository. Open MATLAB, navigate to the folder containing these scripts and double\-click on [mass\-spring\-damper\-systems.prj](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems&project=mass-spring-damper-systems.prj&file=README.mlx). It will add the appropriate files to your MATLAB path and open an app that asks you where you would like to start. 44 | 45 | 46 | Ensure you have all the required products (listed below) installed. If you need to include a product, add it using the Add\-On Explorer. To install an add\-on, go to the **Home** tab and select image_2.png **Add-Ons** > **Get Add-Ons**. 47 | 48 | 49 | ## Products 50 | 51 | MATLAB®, Simulink®, Symbolic Math Toolbox™. 52 | 53 | # Scripts 54 | ## [**MassSpringDamper.mlx**](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems&project=mass-spring-damper-systems.prj&file=Scripts/MassSpringDamper.mlx) 55 | | | | 56 | | :-- | :-- | 57 | | image_3.png
| **In this script, students will...**
$\bullet$ model a single mass\-spring\-damper.
$\bullet$ Turn the damping of a vehicle suspension system.
$\bullet$ Relate the mass, spring, and damper to their corresponding components in a physical system
| 58 | | | | 59 | 60 | ## [**DoubleMassSpringDamper.mlx**](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems&project=mass-spring-damper-systems.prj&file=Scripts/DoubleMassSpringDamper.mlx) 61 | | | | 62 | | :-- | :-- | 63 | | image_4.gif
| **In this script, students will...**
$\bullet$ model a double mass\-spring\-damper in Simulink
$\bullet$ Identify the resonant frequencies present in a two\-story building,
$\bullet$ Use the Symbolic Math Toolbox to help create Simulink models
| 64 | | | | 65 | 66 | ## [**MultipleMassSpringDamper.mlx**](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems&project=mass-spring-damper-systems.prj&file=Scripts/MultipleMassSpringDamper.mlx) 67 | | | | 68 | | :-- | :-- | 69 | | image_5.gif
| **In this script, students will...**
$\bullet$ Vectorize a Simulink model for multiple building analysis.
$\bullet$ Use the spectrum analyzer block to compute the power spectrum.
$\bullet$ Complete Simulink mass\-spring\-damper models with n degrees of freedom
| 70 | | | | 71 | 72 | # Related Courseware Modules 73 | 74 | ## [Beam Bending and Deflection](https://www.mathworks.com/matlabcentral/fileexchange/113670-beam-bending-and-deflection?s_tid=ta_fx_results) 75 | | | | 76 | | :-- | :-- | 77 | | image_6.png
| **Available on:**
[image_7.png](https://www.mathworks.com/matlabcentral/fileexchange/113670-beam-bending-and-deflection?s_tid=ta_fx_results)
[image_8.png](https://matlab.mathworks.com/open/github/v1?repo=MathWorks-Teaching-Resources/Beam-Bending-and-Deflection&project=MechanicsOfMaterials.prj)
[GitHub](https://github.com/MathWorks-Teaching-Resources/Beam-Bending-and-Deflection)
| 78 | | | | 79 | 80 | 81 | Or feel free to explore our other [modular courseware content](https://www.mathworks.com/matlabcentral/fileexchange/?q=tag%3A%22courseware+module%22&sort=downloads_desc_30d). 82 | 83 | # Educator Resources 84 | - [Educator Page](https://www.mathworks.com/academia/educators.html) 85 | 86 | # Contribute 87 | 88 | Looking for more? Find an issue? Have a suggestion? Please contact the [MathWorks teaching resources team](mailto:%20onlineteaching@mathworks.com). If you want to contribute directly to this project, you can find information about how to do so in the [CONTRIBUTING.md](https://github.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/blob/release/CONTRIBUTING.md) page on GitHub. 89 | 90 | 91 | *©* Copyright 2023 The MathWorks™, Inc 92 | 93 | 94 | -------------------------------------------------------------------------------- /README.mlx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/README.mlx -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Reporting Security Vulnerabilities 2 | 3 | If you believe you have discovered a security vulnerability, please report it to 4 | [security@mathworks.com](mailto:security@mathworks.com). Please see 5 | [MathWorks Vulnerability Disclosure Policy for Security Researchers](https://www.mathworks.com/company/aboutus/policies_statements/vulnerability-disclosure-policy.html) 6 | for additional information. -------------------------------------------------------------------------------- /Scripts/doubleMassSpringDamper.mlx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Scripts/doubleMassSpringDamper.mlx -------------------------------------------------------------------------------- /Scripts/massSpringDamper.mlx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Scripts/massSpringDamper.mlx -------------------------------------------------------------------------------- /Scripts/multipleMassSpringDamper.mlx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Scripts/multipleMassSpringDamper.mlx -------------------------------------------------------------------------------- /SoftwareTests/CheckTestResults.m: -------------------------------------------------------------------------------- 1 | classdef CheckTestResults < matlab.unittest.TestCase 2 | 3 | properties (SetAccess = protected) 4 | end 5 | 6 | properties (ClassSetupParameter) 7 | Project = {currentProject()}; 8 | end 9 | 10 | properties (TestParameter) 11 | Version 12 | end 13 | 14 | 15 | methods (TestParameterDefinition,Static) 16 | 17 | function Version = GetResults(Project) 18 | RootFolder = Project.RootFolder; 19 | Version = dir(fullfile(RootFolder,"public","TestResults*.txt")); 20 | Version = extractBetween([Version.name],"TestResults_",".txt"); 21 | end 22 | 23 | end 24 | 25 | methods (TestClassSetup) 26 | 27 | function SetUpSmokeTest(testCase,Project) 28 | try 29 | currentProject; 30 | catch 31 | error("Project is not loaded.") 32 | end 33 | end 34 | 35 | end 36 | 37 | methods(Test) 38 | 39 | function CheckResults(testCase,Version) 40 | File = fullfile("public","TestResults_"+Version+".txt"); 41 | Results = readtable(File,TextType="string"); 42 | if ~all(Results.Passed) 43 | error("Some of the tests did not pass.") 44 | end 45 | end 46 | 47 | end 48 | 49 | end -------------------------------------------------------------------------------- /SoftwareTests/FunctionTests.m: -------------------------------------------------------------------------------- 1 | classdef FunctionTests < matlab.unittest.TestCase 2 | 3 | % https://www.mathworks.com/help/matlab/matlab_prog/use-parameters-in-class-based-tests.html 4 | 5 | methods(Test) 6 | 7 | end % methods 8 | 9 | end % classdef -------------------------------------------------------------------------------- /SoftwareTests/PostFiles/PostdoubleMassSpringDamper.m: -------------------------------------------------------------------------------- 1 | % Post-run script for doubleMassSpringDamper.mlx 2 | % ---- Post-run commands ----- 3 | 4 | -------------------------------------------------------------------------------- /SoftwareTests/PostFiles/PostdoubleMassSpringDamperSoln.m: -------------------------------------------------------------------------------- 1 | % Post-run script for doubleMassSpringDamperSoln.mlx 2 | % ---- Post-run commands ----- 3 | 4 | -------------------------------------------------------------------------------- /SoftwareTests/PostFiles/PostmassSpringDamper.m: -------------------------------------------------------------------------------- 1 | % Post-run script for massSpringDamper.mlx 2 | % ---- Post-run commands ----- 3 | 4 | -------------------------------------------------------------------------------- /SoftwareTests/PostFiles/PostmassSpringDamperSoln.m: -------------------------------------------------------------------------------- 1 | % Post-run script for massSpringDamperSoln.mlx 2 | % ---- Post-run commands ----- 3 | 4 | -------------------------------------------------------------------------------- /SoftwareTests/PostFiles/PostmultipleMassSpringDamper.m: -------------------------------------------------------------------------------- 1 | % Post-run script for multipleMassSpringDamper.mlx 2 | % ---- Post-run commands ----- 3 | 4 | -------------------------------------------------------------------------------- /SoftwareTests/PostFiles/PostmultipleMassSpringDamperSoln.m: -------------------------------------------------------------------------------- 1 | % Post-run script for multipleMassSpringDamperSoln.mlx 2 | % ---- Post-run commands ----- 3 | 4 | -------------------------------------------------------------------------------- /SoftwareTests/PostSmokeTest.m: -------------------------------------------------------------------------------- 1 | function PostSmokeTest(ShowReport) 2 | arguments 3 | ShowReport (1,1) logical = false; 4 | end 5 | 6 | import matlab.unittest.plugins.TestRunnerPlugin; 7 | 8 | % Create the runner: 9 | Runner = matlab.unittest.TestRunner.withTextOutput; 10 | 11 | % Create report folder: 12 | Folder = fullfile(currentProject().RootFolder,"public"); 13 | if ~isfolder(Folder) 14 | mkdir(Folder) 15 | end 16 | 17 | % Add HTML plugin: 18 | Plugin = matlab.unittest.plugins.TestReportPlugin.producingHTML(Folder,... 19 | "IncludingPassingDiagnostics",true,... 20 | "IncludingCommandWindowText",false,... 21 | "LoggingLevel",matlab.automation.Verbosity(1)); 22 | Runner.addPlugin(Plugin); 23 | 24 | 25 | % Create Test Suite 26 | Suite = testsuite("CheckTestResults"); 27 | 28 | % Run the test suite 29 | Results = Runner.run(Suite); 30 | 31 | 32 | % Format the results in a table and save them 33 | Results = table(Results'); 34 | Version = extractBetween(string(Results.Name),"Version=",")"); 35 | Passed = Results.Passed; 36 | 37 | % Add link to other report 38 | File = fileread(fullfile("public","index.html")); 39 | for iVer = 1:length(Version) 40 | File = replace(File,"Version="+Version(iVer),... 41 | sprintf('%s',Version(iVer),"Version="+Version(iVer))); 42 | end 43 | writelines(File,fullfile("public","index.html"),"WriteMode","overwrite"); 44 | 45 | % Format the JSON file 46 | Badge = struct; 47 | Badge.schemaVersion = 1; 48 | Badge.label = "Test Status"; 49 | if all(Passed) 50 | Badge.color = "success"; 51 | Badge.message = join("R"+Version," | "); 52 | elseif any(Passed) 53 | Badge.color = "yellowgreen"; 54 | Badge.message = join("R") 55 | elseif all(~Passed) 56 | Badge.color = "critical"; 57 | Badge.message = join("R"+Version," | "); 58 | end 59 | Badge = jsonencode(Badge); 60 | writelines(Badge,fullfile("Images","TestedWith.json")); 61 | 62 | if ShowReport 63 | web(fullfile(Folder,"index.html")) 64 | end 65 | 66 | end -------------------------------------------------------------------------------- /SoftwareTests/PreFiles/PredoubleMassSpringDamper.m: -------------------------------------------------------------------------------- 1 | % Pre-run script for doubleMassSpringDamper.mlx 2 | % ---- Known Issues ----- 3 | KnownIssuesID = ""; 4 | % ---- Pre-run commands ----- 5 | 6 | -------------------------------------------------------------------------------- /SoftwareTests/PreFiles/PredoubleMassSpringDamperSoln.m: -------------------------------------------------------------------------------- 1 | % Pre-run script for doubleMassSpringDamperSoln.mlx 2 | % ---- Known Issues ----- 3 | KnownIssuesID = ""; 4 | % ---- Pre-run commands ----- 5 | 6 | -------------------------------------------------------------------------------- /SoftwareTests/PreFiles/PremassSpringDamper.m: -------------------------------------------------------------------------------- 1 | % Pre-run script for massSpringDamper.mlx 2 | % ---- Known Issues ----- 3 | KnownIssuesID = ""; 4 | % ---- Pre-run commands ----- 5 | 6 | -------------------------------------------------------------------------------- /SoftwareTests/PreFiles/PremassSpringDamperSoln.m: -------------------------------------------------------------------------------- 1 | % Pre-run script for massSpringDamperSoln.mlx 2 | % ---- Known Issues ----- 3 | KnownIssuesID = ""; 4 | % ---- Pre-run commands ----- 5 | 6 | -------------------------------------------------------------------------------- /SoftwareTests/PreFiles/PremultipleMassSpringDamper.m: -------------------------------------------------------------------------------- 1 | % Pre-run script for multipleMassSpringDamper.mlx 2 | % ---- Known Issues ----- 3 | KnownIssuesID = ""; 4 | % ---- Pre-run commands ----- 5 | 6 | -------------------------------------------------------------------------------- /SoftwareTests/PreFiles/PremultipleMassSpringDamperSoln.m: -------------------------------------------------------------------------------- 1 | % Pre-run script for multipleMassSpringDamperSoln.mlx 2 | % ---- Known Issues ----- 3 | KnownIssuesID = ""; 4 | % ---- Pre-run commands ----- 5 | 6 | -------------------------------------------------------------------------------- /SoftwareTests/RunAllTests.m: -------------------------------------------------------------------------------- 1 | function RunAllTests(ShowReport) 2 | arguments 3 | ShowReport (1,1) logical = false; 4 | end 5 | 6 | import matlab.unittest.plugins.TestReportPlugin; 7 | 8 | % Create a runner 9 | Runner = matlab.unittest.TestRunner.withTextOutput; 10 | Folder = fullfile(currentProject().RootFolder,"public",version("-release")); 11 | if ~isfolder(Folder) 12 | mkdir(Folder) 13 | else 14 | rmdir(Folder,'s') 15 | mkdir(Folder) 16 | end 17 | Plugin = TestReportPlugin.producingHTML(Folder,... 18 | "IncludingPassingDiagnostics",true,... 19 | "IncludingCommandWindowText",true,... 20 | "LoggingLevel",matlab.automation.Verbosity(1)); 21 | Runner.addPlugin(Plugin); 22 | 23 | 24 | % Create the test suite with SmokeTest and Function test if they exist 25 | Suite = testsuite("SmokeTests"); 26 | Suite = [Suite testsuite("FunctionTests")]; 27 | Suite = [Suite testsuite("SolnSmokeTests")]; 28 | 29 | % Run the test suite 30 | Results = Runner.run(Suite); 31 | 32 | if ShowReport 33 | web(fullfile(Folder,"index.html")) 34 | end 35 | 36 | % Format the results in a table and save them 37 | ResultsTable = table(Results') 38 | writetable(ResultsTable,fullfile(currentProject().RootFolder,... 39 | "public","TestResults_"+version("-release")+".txt")); 40 | 41 | % Assert success of test 42 | assertSuccess(Results); 43 | 44 | end 45 | -------------------------------------------------------------------------------- /SoftwareTests/SmokeTests.m: -------------------------------------------------------------------------------- 1 | classdef SmokeTests < matlab.unittest.TestCase 2 | 3 | properties 4 | RootFolder 5 | end 6 | 7 | properties (ClassSetupParameter) 8 | Project = {currentProject()}; 9 | end 10 | 11 | properties (TestParameter) 12 | File; 13 | end 14 | 15 | methods (TestParameterDefinition,Static) 16 | 17 | function File = RetrieveFile(Project) %#ok 18 | % Retrieve student template files: 19 | RootFolder = currentProject().RootFolder; 20 | File = dir(fullfile(RootFolder,"Scripts","*.mlx")); 21 | File = {File.name}; 22 | end 23 | 24 | end 25 | 26 | methods (TestClassSetup) 27 | 28 | function SetUpSmokeTest(testCase,Project) %#ok 29 | % Navigate to project root folder: 30 | testCase.RootFolder = Project.RootFolder; 31 | cd(testCase.RootFolder) 32 | 33 | % Close the StartUp app if still open: 34 | delete(findall(groot,'Name','StartUp App')) 35 | 36 | % Log MATLAB version: 37 | testCase.log("Running in " + version) 38 | end 39 | 40 | end 41 | 42 | methods(Test) 43 | 44 | function SmokeRun(testCase,File) 45 | 46 | % Navigate to project root folder: 47 | cd(testCase.RootFolder) 48 | FileToRun = string(File); 49 | 50 | % Pre-test: 51 | PreFiles = CheckPreFile(testCase,FileToRun); 52 | run(PreFiles); 53 | 54 | % Run SmokeTest 55 | disp(">> Running " + FileToRun); 56 | try 57 | run(fullfile("Scripts",FileToRun)); 58 | catch ME 59 | 60 | end 61 | 62 | % Post-test: 63 | PostFiles = CheckPostFile(testCase,FileToRun); 64 | run(PostFiles) 65 | 66 | % Log every figure created during run: 67 | Figures = findall(groot,'Type','figure'); 68 | Figures = flipud(Figures); 69 | if ~isempty(Figures) 70 | for f = 1:size(Figures,1) 71 | if ~isempty(Figures(f).Number) 72 | FigDiag = matlab.unittest.diagnostics.FigureDiagnostic(Figures(f),'Formats','png'); 73 | log(testCase,1,FigDiag); 74 | end 75 | end 76 | end 77 | 78 | % Close all figures and Simulink models 79 | close all force 80 | if any(matlab.addons.installedAddons().Name == "Simulink") 81 | bdclose all 82 | end 83 | 84 | % Rethrow error if any 85 | if exist("ME","var") 86 | if ~any(strcmp(ME.identifier,KnownIssuesID)) 87 | rethrow(ME) 88 | end 89 | end 90 | 91 | end 92 | 93 | end 94 | 95 | 96 | methods (Access = private) 97 | 98 | function Path = CheckPreFile(testCase,Filename) 99 | PreFile = "Pre"+replace(Filename,".mlx",".m"); 100 | PreFilePath = fullfile(testCase.RootFolder,"SoftwareTests","PreFiles",PreFile); 101 | if ~isfolder(fullfile(testCase.RootFolder,"SoftwareTests/PreFiles")) 102 | mkdir(fullfile(testCase.RootFolder,"SoftwareTests/PreFiles")) 103 | end 104 | if ~isfile(PreFilePath) 105 | writelines("% Pre-run script for "+Filename,PreFilePath) 106 | writelines("% ---- Known Issues -----",PreFilePath,'WriteMode','append'); 107 | writelines("KnownIssuesID = "+char(34)+char(34)+";",PreFilePath,'WriteMode','append'); 108 | writelines("% ---- Pre-run commands -----",PreFilePath,'WriteMode','append'); 109 | writelines(" ",PreFilePath,'WriteMode','append'); 110 | end 111 | Path = PreFilePath; 112 | end 113 | 114 | function Path = CheckPostFile(testCase,Filename) 115 | PostFile = "Post"+replace(Filename,".mlx",".m"); 116 | PostFilePath = fullfile(testCase.RootFolder,"SoftwareTests","PostFiles",PostFile); 117 | if ~isfolder(fullfile(testCase.RootFolder,"SoftwareTests/PostFiles")) 118 | mkdir(fullfile(testCase.RootFolder,"SoftwareTests/PostFiles")) 119 | end 120 | if ~isfile(PostFilePath) 121 | writelines("% Post-run script for "+Filename,PostFilePath) 122 | writelines("% ---- Post-run commands -----",PostFilePath,'WriteMode','append'); 123 | writelines(" ",PostFilePath,'WriteMode','append'); 124 | end 125 | Path = PostFilePath; 126 | end 127 | 128 | end 129 | 130 | end -------------------------------------------------------------------------------- /SoftwareTests/SolnSmokeTests.m: -------------------------------------------------------------------------------- 1 | classdef SolnSmokeTests < matlab.unittest.TestCase 2 | 3 | properties 4 | RootFolder 5 | isSolnOnPath 6 | end 7 | 8 | properties (ClassSetupParameter) 9 | Project = {currentProject()}; 10 | end 11 | 12 | properties (TestParameter) 13 | File; 14 | end 15 | 16 | methods (TestParameterDefinition,Static) 17 | 18 | function File = GetScriptName(Project) 19 | % Retrieve student template files: 20 | RootFolder = Project.RootFolder; 21 | File = dir(fullfile(RootFolder,"Scripts","*.mlx")); 22 | File = {File.name}; 23 | end 24 | 25 | end 26 | 27 | methods (TestClassSetup) 28 | 29 | function SetUpPath(testCase,Project) 30 | % Navigate to project root folder: 31 | testCase.RootFolder = Project.RootFolder; 32 | cd(testCase.RootFolder) 33 | 34 | % Check that solutions are on path: 35 | testCase.isSolnOnPath = isfolder("Solutions"); 36 | if testCase.isSolnOnPath == 0 37 | addpath(fullfile(testCase.RootFolder,"InstructorResources","Solutions")) 38 | end 39 | 40 | % Close the StartUp app if still open: 41 | delete(findall(groot,'Name','StartUp App')) 42 | 43 | % Log MATLAB version: 44 | testCase.log("Running in " + version) 45 | 46 | end % function setUpPath 47 | 48 | end % methods (TestClassSetup) 49 | 50 | methods(Test) 51 | 52 | % Check that solutions files exist for each of the student 53 | % templates 54 | function ExistSolns(testCase,File) 55 | SolutionName = replace(string(File),".mlx","Soln.mlx"); 56 | assert(exist(SolutionName,"file"),"Missing solutions for "+File); 57 | end 58 | 59 | 60 | function SmokeRun(testCase,File) 61 | 62 | % Navigate to project root folder: 63 | cd(testCase.RootFolder) 64 | FileToRun = replace(string(File),".mlx","Soln.mlx"); 65 | 66 | % Pre-test: 67 | PreFiles = CheckPreFile(testCase,FileToRun); 68 | run(PreFiles); 69 | 70 | % Run SmokeTest 71 | disp(">> Running " + FileToRun); 72 | try 73 | run(fullfile("InstructorResources","Solutions",FileToRun)); 74 | catch ME 75 | 76 | end 77 | 78 | % Post-test: 79 | PostFiles = CheckPostFile(testCase,FileToRun); 80 | run(PostFiles) 81 | 82 | % Log every figure created during run: 83 | Figures = findall(groot,'Type','figure'); 84 | Figures = flipud(Figures); 85 | if ~isempty(Figures) 86 | for f = 1:size(Figures,1) 87 | if ~isempty(Figures(f).Number) 88 | FigDiag = matlab.unittest.diagnostics.FigureDiagnostic(Figures(f),'Formats','png'); 89 | log(testCase,1,FigDiag); 90 | end 91 | end 92 | end 93 | 94 | % Close all figures and Simulink models 95 | close all force 96 | if any(matlab.addons.installedAddons().Name == "Simulink") 97 | bdclose all 98 | end 99 | 100 | % Rethrow error if any 101 | if exist("ME","var") 102 | if ~any(strcmp(ME.identifier,KnownIssuesID)) 103 | rethrow(ME) 104 | end 105 | end 106 | 107 | end 108 | 109 | end 110 | 111 | methods (Access = private) 112 | 113 | function Path = CheckPreFile(testCase,Filename) 114 | PreFile = "Pre"+replace(Filename,".mlx",".m"); 115 | PreFilePath = fullfile(testCase.RootFolder,"SoftwareTests","PreFiles",PreFile); 116 | if ~isfolder(fullfile(testCase.RootFolder,"SoftwareTests/PreFiles")) 117 | mkdir(fullfile(testCase.RootFolder,"SoftwareTests/PreFiles")) 118 | end 119 | if ~isfile(PreFilePath) 120 | writelines("% Pre-run script for "+Filename,PreFilePath) 121 | writelines("% ---- Known Issues -----",PreFilePath,'WriteMode','append'); 122 | writelines("KnownIssuesID = "+char(34)+char(34)+";",PreFilePath,'WriteMode','append'); 123 | writelines("% ---- Pre-run commands -----",PreFilePath,'WriteMode','append'); 124 | writelines(" ",PreFilePath,'WriteMode','append'); 125 | end 126 | Path = PreFilePath; 127 | end 128 | 129 | function Path = CheckPostFile(testCase,Filename) 130 | PostFile = "Post"+replace(Filename,".mlx",".m"); 131 | PostFilePath = fullfile(testCase.RootFolder,"SoftwareTests","PostFiles",PostFile); 132 | if ~isfolder(fullfile(testCase.RootFolder,"SoftwareTests/PostFiles")) 133 | mkdir(fullfile(testCase.RootFolder,"SoftwareTests/PostFiles")) 134 | end 135 | if ~isfile(PostFilePath) 136 | writelines("% Post-run script for "+Filename,PostFilePath) 137 | writelines("% ---- Post-run commands -----",PostFilePath,'WriteMode','append'); 138 | writelines(" ",PostFilePath,'WriteMode','append'); 139 | end 140 | Path = PostFilePath; 141 | end 142 | 143 | end 144 | 145 | end 146 | -------------------------------------------------------------------------------- /Utilities/ProjectShutdown.m: -------------------------------------------------------------------------------- 1 | function ProjectShutdown 2 | % Reset module to original state that is expected when loading in a new 3 | % MATLAB version. 4 | proj = currentProject; 5 | if isMATLABReleaseOlderThan("R2023b") 6 | cd(proj.RootFolder) 7 | try 8 | if exist(fullfile("Utilities","OldVersions","MainMenuNew.mlx"),"file") 9 | movefile("MainMenu.mlx", fullfile("Utilities","OldVersions","MainMenuOld.mlx")) 10 | movefile(fullfile("Utilities","OldVersions","MainMenuNew.mlx"),fullfile(proj.RootFolder,"MainMenu.mlx")) 11 | end 12 | catch 13 | disp("Failed to move MainMenu.mlx.") 14 | end 15 | try 16 | if exist(fullfile("Utilities","OldVersions","READMENew.mlx"),"file") 17 | movefile("README.mlx", fullfile("Utilities","OldVersions","READMEOld.mlx")) 18 | movefile(fullfile("Utilities","OldVersions","READMENew.mlx"),fullfile(proj.RootFolder,"README.mlx")) 19 | end 20 | catch 21 | disp("Failed to move README.mlx.") 22 | end 23 | end 24 | end -------------------------------------------------------------------------------- /Utilities/ProjectStartupApp.m: -------------------------------------------------------------------------------- 1 | classdef ProjectStartupApp < matlab.apps.AppBase 2 | 3 | % Properties that correspond to app components 4 | properties (Access = public) 5 | UIFigure matlab.ui.Figure 6 | TabGroup matlab.ui.container.TabGroup 7 | WelcomeTab matlab.ui.container.Tab 8 | Image matlab.ui.control.Image 9 | READMEButton matlab.ui.control.Button 10 | ReviewUsButton matlab.ui.control.Button 11 | MainMenuButton matlab.ui.control.Button 12 | WelcomeTitle matlab.ui.control.Label 13 | TabReview matlab.ui.container.Tab 14 | OtherButton matlab.ui.control.Button 15 | StudentButton matlab.ui.control.Button 16 | FacultyButton matlab.ui.control.Button 17 | Q1 matlab.ui.control.Label 18 | ReviewTitle matlab.ui.control.Label 19 | ReviewText matlab.ui.control.Label 20 | end 21 | 22 | 23 | properties (Access = private) 24 | GitHubOrganization = "MathWorks-Teaching-Resources"; % Description 25 | GitHubRepository = "Mass-Spring-Damper-Systems"; 26 | end 27 | %% How to customize the app? 28 | %{ 29 | 30 | This StartUp app is designed to be customized to your module. It 31 | requires a minimum number of customization: 32 | 33 | 1. Change "Module Template" in app.WelcomeTitle by your module name 34 | 2. Change "Module Template" in app.ReviewTitle by your module name 35 | 3. Change the GitHubRepository (line 25) to the correct value 36 | 4. Change image in app.Image by the cover image you would like for your 37 | module. This image should be located in rootFolder/Images 38 | 5. Create your MS Form: 39 | a. Make a copy of the Faculty and the Student Template surveys 40 | b. Customize the name of the survey to match the name of your 41 | survey 42 | c. Click on "Collect responses", select "Anyone can respond" and 43 | copy the form link to SetupAppLinks (see step 6). 44 | 5. Create your MS Sway: 45 | a. Go to MS Sway 46 | b. Create a blank sway 47 | c. Add the name of your module to the title box 48 | d. Click "Share", Select "Anyone with a link", Select "View" 49 | e. Copy the sway link to SetupAppLinks (see step 6). 50 | 6. Add the Survey and Sway link to Utilities/SurveyLinks using 51 | SetupAppLinks.mlx in InternalFiles/RequiredFunctions/StartUpFcn 52 | 7. Save > Export to .m file and save the result as 53 | Utilities/ProjectStartupApp.m 54 | 55 | %} 56 | 57 | methods (Access = private, Static) 58 | 59 | function pingSway(app) 60 | try 61 | if ~ispref("MCCTEAM") 62 | load Utilities\SurveyLinks.mat SwayLink 63 | webread(SwayLink); 64 | end 65 | catch 66 | end 67 | end 68 | 69 | function openStudentForm(app) 70 | try 71 | load Utilities\SurveyLinks.mat StudentFormLink 72 | web(StudentFormLink); 73 | catch 74 | end 75 | end 76 | 77 | function openFacultyForm(app) 78 | try 79 | load Utilities\SurveyLinks.mat FacultyFormLink 80 | web(FacultyFormLink); 81 | catch 82 | end 83 | end 84 | 85 | function saveSettings(isReviewed,numLoad) 86 | try 87 | save(fullfile("Utilities","ProjectSettings.mat"),"isReviewed","numLoad"); 88 | catch 89 | end 90 | end 91 | 92 | end 93 | 94 | 95 | % Callbacks that handle component events 96 | methods (Access = private) 97 | 98 | % Code that executes after component creation 99 | function startupFcn(app) 100 | 101 | % Move gui to center of screen 102 | movegui(app.UIFigure,"center") 103 | 104 | % Switch tab to review if has not been reviewed yet 105 | if isfile(fullfile("Utilities","ProjectSettings.mat")) 106 | load(fullfile("Utilities","ProjectSettings.mat"),"isReviewed","numLoad"); 107 | numLoad = numLoad + 1; % Increment counter 108 | else 109 | isReviewed = false; 110 | numLoad = 1; % Initialize counter 111 | end 112 | 113 | % Switch tab for review 114 | if ~isReviewed && numLoad > 2 115 | isReviewed = true; 116 | app.TabGroup.SelectedTab = app.TabReview; 117 | end 118 | 119 | % Save new settings 120 | app.saveSettings(isReviewed,numLoad) 121 | 122 | % Download links to survey (should only work when module goes 123 | % public on GitHub) 124 | try 125 | import matlab.net.* 126 | import matlab.net.http.* 127 | 128 | Request = RequestMessage; 129 | Request.Method = 'GET'; 130 | Address = URI("http://api.github.com/repos/"+app.GitHubOrganization+... 131 | "/"+app.GitHubRepository+"/contents/Utilities/SurveyLinks.mat"); 132 | Request.Header = HeaderField("X-GitHub-Api-Version","2022-11-28"); 133 | Request.Header(2) = HeaderField("Accept","application/vnd.github+json"); 134 | [Answer,~,~] = send(Request,Address); 135 | websave(fullfile("Utilities/SurveyLinks.mat"),Answer.Body.Data.download_url) 136 | catch 137 | end 138 | 139 | end 140 | 141 | % Close request function: UIFigure 142 | function UIFigureCloseRequest(app, event) 143 | if event.Source == app.READMEButton 144 | open README.mlx 145 | elseif event.Source == app.MainMenuButton 146 | open MainMenu.mlx 147 | elseif event.Source == app.FacultyButton 148 | open MainMenu.mlx 149 | elseif event.Source == app.StudentButton 150 | open MainMenu.mlx 151 | elseif event.Source == app.OtherButton 152 | open MainMenu.mlx 153 | else 154 | disp("Thank you for your time.") 155 | end 156 | delete(app) 157 | end 158 | 159 | % Button pushed function: MainMenuButton 160 | function MainMenuButtonPushed(app, event) 161 | UIFigureCloseRequest(app,event) 162 | end 163 | 164 | % Button pushed function: FacultyButton 165 | function FacultyButtonPushed(app, event) 166 | app.pingSway; 167 | app.openFacultyForm; 168 | UIFigureCloseRequest(app,event) 169 | end 170 | 171 | % Button pushed function: StudentButton 172 | function StudentButtonPushed(app, event) 173 | app.pingSway; 174 | app.openStudentForm; 175 | UIFigureCloseRequest(app,event) 176 | end 177 | 178 | % Button pushed function: OtherButton 179 | function OtherButtonPushed(app, event) 180 | app.pingSway; 181 | app.openStudentForm; 182 | UIFigureCloseRequest(app,event) 183 | end 184 | 185 | % Button pushed function: ReviewUsButton 186 | function ReviewUsButtonPushed(app, event) 187 | app.TabGroup.SelectedTab = app.TabReview; 188 | end 189 | 190 | % Button pushed function: READMEButton 191 | function READMEButtonPushed(app, event) 192 | UIFigureCloseRequest(app,event) 193 | end 194 | end 195 | 196 | % Component initialization 197 | methods (Access = private) 198 | 199 | % Create UIFigure and components 200 | function createComponents(app) 201 | 202 | % Create UIFigure and hide until all components are created 203 | app.UIFigure = uifigure('Visible', 'off'); 204 | app.UIFigure.AutoResizeChildren = 'off'; 205 | app.UIFigure.Position = [100 100 276 430]; 206 | app.UIFigure.Name = 'StartUp App'; 207 | app.UIFigure.Resize = 'off'; 208 | app.UIFigure.CloseRequestFcn = createCallbackFcn(app, @UIFigureCloseRequest, true); 209 | 210 | % Create TabGroup 211 | app.TabGroup = uitabgroup(app.UIFigure); 212 | app.TabGroup.AutoResizeChildren = 'off'; 213 | app.TabGroup.Position = [1 1 276 460]; 214 | 215 | % Create WelcomeTab 216 | app.WelcomeTab = uitab(app.TabGroup); 217 | app.WelcomeTab.AutoResizeChildren = 'off'; 218 | app.WelcomeTab.Title = 'Tab'; 219 | 220 | % Create WelcomeTitle 221 | app.WelcomeTitle = uilabel(app.WelcomeTab); 222 | app.WelcomeTitle.HorizontalAlignment = 'center'; 223 | app.WelcomeTitle.VerticalAlignment = 'top'; 224 | app.WelcomeTitle.WordWrap = 'on'; 225 | app.WelcomeTitle.FontSize = 24; 226 | app.WelcomeTitle.FontWeight = 'bold'; 227 | app.WelcomeTitle.Position = [2 349 274 70]; 228 | app.WelcomeTitle.Text = 'Mass-Spring-Damper System'; 229 | 230 | % Create MainMenuButton 231 | app.MainMenuButton = uibutton(app.WelcomeTab, 'push'); 232 | app.MainMenuButton.ButtonPushedFcn = createCallbackFcn(app, @MainMenuButtonPushed, true); 233 | app.MainMenuButton.FontSize = 18; 234 | app.MainMenuButton.Position = [59 96 161 35]; 235 | app.MainMenuButton.Text = 'Main Menu'; 236 | 237 | % Create ReviewUsButton 238 | app.ReviewUsButton = uibutton(app.WelcomeTab, 'push'); 239 | app.ReviewUsButton.ButtonPushedFcn = createCallbackFcn(app, @ReviewUsButtonPushed, true); 240 | app.ReviewUsButton.FontSize = 18; 241 | app.ReviewUsButton.Position = [59 10 161 35]; 242 | app.ReviewUsButton.Text = 'Review Us'; 243 | 244 | % Create READMEButton 245 | app.READMEButton = uibutton(app.WelcomeTab, 'push'); 246 | app.READMEButton.ButtonPushedFcn = createCallbackFcn(app, @READMEButtonPushed, true); 247 | app.READMEButton.FontSize = 18; 248 | app.READMEButton.Position = [59 53 161 35]; 249 | app.READMEButton.Text = 'README'; 250 | 251 | % Create Image 252 | app.Image = uiimage(app.WelcomeTab); 253 | app.Image.Position = [16 141 245 209]; 254 | app.Image.ImageSource = 'image_3.png'; 255 | 256 | % Create TabReview 257 | app.TabReview = uitab(app.TabGroup); 258 | app.TabReview.AutoResizeChildren = 'off'; 259 | app.TabReview.Title = 'Tab2'; 260 | app.TabReview.HandleVisibility = 'off'; 261 | 262 | % Create ReviewText 263 | app.ReviewText = uilabel(app.TabReview); 264 | app.ReviewText.HorizontalAlignment = 'center'; 265 | app.ReviewText.VerticalAlignment = 'top'; 266 | app.ReviewText.WordWrap = 'on'; 267 | app.ReviewText.FontSize = 18; 268 | app.ReviewText.Position = [16 243 245 69]; 269 | app.ReviewText.Text = 'Plese help us improve your experience by answering a few questions.'; 270 | 271 | % Create ReviewTitle 272 | app.ReviewTitle = uilabel(app.TabReview); 273 | app.ReviewTitle.HorizontalAlignment = 'center'; 274 | app.ReviewTitle.VerticalAlignment = 'top'; 275 | app.ReviewTitle.WordWrap = 'on'; 276 | app.ReviewTitle.FontSize = 24; 277 | app.ReviewTitle.FontWeight = 'bold'; 278 | app.ReviewTitle.Position = [2 326 274 93]; 279 | app.ReviewTitle.Text = 'Welcome to Module Template'; 280 | 281 | % Create Q1 282 | app.Q1 = uilabel(app.TabReview); 283 | app.Q1.HorizontalAlignment = 'center'; 284 | app.Q1.VerticalAlignment = 'top'; 285 | app.Q1.WordWrap = 'on'; 286 | app.Q1.FontSize = 18; 287 | app.Q1.FontWeight = 'bold'; 288 | app.Q1.Position = [16 141 245 69]; 289 | app.Q1.Text = 'What describe you best?'; 290 | 291 | % Create FacultyButton 292 | app.FacultyButton = uibutton(app.TabReview, 'push'); 293 | app.FacultyButton.ButtonPushedFcn = createCallbackFcn(app, @FacultyButtonPushed, true); 294 | app.FacultyButton.FontSize = 18; 295 | app.FacultyButton.Position = [64 127 150 40]; 296 | app.FacultyButton.Text = 'Faculty'; 297 | 298 | % Create StudentButton 299 | app.StudentButton = uibutton(app.TabReview, 'push'); 300 | app.StudentButton.ButtonPushedFcn = createCallbackFcn(app, @StudentButtonPushed, true); 301 | app.StudentButton.FontSize = 18; 302 | app.StudentButton.Position = [64 80 150 40]; 303 | app.StudentButton.Text = 'Student'; 304 | 305 | % Create OtherButton 306 | app.OtherButton = uibutton(app.TabReview, 'push'); 307 | app.OtherButton.ButtonPushedFcn = createCallbackFcn(app, @OtherButtonPushed, true); 308 | app.OtherButton.FontSize = 18; 309 | app.OtherButton.Position = [64 34 150 40]; 310 | app.OtherButton.Text = 'Other'; 311 | 312 | % Show the figure after all components are created 313 | app.UIFigure.Visible = 'on'; 314 | end 315 | end 316 | 317 | % App creation and deletion 318 | methods (Access = public) 319 | 320 | % Construct app 321 | function app = ProjectStartupApp 322 | 323 | % Create UIFigure and components 324 | createComponents(app) 325 | 326 | % Register the app with App Designer 327 | registerApp(app, app.UIFigure) 328 | 329 | % Execute the startup function 330 | runStartupFcn(app, @startupFcn) 331 | 332 | if nargout == 0 333 | clear app 334 | end 335 | end 336 | 337 | % Code that executes before app deletion 338 | function delete(app) 339 | 340 | % Delete UIFigure when app is deleted 341 | delete(app.UIFigure) 342 | end 343 | end 344 | end -------------------------------------------------------------------------------- /Utilities/SurveyLinks.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MathWorks-Teaching-Resources/Mass-Spring-Damper-Systems/f41ddbdb5ffaa63093fa414a38a52c89260b8595/Utilities/SurveyLinks.mat -------------------------------------------------------------------------------- /mass-spring-damper-systems.prj: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/-OLaEciJ4exkuNHkJ0eyeQpFOc4d.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/-OLaEciJ4exkuNHkJ0eyeQpFOc4p.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/0ZI8NNhIdsg53JnT5HgIM_J61IEd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/0ZI8NNhIdsg53JnT5HgIM_J61IEp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/3PbMH_ST3q7EmnLBfhgZS9iFdAwd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/3PbMH_ST3q7EmnLBfhgZS9iFdAwp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/AjF9vpML2MtUS5jPkikGlyWknD4d.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/AjF9vpML2MtUS5jPkikGlyWknD4p.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/C6Hgjb0cz76iCmA23O7A5TFVHVEd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/C6Hgjb0cz76iCmA23O7A5TFVHVEp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/DCf2H7_WFdnhTYVpihBlMN90nmsd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/DCf2H7_WFdnhTYVpihBlMN90nmsp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/FyaTa5jAbbNpTXx8meWki5KFjkId.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/FyaTa5jAbbNpTXx8meWki5KFjkIp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/Wfr926a1NH8qeQNRXVyup0dVoPsd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/Wfr926a1NH8qeQNRXVyup0dVoPsp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/brVh4EtQ-p1f3df7U5taXWEcDU8d.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/brVh4EtQ-p1f3df7U5taXWEcDU8p.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/eoVw5pfVJKGzqfBb47i23v6v-Ggd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/eoVw5pfVJKGzqfBb47i23v6v-Ggp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/jYsB6lESBHIrKkzzr0ZhoLpQzw8d.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/jYsB6lESBHIrKkzzr0ZhoLpQzw8p.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/tUt9ouxSp3y7kvoau8MZqEcBlikd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/tUt9ouxSp3y7kvoau8MZqEcBlikp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/xScl1psOnyi_pOx_5i_OZOmWjucd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/-Rce9Lxzt4v7MmBOh-k5NnO_YJM/xScl1psOnyi_pOx_5i_OZOmWjucp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/8stDomWIqQnxJ259v3Ppp4ge0uod.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/8stDomWIqQnxJ259v3Ppp4ge0uop.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/OqDwzo8DHV6DsCE-krhhwqEonckd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/OqDwzo8DHV6DsCE-krhhwqEonckp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/kcCplvrFGG5bIahzBDhjTbLQWE4d.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/kcCplvrFGG5bIahzBDhjTbLQWE4p.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/nyGKSyKL9_WtSG-rJHFV22U0good.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/nyGKSyKL9_WtSG-rJHFV22U0goop.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/sq6NlRukLgeFWAYwTUNRn-0VgqYd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/sq6NlRukLgeFWAYwTUNRn-0VgqYp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/tRVv4yUvvjpUU-gPGFyFh_PCezUd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/tRVv4yUvvjpUU-gPGFyFh_PCezUp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/ZzMM06Xgxh2tESY16NWxjQ4EyKkd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/ZzMM06Xgxh2tESY16NWxjQ4EyKkp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/xuq8kAyX4N3Ux9AajkBdbZJJF9kd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/project/KAXfQgCar2Yb8zOxgvf9hdmLP1E/xuq8kAyX4N3Ux9AajkBdbZJJF9kp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/2kj09UetkV_lru3gvSPXnY6-nM4d.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/2kj09UetkV_lru3gvSPXnY6-nM4p.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/KKyDJtbdIBOlaeHmIZd5VX6vqx8d.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/KKyDJtbdIBOlaeHmIZd5VX6vqx8p.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/QWNDYJD5mGW1bWYvPx9DtKnxzw4d.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/QWNDYJD5mGW1bWYvPx9DtKnxzw4p.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/R1RggVhA72agIvELiuhWPRS8F0Id.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/R1RggVhA72agIvELiuhWPRS8F0Ip.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/aEHSZBIY-yve10yGis12Zr5DLZod.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/aEHSZBIY-yve10yGis12Zr5DLZop.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/j4xwF_j8iFTVayUMfxLgMnTbencd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/j4xwF_j8iFTVayUMfxLgMnTbencp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/r8LR4nLmg9ai3oHrW1r_-KocQzkd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/NjSPEMsIuLUyIpr2u1Js5bVPsOs/r8LR4nLmg9ai3oHrW1r_-KocQzkp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/WZRuNzqc-Db7NcQAZO8Y-R8U9cc/66WgGCcF5RIH9MCEgPmgjZK9k3Ud.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/WZRuNzqc-Db7NcQAZO8Y-R8U9cc/66WgGCcF5RIH9MCEgPmgjZK9k3Up.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/WZRuNzqc-Db7NcQAZO8Y-R8U9cc/AtMjXDrOSm8YDv3_4UFXiyrWqNEd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/WZRuNzqc-Db7NcQAZO8Y-R8U9cc/AtMjXDrOSm8YDv3_4UFXiyrWqNEp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/ZN2RlSIbyWXhOxbxxI4hOawbMD4/p5HYYVUpTuYgZwnT8QkkzaoJraUd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/ZN2RlSIbyWXhOxbxxI4hOawbMD4/p5HYYVUpTuYgZwnT8QkkzaoJraUp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/ZN2RlSIbyWXhOxbxxI4hOawbMD4/q4FWbcu8zEbneDjWzNwfvfvjQNAd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/ZN2RlSIbyWXhOxbxxI4hOawbMD4/q4FWbcu8zEbneDjWzNwfvfvjQNAp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/ZN2RlSIbyWXhOxbxxI4hOawbMD4/s-04wUzHjOhlMa1CW_zpJwm8iDMd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/ZN2RlSIbyWXhOxbxxI4hOawbMD4/s-04wUzHjOhlMa1CW_zpJwm8iDMp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/QOpe-1pctdftDIjwQLRdjOUZW44d.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/QOpe-1pctdftDIjwQLRdjOUZW44p.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/dFZtimQ9hMsf8Y7-kStpE8jBu80d.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/dFZtimQ9hMsf8Y7-kStpE8jBu80p.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/t3jqKQJuC1eDmZQqzo6s1diJhS0d.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/t3jqKQJuC1eDmZQqzo6s1diJhS0p.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/vN8C5ylrq15h-Ufo3qE9IU00IHcd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/ZdVxxv9BsNz7MGUxtEc6Pq3qh1M/vN8C5ylrq15h-Ufo3qE9IU00IHcp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/fjRQtWiSIy7hIlj-Kmk87M7s21k/NjSPEMsIuLUyIpr2u1Js5bVPsOsd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/fjRQtWiSIy7hIlj-Kmk87M7s21k/NjSPEMsIuLUyIpr2u1Js5bVPsOsp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/RMvf4mEDuznAOqU6SKNmIWErfxgd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/RMvf4mEDuznAOqU6SKNmIWErfxgp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/ZTr3GAe6p03ZVs2FdKKE0JsiFMQd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/ZTr3GAe6p03ZVs2FdKKE0JsiFMQp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/pidCgrPVf6RHNdoMyruVfScHpF8d.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/pidCgrPVf6RHNdoMyruVfScHpF8p.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/uIbyU9dPEHKvxjdwx5pD9PDDCZYd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/iMwdHOXOBiBXhnA_li8gtEJVTjc/uIbyU9dPEHKvxjdwx5pD9PDDCZYp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/-Rce9Lxzt4v7MmBOh-k5NnO_YJMd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/-Rce9Lxzt4v7MmBOh-k5NnO_YJMp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/KocSmEw1PpelhlG7ZNeMUdHVtywd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/KocSmEw1PpelhlG7ZNeMUdHVtywp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/QMJD9OLFzxcTTbPOoh-ahQ4zTRUd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/QMJD9OLFzxcTTbPOoh-ahQ4zTRUp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/R0IsxKENiOKovWZXASFjrmpbBCYd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/R0IsxKENiOKovWZXASFjrmpbBCYp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/TMK4UzWHdRLhy_w-CHt9y11Q8XAd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/TMK4UzWHdRLhy_w-CHt9y11Q8XAp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/ZN2RlSIbyWXhOxbxxI4hOawbMD4d.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/ZN2RlSIbyWXhOxbxxI4hOawbMD4p.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/ZdVxxv9BsNz7MGUxtEc6Pq3qh1Md.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/ZdVxxv9BsNz7MGUxtEc6Pq3qh1Mp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/iMwdHOXOBiBXhnA_li8gtEJVTjcd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/iMwdHOXOBiBXhnA_li8gtEJVTjcp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/qD-kr16wmwlzR-nIg1IG_vvRrWkd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/qD-kr16wmwlzR-nIg1IG_vvRrWkp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/rh0jHbNfmojECiiHH7BQHmZTsWkd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/rh0jHbNfmojECiiHH7BQHmZTsWkp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/rnpMu7jn2QWt_rQcz8FJ-MxGzVId.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/rnpMu7jn2QWt_rQcz8FJ-MxGzVIp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/trBOSMFt-ZFz0tI8PrpBhVjGM5Md.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/trBOSMFt-ZFz0tI8PrpBhVjGM5Mp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/root/6x1BhZX_fLnKpcwqra0qFwv1jIgp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/root/EEtUlUb-dLAdf0KpMVivaUlztwAp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/root/GiiBklLgTxteCEmomM8RCvWT0nQd.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/root/GiiBklLgTxteCEmomM8RCvWT0nQp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/root/KAXfQgCar2Yb8zOxgvf9hdmLP1Ep.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/root/NmGqIpAwUJcXFyLjFAGnU9uyN5Yp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/root/WZRuNzqc-Db7NcQAZO8Y-R8U9ccp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/root/fjRQtWiSIy7hIlj-Kmk87M7s21kp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/root/qaw0eS1zuuY1ar9TdPn1GMfrjbQp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/rootp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/project/uuid-bc8f52a4-b1b1-4d4c-9d13-bc3896bf2f25.xml: -------------------------------------------------------------------------------- 1 | 2 | --------------------------------------------------------------------------------