diff --git a/assets/formulas/conversions_and_constants.d4rt b/assets/formulas/conversions_and_constants.d4rt index a3f0de0..0d4f101 100644 --- a/assets/formulas/conversions_and_constants.d4rt +++ b/assets/formulas/conversions_and_constants.d4rt @@ -1,12 +1,2 @@ [ - {"name":"Temperature converter","description":r""" -Simple temperature converter example that returns the input value (Kelvin) as output. - -Formula: $$T_{out} = T_{in}$$ - -Inputs: `Input` in kelvin (K). -Output: `Output` in kelvin (K). - -![Temperature scales (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Temperature_scales.svg/800px-Temperature_scales.svg.png) -""","input":[{"name":"Input","unit":"Kelvin"}],"output":{"name":"Output","unit":"Kelvin"},"d4rtCode":"Output = Input;","tags":["converter","temperature"]} ] diff --git a/assets/formulas/energy_and_power.d4rt b/assets/formulas/energy_and_power.d4rt index f4d5322..0d4f101 100644 --- a/assets/formulas/energy_and_power.d4rt +++ b/assets/formulas/energy_and_power.d4rt @@ -1,52 +1,2 @@ [ - {"name":"Kinetic Energy","description":r""" -Energy possessed by a moving object. - -$$KE = \frac{1}{2}mv^2$$ - -Where: -- $m$: Mass (kg) -- $v$: Velocity (m/s) - -![Kinetic energy (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Kinetic_energy.svg/1200px-Kinetic_energy.svg.png) -""","input":[{"name":"m","unit":"kilogram"},{"name":"v","unit":"meters per second"}],"output":{"name":"KE","unit":"joule"},"d4rtCode":"KE = 0.5 * m * pow(v, 2);","tags":["physics","energy","mechanics"]}, - {"name":"Work","description":r""" -Energy transferred when a force moves an object. - -$$W = F d \cos(\theta)$$ - -Where: -- $W$: Work (Joules) -- $F$: Force (Newtons) -- $d$: Displacement (meters) -- $\theta$: Angle between force and displacement - -![Work (diagram) (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Work.svg/800px-Work.svg.png) -""","input":[{"name":"F","unit":"newton"},{"name":"d","unit":"meter"},{"name":"theta","unit":"degree"}],"output":{"name":"W","unit":"joule"},"d4rtCode":"var thetaRad = theta * (pi / 180); W = F * d * cos(thetaRad);","tags":["physics","energy","mechanics"]}, - {"name":"Power","description":r""" -Rate at which work is done or energy is transferred. - -$$P = \frac{W}{t}$$ - -Where: -- $P$: Power (Watts) -- $W$: Work or energy (Joules) -- $t$: Time (seconds) - -![Power (diagram) (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Power_equation.svg/800px-Power_equation.svg.png) -""","input":[{"name":"W","unit":"joule"},{"name":"t","unit":"second"}],"output":{"name":"P","unit":"watt"},"d4rtCode":"P = W / t;","tags":["physics","energy","mechanics"]}, - {"name":"Mass-Energy Equivalence","description":r""" -Einstein's mass-energy equivalence relation. - -$$E = mc^2$$ - -Where: -- $E$: Energy (Joules) -- $m$: Mass (kg) -- $c$: Speed of light $299{,}792{,}458\ \mathrm{m/s}$ - -This shows mass can be converted to energy and vice versa. - -![Einstein formula (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/8/86/Einstein_light_beam.svg/800px-Einstein_light_beam.svg.png) -""","input":[{"name":"m","unit":"kilogram"}],"output":{"name":"E","unit":"joule"},"d4rtCode":"E = m * pow(299792458, 2);","tags":["physics","relativity","energy"]} ] diff --git a/assets/formulas/formulas.d4rt b/assets/formulas/formulas.d4rt index 7b3f7de..9357404 100644 --- a/assets/formulas/formulas.d4rt +++ b/assets/formulas/formulas.d4rt @@ -10,52 +10,7 @@ "d4rtCode": "Output = Input;", "tags": ["converter", "temperature" ] }, - // Free fall distance (vertical) - { - "name": "Free Fall Distance", - "description": r""" -Calculates vertical displacement under constant gravity -$$h = \frac{1}{2}gt^2$$ - -Where: -- $g$: Gravitational acceleration $9.81\ \mathrm{m/s^2}$ on Earth -- $t$: Time in free fall (seconds) - -![Free Fall Diagram](https://altcalculator.com/wp-content/uploads/2023/08/Free-Fall.png)""", - "input": [ - {"name": "t", "unit": "second"}, // Time in seconds - {"name": "g", "unit": "meters per second"} // Gravitational acceleration - ], - "output": {"name": "h", "unit": "meter"}, // Height in meters - "d4rtCode": "h = 0.5 * g * pow(t, 2);", - "tags": ["physics", "kinematics"] - }, - - // Newton's Law of Universal Gravitation - { - "name": "Gravitational Force", - "description": r''' -Newton's law of universal gravitation - -\(F = G\frac{m_1m_2}{r^2}\) - -Where: -- $G$: Gravitational constant $6.674\times 10^{-11}\ \mathrm{N\cdot m^2/kg^2}$ -- $m_1, m_2$: Masses of two objects -- $r$: Distance between centers of masses - -![Gravitation](https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/NewtonsLawOfUniversalGravitation.svg/1200px-NewtonsLawOfUniversalGravitation.svg.png)''', - "input": [ - {"name": "m1", "unit": "kilogram"}, // Mass 1 - {"name": "m2", "unit": "kilogram"}, // Mass 2 - {"name": "r", "unit": "meter"} // Distance between masses - ], - "output": {"name": "F", "unit": "newton"}, // Force in newtons - "d4rtCode": "F = (6.67430e-11 * m1 * m2) / pow(r, 2);", - "tags": ["physics", "astronomy", "gravity"] - }, - // Kinetic Energy { "name": "Kinetic Energy", diff --git a/assets/formulas/gravity.d4rt b/assets/formulas/gravity.d4rt index e69de29..84f415c 100644 --- a/assets/formulas/gravity.d4rt +++ b/assets/formulas/gravity.d4rt @@ -0,0 +1,48 @@ +[ + // Free fall distance (vertical) + { + "name": "Free Fall Distance", + "description": r""" +Calculates vertical displacement under constant gravity + +$$h = \frac{1}{2}gt^2$$ + +Where: +- $g$: Gravitational acceleration $9.81\ \mathrm{m/s^2}$ on Earth +- $t$: Time in free fall (seconds) + +![Free Fall Diagram](https://altcalculator.com/wp-content/uploads/2023/08/Free-Fall.png)""", + "input": [ + {"name": "t", "unit": "second"}, // Time in seconds + {"name": "g", "unit": "meters per second"} // Gravitational acceleration + ], + "output": {"name": "h", "unit": "meter"}, // Height in meters + "d4rtCode": "h = 0.5 * g * pow(t, 2);", + "tags": ["physics", "kinematics"] + }, + + // Newton's Law of Universal Gravitation + { + "name": "Gravitational Force", + "description": r''' +Newton's law of universal gravitation + +\(F = G\frac{m_1m_2}{r^2}\) + +Where: +- $G$: Gravitational constant $6.674\times 10^{-11}\ \mathrm{N\cdot m^2/kg^2}$ +- $m_1, m_2$: Masses of two objects +- $r$: Distance between centers of masses + +![Gravitation](https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/NewtonsLawOfUniversalGravitation.svg/1200px-NewtonsLawOfUniversalGravitation.svg.png)''', + "input": [ + {"name": "m1", "unit": "kilogram"}, // Mass 1 + {"name": "m2", "unit": "kilogram"}, // Mass 2 + {"name": "r", "unit": "meter"} // Distance between masses + ], + "output": {"name": "F", "unit": "newton"}, // Force in newtons + "d4rtCode": "F = (6.67430e-11 * m1 * m2) / pow(r, 2);", + "tags": ["physics", "astronomy", "gravity"] + }, + +] \ No newline at end of file diff --git a/assets/formulas/it-networking.d4rt b/assets/formulas/it-networking.d4rt new file mode 100644 index 0000000..3baaac3 --- /dev/null +++ b/assets/formulas/it-networking.d4rt @@ -0,0 +1,37 @@ +[ + { + "name": "Network Address from Host IP", + "description": r"""Calculates the network address from a host IP/MASK notation. + +Given a host IP address and subnet mask in CIDR notation (e.g., 192.168.1.100/24), +this formula extracts the network address (e.g., 192.168.1.0/24). + +Where: +- Host IP/MASK: IP address with CIDR subnet mask (e.g., 192.168.1.100/24) +- Network: The resulting network address in IP/MASK format (e.g., 192.168.1.0/24) + +The network address is calculated by applying the subnet mask to zero out the host bits.""", + "input": [ + {"name": "hostIP", "unit": "string"} + ], + "output": {"name": "network", "unit": "string"}, + "d4rtCode": r"""var parts = hostIP.split('/'); +var ip = parts[0]; +var mask = int.parse(parts[1]); +var octets = ip.split('.').map((e) => int.parse(e)).toList(); +var hostBits = 32 - mask; +var shiftAmount = hostBits; +var networkValue = 0; +for (var i = 0; i < 4; i++) { + networkValue = (networkValue << 8) | octets[i]; +} +networkValue = (networkValue >> shiftAmount) << shiftAmount; +var networkOctets = []; +for (var i = 0; i < 4; i++) { + networkOctets.insert(0, networkValue & 0xFF); + networkValue = networkValue >> 8; +} +network = networkOctets.join('.') + '/' + mask.toString();""", + "tags": ["networking", "ip", "subnetting", "cidr", "network"] + } +] diff --git a/assets/formulas/kinematics_and_dynamics.d4rt b/assets/formulas/kinematics_and_dynamics.d4rt index e69de29..32960f8 100644 --- a/assets/formulas/kinematics_and_dynamics.d4rt +++ b/assets/formulas/kinematics_and_dynamics.d4rt @@ -0,0 +1,2 @@ +[ +] \ No newline at end of file diff --git a/assets/formulas/materials_elasticity.d4rt b/assets/formulas/materials_elasticity.d4rt index dc16bb3..48e1ad2 100644 --- a/assets/formulas/materials_elasticity.d4rt +++ b/assets/formulas/materials_elasticity.d4rt @@ -1,16 +1,4 @@ [ - {"name":"Hooke's Law","description":r""" -Force exerted by a spring is proportional to its displacement (linear region). - -$$F = -kx$$ - -Where: -- $F$: Restoring force (Newtons) -- $k$: Spring constant (N/m) -- $x$: Displacement from equilibrium (meters) - -The negative sign indicates the force opposes displacement. - -![Hooke's law (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/HookesLaw.svg/800px-HookesLaw.svg.png) -""","input":[{"name":"k","unit":"newton per meter"},{"name":"x","unit":"meter"}],"output":{"name":"F","unit":"newton"},"d4rtCode":"F = -k * x;","tags":["physics","elasticity","oscillations"]} + {"name":"Hooke's Law","input":[{"name":"k","unit":"newton per meter"},{"name":"x","unit":"meter"}],"output":{"name":"F","unit":"newton"},"d4rtCode":"F = -k * x;","tags":["physics","elasticity","oscillations"]} ] + diff --git a/assets/formulas/medical_and_bio.d4rt b/assets/formulas/medical_and_bio.d4rt index 5136b6c..6a8bac0 100644 --- a/assets/formulas/medical_and_bio.d4rt +++ b/assets/formulas/medical_and_bio.d4rt @@ -1,16 +1,4 @@ [ - {"name":"Apgar Score","description":r""" -Newborn health assessment scoring system performed at 1 and 5 minutes after birth. - -The Apgar score sums five categories (0–2 points each): -1. Heart rate -2. Respiratory effort -3. Muscle tone -4. Reflex response -5. Color - -Total score ranges from 0 to 10. Higher scores indicate better newborn condition. - -![Apgar score (illustration) (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/8/80/Apgar_scale.svg/800px-Apgar_scale.svg.png) -""","input":[{"name":"HeartRate","values":["Absent","< 100 bpm>","> 100 bpm"]},{"name":"Breathing","values":["Absent","Weak, irregular","Strong, robust cry"]},{"name":"MuscleTone","values":["None","Some","Flexed arms/leg, resists extension"]},{"name":"Reflexes","values":["No response","Grimace on aggressive stimulation","Cry on stimulation"]},{"name":"SkinColor","values":["Blue or pale","Blue extremities, pink body","Pink"]}],"output":{"name":"Result","unit":"string"},"d4rtCode":"var total = indexOf(\"HeartRate\") + indexOf(\"Breathing\") + indexOf(\"MuscleTone\") + indexOf(\"Reflexes\") + indexOf(\"SkinColor\"); late var interpretation; if( total < 4 ) { interpretation = 'Critical condition'; } else if( total < 7 ){ interpretation = 'Needs assistance'; } else { interpretation = 'Normal'; } Result = 'Score: \$total - \$interpretation';","tags":["medical","pediatrics","assessment"]} + {"name":"Apgar Score","input":[{"name":"HeartRate","values":["Absent","< 100 bpm>","> 100 bpm"]},{"name":"Breathing","values":["Absent","Weak, irregular","Strong, robust cry"]},{"name":"MuscleTone","values":["None","Some","Flexed arms/leg, resists extension"]},{"name":"Reflexes","values":["No response","Grimace on aggressive stimulation","Cry on stimulation"]},{"name":"SkinColor","values":["Blue or pale","Blue extremities, pink body","Pink"]}],"output":{"name":"Result","unit":"string"},"d4rtCode":"var total = indexOf(\"HeartRate\") + indexOf(\"Breathing\") + indexOf(\"MuscleTone\") + indexOf(\"Reflexes\") + indexOf(\"SkinColor\"); late var interpretation; if( total < 4 ) { interpretation = 'Critical condition'; } else if( total < 7 ){ interpretation = 'Needs assistance'; } else { interpretation = 'Normal'; } Result = 'Score: \$total - \$interpretation';","tags":["medical","pediatrics","assessment"]} ] + diff --git a/assets/formulas/optics.d4rt b/assets/formulas/optics.d4rt index c41b756..f28a4c4 100644 --- a/assets/formulas/optics.d4rt +++ b/assets/formulas/optics.d4rt @@ -1,16 +1,4 @@ [ - {"name":"Snell's Law","description":r""" -Law describing refraction of light at an interface between two media. - -$$n_1 \sin(\theta_1) = n_2 \sin(\theta_2)$$ - -Where: -- $n_1, n_2$: Refractive indices -- $\theta_1$: Angle of incidence -- $\theta_2$: Angle of refraction - -This law explains how light bends when passing between materials. - -![Refraction diagram (Wikipedia)](https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Refraction_en.svg/800px-Refraction_en.svg.png) -""","input":[{"name":"n1","unit":"scalar"},{"name":"n2","unit":"scalar"},{"name":"theta1","unit":"degree"}],"output":{"name":"theta2","unit":"degree"},"d4rtCode":"var theta1Rad = theta1 * (pi / 180); var sinTheta2 = (n1 * sin(theta1Rad)) / n2; theta2 = asin(sinTheta2) * (180 / pi);","tags":["physics","optics","light"]} + {"name":"Snell's Law","input":[{"name":"n1","unit":"scalar"},{"name":"n2","unit":"scalar"},{"name":"theta1","unit":"degree"}],"output":{"name":"theta2","unit":"degree"},"d4rtCode":"var theta1Rad = theta1 * (pi / 180); var sinTheta2 = (n1 * sin(theta1Rad)) / n2; theta2 = asin(sinTheta2) * (180 / pi);","tags":["physics","optics","light"]} ] + diff --git a/assets/formulas/thermodynamics.d4rt b/assets/formulas/thermodynamics.d4rt index 94f813f..0d4f101 100644 --- a/assets/formulas/thermodynamics.d4rt +++ b/assets/formulas/thermodynamics.d4rt @@ -1,18 +1,2 @@ [ - {"name":"Ideal Gas Law","description":r""" -Equation of state for an ideal gas. - -$$PV = nRT$$ - -Where: -- $P$: Pressure (Pascals) -- $V$: Volume (m^3) -- $n$: Amount of substance (moles) -- $R$: Universal gas constant $8.314\ \mathrm{J/(mol\cdot K)}$ -- $T$: Temperature (Kelvin) - -This law combines Boyle's, Charles's and Avogadro's laws. - -![Ideal Gas](https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Ideal_gas_sphere.svg/800px-Ideal_gas_sphere.svg.png) -""","input":[{"name":"n","unit":"mole"},{"name":"T","unit":"kelvin"},{"name":"V","unit":"cubic meter"}],"output":{"name":"P","unit":"pascal"},"d4rtCode":"P = (n * 8.314462618 * T) / V;","tags":["physics","thermodynamics","gas"]} ] diff --git a/assets/formulas/trigonometry.d4rt b/assets/formulas/trigonometry.d4rt index e69de29..32960f8 100644 --- a/assets/formulas/trigonometry.d4rt +++ b/assets/formulas/trigonometry.d4rt @@ -0,0 +1,2 @@ +[ +] \ No newline at end of file diff --git a/lib/defaults/default_corpus.dart b/lib/defaults/default_corpus.dart index c0daed7..2b78476 100644 --- a/lib/defaults/default_corpus.dart +++ b/lib/defaults/default_corpus.dart @@ -52,10 +52,20 @@ Future createDefaultCorpus() async{ Future loadFormulas() async { final formulaResources = [ "assets/formulas/formulas.d4rt", + "assets/formulas/conversions_and_constants.d4rt", "assets/formulas/electromagnetism.d4rt", - "assets/formulas/thermodynamics.d4rt", + "assets/formulas/energy_and_power.d4rt", "assets/formulas/fluids_and_pressure.d4rt", - + "assets/formulas/geometry.d4rt", + "assets/formulas/gravity.d4rt", + "assets/formulas/it-networking.d4rt", + "assets/formulas/kinematics_and_dynamics.d4rt", + "assets/formulas/materials_elasticity.d4rt", + "assets/formulas/medical_and_bio.d4rt", + "assets/formulas/misc_math.d4rt", + "assets/formulas/optics.d4rt", + "assets/formulas/thermodynamics.d4rt", + "assets/formulas/trigonometry.d4rt", ]; for (final formRes in formulaResources) { @@ -63,6 +73,7 @@ Future createDefaultCorpus() async{ final literal = await loadResourceAsString(formRes); print( "Loaded $formRes"); final formulas = Formula.fromArrayStringLiteral(literal); + print( "Parsed $formRes"); final formulaElements = formulas.cast(); corpus.loadFormulaElements(formulaElements); } diff --git a/lib/main.dart b/lib/main.dart index da4781c..c2efe16 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:d4rt_formulas/d4rt_formulas.dart'; import 'package:flutter/material.dart'; import 'database/database_service.dart'; import 'package:drift/drift.dart' as drift; @@ -92,9 +93,9 @@ Future loadCorpusFromDatabaseOrAssets() async { // Load corpus from database elements return await Corpus.fromDatabaseElements(dbElements); } - } catch (e) { + } catch (e, st) { // If there's an error loading from database, fall back to default corpus - print('Error loading corpus from database: $e'); + errorHandler.notify(e,st); return await createDefaultCorpus(); } }