Compare commits
53 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
535a1b3aa9 | ||
|
|
5a26bf413a | ||
|
|
1cbcba924f | ||
|
|
af9b8dca29 | ||
|
|
965a0890cb | ||
|
|
2e823b6594 | ||
|
|
56f31b02aa | ||
|
|
2d260bd62c | ||
|
|
379eb68ce4 | ||
|
|
f077c0241f | ||
|
|
7bedad5d51 | ||
|
|
8a503f84e2 | ||
|
|
f89fd5c651 | ||
|
|
3983bf8590 | ||
|
|
c1fb867fa9 | ||
|
|
2c5a83c134 | ||
|
|
cb8bc643c4 | ||
|
|
967d62f826 | ||
|
|
f95678a66b | ||
|
|
77c79c7241 | ||
|
|
baa4979a96 | ||
|
|
2a5f4e6d89 | ||
|
|
c50b33e142 | ||
|
|
c8f49d173a | ||
|
|
e6f343c8c3 | ||
|
|
f844200b1b | ||
|
|
5802a254d0 | ||
|
|
615912836a | ||
|
|
b793b61bb6 | ||
|
|
52e3247f7e | ||
|
|
16ecf486c2 | ||
|
|
aa2fe7b31b | ||
|
|
a40ad665fe | ||
|
|
54356d53a9 | ||
|
|
d536fb33de | ||
|
|
fa717b2741 | ||
|
|
0a7b6145af | ||
|
|
7b4f467eec | ||
|
|
f72fc36427 | ||
|
|
3c6151385f | ||
|
|
03f063cbf2 | ||
|
|
a9e9fb63bf | ||
|
|
6bbade318d | ||
|
|
f3156e88dc | ||
|
|
13603d8db6 | ||
|
|
551853360c | ||
|
|
711a3e9182 | ||
|
|
7e1e81cc6f | ||
|
|
a01cb7a4be | ||
|
|
cb5d4bc49d | ||
|
|
67e3c44f54 | ||
|
|
e47753d5ab | ||
|
|
07d9b15ecc |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -37,3 +37,7 @@ workspace/.metadata/*
|
||||
|
||||
workspace/ts100/.settings/language.settings.xml
|
||||
workspace/ts100/.cproject
|
||||
TS100/KiCad/TS100.bak
|
||||
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/obj/
|
||||
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/bin/
|
||||
workspace/ts100/ts100.xml
|
||||
BIN
BatteryIcon.bmp
Normal file
BIN
BatteryIcon.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 630 B |
BIN
Logo GUI/TS100 Logo Editor/.vs/TS100 Logo Editor/v15/.suo
Normal file
BIN
Logo GUI/TS100 Logo Editor/.vs/TS100 Logo Editor/v15/.suo
Normal file
Binary file not shown.
22
Logo GUI/TS100 Logo Editor/TS100 Logo Editor.sln
Normal file
22
Logo GUI/TS100 Logo Editor/TS100 Logo Editor.sln
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.26430.15
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TS100 Logo Editor", "TS100 Logo Editor\TS100 Logo Editor.csproj", "{206C8AEF-3BE6-44E9-A1B0-25BF3805F1CB}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{206C8AEF-3BE6-44E9-A1B0-25BF3805F1CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{206C8AEF-3BE6-44E9-A1B0-25BF3805F1CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{206C8AEF-3BE6-44E9-A1B0-25BF3805F1CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{206C8AEF-3BE6-44E9-A1B0-25BF3805F1CB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
8
Logo GUI/TS100 Logo Editor/TS100 Logo Editor.userprefs
Normal file
8
Logo GUI/TS100 Logo Editor/TS100 Logo Editor.userprefs
Normal file
@@ -0,0 +1,8 @@
|
||||
<Properties StartupItem="TS100 Logo Editor/TS100 Logo Editor.csproj">
|
||||
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug" />
|
||||
<MonoDevelop.Ide.Workbench />
|
||||
<MonoDevelop.Ide.DebuggingService.Breakpoints>
|
||||
<BreakpointStore />
|
||||
</MonoDevelop.Ide.DebuggingService.Breakpoints>
|
||||
<MonoDevelop.Ide.DebuggingService.PinnedWatches />
|
||||
</Properties>
|
||||
6
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/App.config
Normal file
6
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/App.config
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
|
||||
</startup>
|
||||
</configuration>
|
||||
209
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/Form1.Designer.cs
generated
Normal file
209
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/Form1.Designer.cs
generated
Normal file
@@ -0,0 +1,209 @@
|
||||
namespace TS100_Logo_Editor
|
||||
{
|
||||
partial class Form1
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||
this.btnLoadImage = new System.Windows.Forms.Button();
|
||||
this.groupBox2 = new System.Windows.Forms.GroupBox();
|
||||
this.cbInvertImage = new System.Windows.Forms.CheckBox();
|
||||
this.gbScaling = new System.Windows.Forms.GroupBox();
|
||||
this.rbScaleStretch = new System.Windows.Forms.RadioButton();
|
||||
this.rbScaleFit = new System.Windows.Forms.RadioButton();
|
||||
this.pbImage = new System.Windows.Forms.PictureBox();
|
||||
this.groupBox3 = new System.Windows.Forms.GroupBox();
|
||||
this.btnSaveHex = new System.Windows.Forms.Button();
|
||||
this.groupBox1.SuspendLayout();
|
||||
this.groupBox2.SuspendLayout();
|
||||
this.gbScaling.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pbImage)).BeginInit();
|
||||
this.groupBox3.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// groupBox1
|
||||
//
|
||||
this.groupBox1.Controls.Add(this.btnLoadImage);
|
||||
this.groupBox1.Location = new System.Drawing.Point(20, 20);
|
||||
this.groupBox1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.groupBox1.Name = "groupBox1";
|
||||
this.groupBox1.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.groupBox1.Size = new System.Drawing.Size(300, 217);
|
||||
this.groupBox1.TabIndex = 0;
|
||||
this.groupBox1.TabStop = false;
|
||||
this.groupBox1.Text = "1. Load source Image";
|
||||
//
|
||||
// btnLoadImage
|
||||
//
|
||||
this.btnLoadImage.Location = new System.Drawing.Point(10, 31);
|
||||
this.btnLoadImage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.btnLoadImage.Name = "btnLoadImage";
|
||||
this.btnLoadImage.Size = new System.Drawing.Size(280, 35);
|
||||
this.btnLoadImage.TabIndex = 0;
|
||||
this.btnLoadImage.Text = "Load Image";
|
||||
this.btnLoadImage.UseVisualStyleBackColor = true;
|
||||
this.btnLoadImage.Click += new System.EventHandler(this.btnLoadImage_Click);
|
||||
//
|
||||
// groupBox2
|
||||
//
|
||||
this.groupBox2.Controls.Add(this.cbInvertImage);
|
||||
this.groupBox2.Controls.Add(this.gbScaling);
|
||||
this.groupBox2.Controls.Add(this.pbImage);
|
||||
this.groupBox2.Location = new System.Drawing.Point(330, 20);
|
||||
this.groupBox2.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.groupBox2.Name = "groupBox2";
|
||||
this.groupBox2.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.groupBox2.Size = new System.Drawing.Size(300, 217);
|
||||
this.groupBox2.TabIndex = 1;
|
||||
this.groupBox2.TabStop = false;
|
||||
this.groupBox2.Text = "2. Adjust image";
|
||||
//
|
||||
// cbInvertImage
|
||||
//
|
||||
this.cbInvertImage.AutoSize = true;
|
||||
this.cbInvertImage.Location = new System.Drawing.Point(138, 122);
|
||||
this.cbInvertImage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.cbInvertImage.Name = "cbInvertImage";
|
||||
this.cbInvertImage.Size = new System.Drawing.Size(75, 24);
|
||||
this.cbInvertImage.TabIndex = 2;
|
||||
this.cbInvertImage.Text = "Invert";
|
||||
this.cbInvertImage.UseVisualStyleBackColor = true;
|
||||
this.cbInvertImage.CheckedChanged += new System.EventHandler(this.cbInvertImage_CheckedChanged);
|
||||
//
|
||||
// gbScaling
|
||||
//
|
||||
this.gbScaling.Controls.Add(this.rbScaleStretch);
|
||||
this.gbScaling.Controls.Add(this.rbScaleFit);
|
||||
this.gbScaling.Location = new System.Drawing.Point(9, 91);
|
||||
this.gbScaling.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.gbScaling.Name = "gbScaling";
|
||||
this.gbScaling.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.gbScaling.Size = new System.Drawing.Size(120, 117);
|
||||
this.gbScaling.TabIndex = 1;
|
||||
this.gbScaling.TabStop = false;
|
||||
this.gbScaling.Text = "Scaling";
|
||||
//
|
||||
// rbScaleStretch
|
||||
//
|
||||
this.rbScaleStretch.AutoSize = true;
|
||||
this.rbScaleStretch.Location = new System.Drawing.Point(10, 68);
|
||||
this.rbScaleStretch.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.rbScaleStretch.Name = "rbScaleStretch";
|
||||
this.rbScaleStretch.Size = new System.Drawing.Size(86, 24);
|
||||
this.rbScaleStretch.TabIndex = 1;
|
||||
this.rbScaleStretch.Text = "Stretch";
|
||||
this.rbScaleStretch.UseVisualStyleBackColor = true;
|
||||
this.rbScaleStretch.CheckedChanged += new System.EventHandler(this.rbScaleStretch_CheckedChanged);
|
||||
//
|
||||
// rbScaleFit
|
||||
//
|
||||
this.rbScaleFit.AutoSize = true;
|
||||
this.rbScaleFit.Checked = true;
|
||||
this.rbScaleFit.Location = new System.Drawing.Point(10, 31);
|
||||
this.rbScaleFit.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.rbScaleFit.Name = "rbScaleFit";
|
||||
this.rbScaleFit.Size = new System.Drawing.Size(52, 24);
|
||||
this.rbScaleFit.TabIndex = 0;
|
||||
this.rbScaleFit.TabStop = true;
|
||||
this.rbScaleFit.Text = "Fit";
|
||||
this.rbScaleFit.UseVisualStyleBackColor = true;
|
||||
this.rbScaleFit.CheckedChanged += new System.EventHandler(this.rbScaleFit_CheckedChanged);
|
||||
//
|
||||
// pbImage
|
||||
//
|
||||
this.pbImage.BackColor = System.Drawing.Color.Black;
|
||||
this.pbImage.Location = new System.Drawing.Point(4, 31);
|
||||
this.pbImage.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.pbImage.Name = "pbImage";
|
||||
this.pbImage.Size = new System.Drawing.Size(192, 32);
|
||||
this.pbImage.TabIndex = 0;
|
||||
this.pbImage.TabStop = false;
|
||||
//
|
||||
// groupBox3
|
||||
//
|
||||
this.groupBox3.Controls.Add(this.btnSaveHex);
|
||||
this.groupBox3.Location = new System.Drawing.Point(640, 20);
|
||||
this.groupBox3.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.groupBox3.Name = "groupBox3";
|
||||
this.groupBox3.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.groupBox3.Size = new System.Drawing.Size(300, 217);
|
||||
this.groupBox3.TabIndex = 2;
|
||||
this.groupBox3.TabStop = false;
|
||||
this.groupBox3.Text = "3. Export";
|
||||
//
|
||||
// btnSaveHex
|
||||
//
|
||||
this.btnSaveHex.Location = new System.Drawing.Point(8, 91);
|
||||
this.btnSaveHex.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.btnSaveHex.Name = "btnSaveHex";
|
||||
this.btnSaveHex.Size = new System.Drawing.Size(280, 35);
|
||||
this.btnSaveHex.TabIndex = 0;
|
||||
this.btnSaveHex.Text = "Save DFU File";
|
||||
this.btnSaveHex.UseVisualStyleBackColor = true;
|
||||
this.btnSaveHex.Click += new System.EventHandler(this.btnSaveHex_Click);
|
||||
//
|
||||
// Form1
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(963, 265);
|
||||
this.Controls.Add(this.groupBox3);
|
||||
this.Controls.Add(this.groupBox2);
|
||||
this.Controls.Add(this.groupBox1);
|
||||
this.DoubleBuffered = true;
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
|
||||
this.Name = "Form1";
|
||||
this.ShowIcon = false;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "TS100 Custom Logo editor";
|
||||
this.groupBox1.ResumeLayout(false);
|
||||
this.groupBox2.ResumeLayout(false);
|
||||
this.groupBox2.PerformLayout();
|
||||
this.gbScaling.ResumeLayout(false);
|
||||
this.gbScaling.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pbImage)).EndInit();
|
||||
this.groupBox3.ResumeLayout(false);
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.GroupBox groupBox1;
|
||||
private System.Windows.Forms.Button btnLoadImage;
|
||||
private System.Windows.Forms.GroupBox groupBox2;
|
||||
private System.Windows.Forms.CheckBox cbInvertImage;
|
||||
private System.Windows.Forms.GroupBox gbScaling;
|
||||
private System.Windows.Forms.RadioButton rbScaleStretch;
|
||||
private System.Windows.Forms.RadioButton rbScaleFit;
|
||||
private System.Windows.Forms.PictureBox pbImage;
|
||||
private System.Windows.Forms.GroupBox groupBox3;
|
||||
private System.Windows.Forms.Button btnSaveHex;
|
||||
}
|
||||
}
|
||||
|
||||
169
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/Form1.cs
Normal file
169
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/Form1.cs
Normal file
@@ -0,0 +1,169 @@
|
||||
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace TS100_Logo_Editor
|
||||
{
|
||||
public partial class Form1 : Form
|
||||
{
|
||||
public Form1()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
Image sourceImage;
|
||||
const int LCDWidth = 96;
|
||||
Bitmap PureBMP;
|
||||
private void btnLoadImage_Click(object sender, EventArgs e)
|
||||
{
|
||||
//load in an image
|
||||
OpenFileDialog dlg = new OpenFileDialog();
|
||||
dlg.Title = "Select Image";
|
||||
dlg.Filter = "Image files (*.jpg, *.jpeg, *.bmp, *.png) | *.jpg; *.jpeg; *.bmp; *.png";
|
||||
if (dlg.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
//user has selected an image
|
||||
string filename = dlg.FileName;
|
||||
sourceImage = Image.FromFile(filename);
|
||||
reDrawPreview();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void reDrawPreview()
|
||||
{
|
||||
PureBMP = new Bitmap(LCDWidth, 16);
|
||||
//scale mode
|
||||
if (rbScaleFit.Checked)
|
||||
{
|
||||
//fit
|
||||
float scalefactor = Math.Min((float)PureBMP.Width / (float)sourceImage.Width, (float)PureBMP.Height / (float)sourceImage.Height);
|
||||
using (Graphics g = Graphics.FromImage(PureBMP))
|
||||
{
|
||||
g.DrawImage(sourceImage, new RectangleF(0, 0, sourceImage.Width * scalefactor, sourceImage.Height * scalefactor));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//draw image stretched
|
||||
using (Graphics g = Graphics.FromImage(PureBMP))
|
||||
{
|
||||
g.DrawImage(sourceImage, new RectangleF(0, 0, LCDWidth, 16));
|
||||
}
|
||||
}
|
||||
//We now have our downsampled colour image
|
||||
//apply inversion
|
||||
if (cbInvertImage.Checked)
|
||||
{
|
||||
for (int y = 0; (y <= (PureBMP.Height - 1)); y++)
|
||||
{
|
||||
for (int x = 0; (x <= (PureBMP.Width - 1)); x++)
|
||||
{
|
||||
Color inv = PureBMP.GetPixel(x, y);
|
||||
inv = Color.FromArgb(255, (255 - inv.R), (255 - inv.G), (255 - inv.B));
|
||||
PureBMP.SetPixel(x, y, inv);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Threshold image
|
||||
PureBMP = GrayScale(PureBMP);
|
||||
//draw image at 2x scale
|
||||
Bitmap bBig = new Bitmap(pbImage.Width, pbImage.Height);
|
||||
using (Graphics g = Graphics.FromImage(bBig))
|
||||
{
|
||||
g.DrawImage(PureBMP, new RectangleF(0, 0, pbImage.Width, pbImage.Height));
|
||||
}
|
||||
pbImage.Image = bBig;
|
||||
}
|
||||
public Bitmap GrayScale(Bitmap Bmp)
|
||||
{
|
||||
int rgb;
|
||||
Color c;
|
||||
|
||||
for (int y = 0; y < Bmp.Height; y++)
|
||||
for (int x = 0; x < Bmp.Width; x++)
|
||||
{
|
||||
c = Bmp.GetPixel(x, y);
|
||||
rgb = (int)((c.R + c.G + c.B) / 3);
|
||||
if (rgb > 128)
|
||||
rgb = 0xFF;
|
||||
else
|
||||
rgb = 0x00;
|
||||
Bmp.SetPixel(x, y, Color.FromArgb(rgb, rgb, rgb));
|
||||
}
|
||||
return Bmp;
|
||||
}
|
||||
|
||||
private void rbScaleStretch_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
reDrawPreview();
|
||||
}
|
||||
|
||||
private void rbScaleFit_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
reDrawPreview();
|
||||
}
|
||||
|
||||
private void cbInvertImage_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
reDrawPreview();
|
||||
}
|
||||
|
||||
private void btnSaveHex_Click(object sender, EventArgs e)
|
||||
{
|
||||
Bitmap bmp = PureBMP;
|
||||
//convert image to byte array
|
||||
byte[] data = new byte[1024];
|
||||
data[0] = 0xAA;
|
||||
data[1] = 0x55;
|
||||
data[2] = 0xF0;
|
||||
data[3] = 0x0D;
|
||||
|
||||
for (int i = 0; i < (LCDWidth * 16 / 8); i++)
|
||||
{
|
||||
//loop through all the bytes
|
||||
byte b = 0;//local byte
|
||||
//i sets the starting column
|
||||
for (int y = 0; y < 8; y++)
|
||||
{
|
||||
var px = bmp.GetPixel(i % LCDWidth, (i / LCDWidth) == 1 ? 8 + y : y);
|
||||
//we loop down the picture
|
||||
//LSB is the top, MSB is the bottom
|
||||
if (px.R >= 128)
|
||||
{
|
||||
//pixel is white
|
||||
b |= (byte)(1 << y);
|
||||
}
|
||||
}
|
||||
data[i + 4] = b;
|
||||
}
|
||||
//We should now have the byte array that represents the image in the LCD format.
|
||||
//We now send this off to be encoded by the Intel Encoder
|
||||
//Flip all uint16_t pairs
|
||||
for (int i = 0; i < data.Length; i += 2)
|
||||
{
|
||||
//we need to swap each pair
|
||||
byte temp = data[i];
|
||||
data[i] = data[i + 1];
|
||||
data[i + 1] = temp;
|
||||
}
|
||||
string outputHexFile = IntelHex.IntelHex.encode(data, 0x0800B800, 16, true, true);//16 bytes is the only format the DFU seems to support //0x0800B800
|
||||
//^ This string now just needs to be written out to a text file :)
|
||||
SaveFileDialog dlg = new SaveFileDialog();
|
||||
dlg.Title = "Save DFU File";
|
||||
dlg.AddExtension = true;
|
||||
dlg.DefaultExt = ".hex";
|
||||
dlg.Filter = "Hex Files(*.hex)|*.hex";
|
||||
if (dlg.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
//The user has selected where they want to save the file
|
||||
using (var fs = new System.IO.StreamWriter(dlg.FileName))
|
||||
{
|
||||
fs.Write(outputHexFile);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
120
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/Form1.resx
Normal file
120
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/Form1.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
96
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/IntelHex.cs
Normal file
96
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/IntelHex.cs
Normal file
@@ -0,0 +1,96 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
|
||||
namespace IntelHex
|
||||
{
|
||||
public class IntelHex
|
||||
{
|
||||
public static string encode(byte[] data, UInt32 startingAddress, int bytesPerLine, bool header = true,bool Addbloat=false)
|
||||
{
|
||||
//We are taking the byte array and encoding it into the wanted hex file contents (aka string of data).
|
||||
//First create the starting base address record
|
||||
//:020000040800F2
|
||||
string Output = "";
|
||||
if (header)
|
||||
{
|
||||
//Set the upper 16 bits of the address space
|
||||
Output += getHighAddressSetLine((UInt16)(startingAddress >> 16));
|
||||
}
|
||||
|
||||
//Now loop through all the data that we were given
|
||||
for (UInt32 index = 0; index < data.Length; index = (UInt32)(index + bytesPerLine))
|
||||
{
|
||||
//We want to read from data[index] to data[index+bytesPerLine-1]
|
||||
UInt32 currentAddress = (UInt32)(startingAddress + index);
|
||||
if ((currentAddress >> 16) != (startingAddress >> 16))
|
||||
{
|
||||
Output += getHighAddressSetLine((UInt16)(currentAddress >> 16));
|
||||
//The address has rolled over the 64K boundry, so write a new high address change line
|
||||
}
|
||||
//We should now be good for the higher part of the address
|
||||
Output += encodeDataLine((UInt16)(currentAddress & 0xFFFF), data, index, bytesPerLine);
|
||||
}
|
||||
if(Addbloat)
|
||||
{
|
||||
//Repeat the instructs a stack of times to get around filesize minimums
|
||||
for(int x=0;x<3;x++)
|
||||
{
|
||||
for (UInt32 index = 0; index < data.Length; index = (UInt32)(index + bytesPerLine))
|
||||
{
|
||||
//We want to read from data[index] to data[index+bytesPerLine-1]
|
||||
UInt32 currentAddress = (UInt32)(startingAddress + index);
|
||||
if ((currentAddress >> 16) != (startingAddress >> 16))
|
||||
{
|
||||
Output += getHighAddressSetLine((UInt16)(currentAddress >> 16));
|
||||
//The address has rolled over the 64K boundry, so write a new high address change line
|
||||
}
|
||||
//We should now be good for the higher part of the address
|
||||
Output += encodeDataLine((UInt16)(currentAddress & 0xFFFF), data, index, bytesPerLine);
|
||||
}
|
||||
}
|
||||
}
|
||||
//We have now written out all the data lines
|
||||
Output += ":00000001FF\r\n";//End of file marker
|
||||
|
||||
return Output;
|
||||
}
|
||||
private static string encodeDataLine(UInt16 address, byte[] data, UInt32 startindex, int bytes)
|
||||
{
|
||||
string line = ":";
|
||||
line += bytes.ToString("X2");//add the marker of line length
|
||||
line += address.ToString("X4");//write the address
|
||||
line += "00";//Data line
|
||||
//Next copy bytes bytes
|
||||
for (int i = 0; i < bytes; i++)
|
||||
{
|
||||
if ((startindex + i) < data.Length)
|
||||
line += data[startindex + i].ToString("X2");
|
||||
else
|
||||
line += "FF";//pad images out with FF
|
||||
}
|
||||
line += checksumLine(line);//Adds checksum and EOL
|
||||
return line;
|
||||
}
|
||||
private static string getHighAddressSetLine(UInt16 HighAddress)
|
||||
{
|
||||
string Output = "";
|
||||
Output += ":02000004" + (HighAddress).ToString("X4");
|
||||
Output += checksumLine(Output);
|
||||
return Output;
|
||||
}
|
||||
private static string checksumLine(string line)
|
||||
{
|
||||
//We want to convert the string line to each byte and sum.
|
||||
byte sum = 0;
|
||||
for (int i = 1; i < line.Length; i += 2)
|
||||
{
|
||||
byte b = byte.Parse((line.Substring(i, 2)), System.Globalization.NumberStyles.HexNumber);
|
||||
sum += b;
|
||||
}
|
||||
byte checksum = (byte)(((byte)0) - sum);//invert
|
||||
return checksum.ToString("X2") + "\r\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
22
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/Program.cs
Normal file
22
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/Program.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace TS100_Logo_Editor
|
||||
{
|
||||
static class Program
|
||||
{
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
static void Main()
|
||||
{
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
Application.Run(new Form1());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("TS100 Logo Editor")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("TS100 Logo Editor")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2017")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("206c8aef-3be6-44e9-a1b0-25bf3805f1cb")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
63
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/Properties/Resources.Designer.cs
generated
Normal file
63
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/Properties/Resources.Designer.cs
generated
Normal file
@@ -0,0 +1,63 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace TS100_Logo_Editor.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TS100_Logo_Editor.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
26
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/Properties/Settings.Designer.cs
generated
Normal file
26
Logo GUI/TS100 Logo Editor/TS100 Logo Editor/Properties/Settings.Designer.cs
generated
Normal file
@@ -0,0 +1,26 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace TS100_Logo_Editor.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.1.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,87 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{206C8AEF-3BE6-44E9-A1B0-25BF3805F1CB}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<RootNamespace>TS100_Logo_Editor</RootNamespace>
|
||||
<AssemblyName>TS100 Logo Editor</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>
|
||||
</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<StartupObject>TS100_Logo_Editor.Program</StartupObject>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Form1.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Form1.Designer.cs">
|
||||
<DependentUpon>Form1.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="IntelHex.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<EmbeddedResource Include="Form1.resx">
|
||||
<DependentUpon>Form1.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
||||
207
README.md
207
README.md
@@ -1,75 +1,228 @@
|
||||
# TS100
|
||||
This is a complete re-write of the open source software for the ts100 soldering iron.
|
||||
This project is feature complete for use as a soldering iron, but is still open to ideas and suggestions.
|
||||
This is a complete rewrite of the open source software for the ts100 soldering iron.
|
||||
This project is feature complete for use as a soldering iron, *so please suggest any feature improvements you would like!*
|
||||
A short(ish) video that goes through every single menu option in the firmware is available [over here](https://www.youtube.com/watch?v=WlnpboYfxNk)
|
||||
|
||||
This project was started to remove the need for USB for changing system settings.
|
||||
In the latest official firmware they have also added a settings menu system, so it is still worth comparing the two firmwares to select your preferred option.
|
||||
|
||||
**Please note that when running the iron off a Lithium battery pack, the Iron is only rated to 24V input. So using a fully charged 6S battery exceeds this rating, and is done so at your own risk.
|
||||
Please calibrate your irons voltage reading when you are using a lithium battery after any firmware upgrades.**
|
||||
|
||||
## Features
|
||||
* Soldering / Temperature control
|
||||
* Full PID iron temperature control
|
||||
* Automatic sleep with selectable sensitivity
|
||||
* Motion wake support
|
||||
* Settings menu
|
||||
* Input voltage UVLO measurement for battery powered use
|
||||
* Set a voltage lower limit for Lithium batteries so you dont kill your battery pack. Please calibrate your input voltage first!
|
||||
* All settings saved
|
||||
* Improved readability Fonts
|
||||
* Use hardware features to improve reliability
|
||||
* Can disable movement detection if desired
|
||||
* Calibration of the temperature offset
|
||||
* Boost mode lets you temporarily change the temperature when soldering
|
||||
* Battery charge level indicatior if power source set to a lipo cell count.
|
||||
* Custom bootup logo support
|
||||
* Automatic LCD rotation based on orientation
|
||||
|
||||
# Upgrading your ts100 iron
|
||||
|
||||
This is completely safe, if it goes wrong just put the .hex file from the official website onto the unit and your back to the old firmware. Downloads for the hex files to flash are available on the [releases page.](https://github.com/Ralim/ts100/releases)
|
||||
**You will need a windows computer (7,8,10 tested), using the normal windows explorer to load the firmware.
|
||||
The bootloader does not appear to work under mac or linux at the moment.**
|
||||
Officially the bootloader on the iron only works under windows. However, users have reported that it does work under Mac, and can be made to work under Linux *sometimes*. Details over on the [wiki page](https://github.com/Ralim/ts100/wiki/Upgrading*Firmware).
|
||||
|
||||
1. Hold the button closest to the tip, and plug in the USB to the computer.
|
||||
2. The unit will appear as a USB drive.
|
||||
3. Drag the .hex file onto the USB drive.
|
||||
4. The unit will disconnect and reconnect.
|
||||
5. The filename will have changed to end in .RDY or .ERR .
|
||||
6. If it ends with .RDY your done! Otherwise something went wrong.
|
||||
5. The filename will have changed to end in .RDY or .ERR
|
||||
6. If it ends with .RDY you're done! Otherwise something went wrong.
|
||||
7. Disconnect the USB and power up the iron. You're good to go.
|
||||
|
||||
For the more adventurerous out there, you can also load this firmware onto the device using a SWD programmer.
|
||||
On the bottom of the MCU riser pcb, there are 4 pads for programming.
|
||||
There is a complete device flash backup included in this repository. (Note this includes the bootloader, so will need a SWD programmer to load onto the unit). Please do not use the backup of the bootloader for anything malicious, its only saved here for those who are tinkering with their iron and decide to replace it.
|
||||
|
||||
# New Menu System
|
||||
## Setting a custom bootup image
|
||||
|
||||
This firmware uses a different method of updating the bootup image.
|
||||
This removes the need for emulating a USB drive on the iron just to allow for a bootup image to be setup.
|
||||
At this point in time you will need a windows machine to make the required .hex file for you image.
|
||||
*If you know what your doing, this program will run fine through mono on other systems*
|
||||
|
||||
1. On the [releases page](https://github.com/Ralim/ts100/releases) you will need to download the latest copy of the GUI Tool (*TS100.Logo.Editor.exe*).
|
||||
2. Launch the TS100 Logo Editor, you will need to have .NET 4.0 installed on your machine
|
||||
3. On the tool open the source image that you would like to use as your bootup screen. A resolution of 96x16 is ideal, but you can fill or stretch your logo to fit
|
||||
4. Colour images are okay, the software will convert them to B&W for you.
|
||||
5. You can also invert colours if you would prefer.
|
||||
6. Save the created file as a *.hex* file somewhere.
|
||||
7. Connect your iron to your computer in DFU mode (same as you would to upgrade firmware).
|
||||
8. Drag the created .hex file for the logo onto the iron to update it with the file.
|
||||
9. You should be good to go.
|
||||
10. The image will stay through future updates, but if it ever wont I will put a warning in the update download on the releases page.
|
||||
|
||||
## New Menu System
|
||||
|
||||
This new firmware uses a new menu system to allow access to the settings on the device.
|
||||
When on the main screen, the unit shows prompts for the two most common operations.
|
||||
-> Pressing the button near the tip enters soldering mode
|
||||
-> Pressing the button near the power input enters the settings menu.
|
||||
-> Pressing both buttons together enters the Extras menu
|
||||
* Pressing the button near the tip enters soldering mode
|
||||
* Pressing the button near the power input enters the settings menu.
|
||||
* Pressing both buttons together enters the Extras menu
|
||||
|
||||
## Soldering mode
|
||||
|
||||
In this mode the iron works as you would expect, pressing either button will take you to a temperature change screen. Use each button to go up and down in temperature. Pressing both buttons will exit you from the temperature menu (or wait 3 seconds and it will time out).
|
||||
Pressing both buttons will also exit the soldering mode.
|
||||
|
||||
## Settings Menu
|
||||
|
||||
This menu allows you to cycle through all the options and set their values.
|
||||
The button near the tip cycles through the options, and the one near the usb changes the selected option.
|
||||
Note that settings are not saved until you exit the menu, and some settings such as screen flip do not apply until a power cycle is applied.
|
||||
If you leave the unit alone (ie don't press any buttons) on a setting, after 3 seconds the screen will scroll a longer version of the name
|
||||
|
||||
* UVCO -> Undervoltage cut out level, settable in 1V increments from 10-24V
|
||||
* STIME -> Sleep time, how long it takes before the unit goes to sleep
|
||||
* PWRSC -> Power source, select a cell count if using a LiPo, or DC to disable the shutdown. (Sets it to minimum of 10V).
|
||||
* STMP -> The temperature the unit drops to in sleep mode
|
||||
* MOTION -> Wether motion detection is enabled or not
|
||||
* SLTME -> Sleep time, how long it takes before the unit goes to sleep
|
||||
* SHTME -> Shutdown Time, how long the unit will wait after movement before shutting down completely
|
||||
* MSENSE -> Motion Sensitivity,0*9,0 means motion sensing is turned off, 9 is most sensitive, 1 is least sensitive (ie takes more movement to trigger)
|
||||
* TMPUNIT -> Temperature unit, C or F
|
||||
* FLPDSP -> Flip display for left handed users
|
||||
* SENSE -> Motion Sensitivity, H is more sensitive. L is lowest sensitivity (ie takes more movement to trigger)
|
||||
* TMPRND -> Temperature Rounding, {1,5,10}
|
||||
* TMPSPD -> How fast the temperature should update in the soldering status screen.
|
||||
* DSPROT -> Display rotation mode, Automatic, Left handed or Right handed
|
||||
* BOOST -> Enable boost mode
|
||||
* BTMP -> Set the temperature for the boost mode
|
||||
|
||||
Temperature rounding means that the unit will round off the temperature before displaying. This can helpt to reduce the flickering of the temperature when the unit oscillates between two temperatures.
|
||||
|
||||
## Extras Menu
|
||||
This menu defaults to showing the current temperature on the tip. Pressing the button near the iron tip will show the current input voltage. Pressing the button near the usb enters the temperature offset setting menu, when the iron is cold, pressing the other button will start the unit calibrating for any offset in the tip temperature.
|
||||
|
||||
# Version Changes:
|
||||
This menu defaults to showing the current temperature on the tip.
|
||||
Pressing the button near the iron tip will show the current input voltage. Pressing the other button while this is show will allow you to calibrate the reading if your iron is like mine and is not overly accurate out of the factory. (Press buttons to change measurement up and down, press both to exit and save).
|
||||
|
||||
Pressing the button near the usb enters the temperature offset setting menu, when the iron is cold, pressing the other button will start the unit calibrating for any offset in the tip temperature.
|
||||
|
||||
### Calibrating input voltage
|
||||
|
||||
Due to the tolerance on the resistors used for the input voltage divider, some irons can be up to 0.6V out on the voltage measurement.
|
||||
Please, Please, calibrate your iron if you have any issues with the cutoff voltage. This is more critical than before with the new cell count based cutout voltage.
|
||||
|
||||
To calibrate your Iron:
|
||||
|
||||
1. Measure the input voltage with a multimeter and note it down.
|
||||
2. Connect the input to your iron.
|
||||
3. On the home screen (showing iron symbol), press both buttons simultainiously.
|
||||
4. The iron will now show the tip temperature.
|
||||
5. Press the button near the soldering iron tip.
|
||||
6. The screen will display the measured input voltage.
|
||||
7. If this is the same as what you measured before skip to step 13
|
||||
8. Otherwise, press the button near the USB end of the iron
|
||||
9. The voltage will now slowly blink.
|
||||
10. Use the buttons to adjust the reading up and down until it reads as close as possible to the voltage you measured earlier.
|
||||
11. When it is reading as close as possible, press both buttons at once.
|
||||
12. The screen will go back to just showing the input voltage.
|
||||
13. Press the button near the tip of the iron to exit back to the live temperature display.
|
||||
14. Press both buttons at once to exit back to the idle screen.
|
||||
15. You're done. Enjoy your iron.
|
||||
|
||||
### Calibrating tip offset
|
||||
|
||||
Some tips will have an offset on their readings, to calibrate this out perform the following steps:
|
||||
|
||||
1. Connect power to your iron
|
||||
2. Make sure the tip is at room temperature (ie. wait for a fair while after using the iron before calibration)
|
||||
3. Press both buttons on the idle screen (showing the logo for the iron. The screen you see after power is applied).
|
||||
4. The iron will now show the current tip temperature.
|
||||
5. Press the button near the USB port.
|
||||
6. The display will change to "CAL TEMP"
|
||||
7. Press the button near the tip of the iron to confirm.
|
||||
8. The display should change to "CAL OK". If you recieve "CAL FAIL" let your tip cool down for longer, its too hot.
|
||||
9. Press the button near the USB port to exit back to live temperature display
|
||||
10. Press both buttons at the same time to return to the idle screen.
|
||||
11. You're done. Enjoy your iorn.
|
||||
|
||||
### Boost mode
|
||||
|
||||
This allows you to change the front key (one near the tip) to become a boost button instead of going to temperature editing when in soldering mode. This allows you to set this button to change the soldering temperature for short periods. For example when soldering a big joint and you want to boost the temperature a bit.
|
||||
|
||||
The boost temperature is set in the settings menu.
|
||||
|
||||
## Commercial Use
|
||||
|
||||
This software is provided as-is, so I cannot provide any commercial support for the firmware. However you are more than welcome to distribute links to the firmware, or provide irons with this software on them.
|
||||
Please do not re-host the files, but rather link to this page, so that there are not old versions of the firmware hanging around. If this firmware does make you money, it would be nice to recieve a donation, however I dont enforce this.
|
||||
|
||||
## Version Changes
|
||||
|
||||
V1.16
|
||||
|
||||
* Added automatic rotation support
|
||||
* Added power display graph
|
||||
|
||||
V1.15
|
||||
|
||||
* Added support for a custom bootup logo to be programmed via the DFU bootloader.
|
||||
|
||||
V1.14
|
||||
|
||||
* Changed input voltage cutoff to be based on cell count rather than voltage.
|
||||
|
||||
V1.13
|
||||
|
||||
* Swapped buttons for menu to prevent accidentally changing first menu item
|
||||
* Added auto key repeat.
|
||||
|
||||
V1.12
|
||||
|
||||
* Increases sensitivity options to be 1*9 with 0 off state
|
||||
* Fixes issue where going from COOL *> soldering can leave screen off.
|
||||
|
||||
V1.11
|
||||
|
||||
* Boost mode
|
||||
* Change sensitivity options to be 1*8
|
||||
|
||||
V1.10
|
||||
|
||||
* Adds help text to settings
|
||||
* Improves settings for the display update rate
|
||||
|
||||
V1.09
|
||||
|
||||
* Adds display modes, for slowing down or simplifying the display
|
||||
|
||||
V1.08
|
||||
|
||||
* Fix settings menu not showing flip display
|
||||
|
||||
V1.07
|
||||
|
||||
* Adds shutdown time to automatically shutdown the iron after inactivity
|
||||
|
||||
V1.06
|
||||
|
||||
* Changes H and C when the iron is heating to the minidso chevron like images
|
||||
|
||||
V1.05
|
||||
|
||||
* Adds ability to calibrate the input voltage measurement
|
||||
|
||||
V1.04
|
||||
- Increased accuracy of the temperature control
|
||||
- Improved PID response slightly
|
||||
- Allows temperature offset calibration
|
||||
- Nicer idle screen
|
||||
|
||||
* Increased accuracy of the temperature control
|
||||
* Improved PID response slightly
|
||||
* Allows temperature offset calibration
|
||||
* Nicer idle screen
|
||||
|
||||
V1.03
|
||||
- Improved Button handling
|
||||
- Ability to set motion sensitivity
|
||||
- DC voltmeter page shows input voltage
|
||||
|
||||
* Improved Button handling
|
||||
* Ability to set motion sensitivity
|
||||
* DC voltmeter page shows input voltage
|
||||
|
||||
V1.02
|
||||
- Adds hold both buttons on IDLE to access the therometer mode.
|
||||
- Changes the exit soldering mode to be holding both buttons (Like original firmware).
|
||||
|
||||
* Adds hold both buttons on IDLE to access the therometer mode.
|
||||
* Changes the exit soldering mode to be holding both buttons (Like original firmware).
|
||||
|
||||
If you love this firmware and want to continue my caffine addiction, you can do so here (or email me for other options) : https://paypal.me/RalimTek
|
||||
|
||||
392
TS100/KiCad/MCU_SubBoard.sch
Normal file
392
TS100/KiCad/MCU_SubBoard.sch
Normal file
@@ -0,0 +1,392 @@
|
||||
EESchema Schematic File Version 2
|
||||
LIBS:power
|
||||
LIBS:device
|
||||
LIBS:transistors
|
||||
LIBS:conn
|
||||
LIBS:linear
|
||||
LIBS:regul
|
||||
LIBS:74xx
|
||||
LIBS:cmos4000
|
||||
LIBS:adc-dac
|
||||
LIBS:memory
|
||||
LIBS:xilinx
|
||||
LIBS:microcontrollers
|
||||
LIBS:dsp
|
||||
LIBS:microchip
|
||||
LIBS:analog_switches
|
||||
LIBS:motorola
|
||||
LIBS:texas
|
||||
LIBS:intel
|
||||
LIBS:audio
|
||||
LIBS:interface
|
||||
LIBS:digital-audio
|
||||
LIBS:philips
|
||||
LIBS:display
|
||||
LIBS:cypress
|
||||
LIBS:siliconi
|
||||
LIBS:opto
|
||||
LIBS:atmel
|
||||
LIBS:contrib
|
||||
LIBS:valves
|
||||
LIBS:stm32
|
||||
LIBS:mma8652fc
|
||||
LIBS:switches
|
||||
LIBS:TS100-cache
|
||||
EELAYER 25 0
|
||||
EELAYER END
|
||||
$Descr A4 11693 8268
|
||||
encoding utf-8
|
||||
Sheet 2 2
|
||||
Title "TS100 Soldering Iron Schematic"
|
||||
Date ""
|
||||
Rev "2.46"
|
||||
Comp ""
|
||||
Comment1 ""
|
||||
Comment2 ""
|
||||
Comment3 "Converted by Ben V. Brown"
|
||||
Comment4 "KiCad port of published schematic"
|
||||
$EndDescr
|
||||
$Comp
|
||||
L STM32F103T8Ux U4
|
||||
U 1 1 591D59BB
|
||||
P 5600 3550
|
||||
F 0 "U4" H 3200 4675 50 0000 L BNN
|
||||
F 1 "STM32F103T8Ux" H 8000 4675 50 0000 R BNN
|
||||
F 2 "Housings_DFN_QFN:QFN-36-1EP_6x6mm_Pitch0.5mm" H 8000 4625 50 0001 R TNN
|
||||
F 3 "" H 5600 3550 50 0001 C CNN
|
||||
F 4 "-" H 5600 3550 60 0001 C CNN "bom_partno"
|
||||
1 5600 3550
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L GND #PWR206
|
||||
U 1 1 591D5AD3
|
||||
P 5600 4850
|
||||
F 0 "#PWR206" H 5600 4600 50 0001 C CNN
|
||||
F 1 "GND" H 5600 4700 50 0000 C CNN
|
||||
F 2 "" H 5600 4850 50 0001 C CNN
|
||||
F 3 "" H 5600 4850 50 0001 C CNN
|
||||
1 5600 4850
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L C C30
|
||||
U 1 1 591D5BA8
|
||||
P 1450 4700
|
||||
F 0 "C30" H 1475 4800 50 0000 L CNN
|
||||
F 1 "103" H 1475 4600 50 0000 L CNN
|
||||
F 2 "" H 1488 4550 50 0001 C CNN
|
||||
F 3 "" H 1450 4700 50 0001 C CNN
|
||||
1 1450 4700
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L R R23
|
||||
U 1 1 591D5BDF
|
||||
P 1700 4700
|
||||
F 0 "R23" V 1780 4700 50 0000 C CNN
|
||||
F 1 "15K" V 1700 4700 50 0000 C CNN
|
||||
F 2 "" V 1630 4700 50 0001 C CNN
|
||||
F 3 "" H 1700 4700 50 0001 C CNN
|
||||
1 1700 4700
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Wire Wire Line
|
||||
5800 4850 5800 4650
|
||||
Wire Wire Line
|
||||
5600 4850 5600 4650
|
||||
Wire Wire Line
|
||||
5700 4650 5700 4850
|
||||
Connection ~ 5700 4850
|
||||
Wire Wire Line
|
||||
5500 4850 5500 4650
|
||||
Connection ~ 5600 4850
|
||||
Wire Wire Line
|
||||
5400 4850 5400 4650
|
||||
Connection ~ 5500 4850
|
||||
Wire Wire Line
|
||||
3100 2950 1350 2950
|
||||
Wire Wire Line
|
||||
1350 2950 1350 4850
|
||||
Connection ~ 5400 4850
|
||||
Wire Wire Line
|
||||
1450 4550 1450 3550
|
||||
Wire Wire Line
|
||||
1450 3550 3100 3550
|
||||
Wire Wire Line
|
||||
1350 4850 9000 4850
|
||||
Connection ~ 1450 4850
|
||||
Text HLabel 8100 4050 2 60 Input ~ 0
|
||||
SWDIO
|
||||
Text HLabel 8100 4150 2 60 Input ~ 0
|
||||
SWCLK
|
||||
Text HLabel 8100 3850 2 60 Input ~ 0
|
||||
USB_D-
|
||||
Text HLabel 8100 3950 2 60 Input ~ 0
|
||||
USB_D+
|
||||
Wire Wire Line
|
||||
1700 4550 1700 3750
|
||||
Wire Wire Line
|
||||
1700 3750 3100 3750
|
||||
Connection ~ 1700 4850
|
||||
Text HLabel 8100 3650 2 60 Input ~ 0
|
||||
K1
|
||||
Text HLabel 8100 3550 2 60 Input ~ 0
|
||||
nCR
|
||||
Text HLabel 9000 3450 2 60 Input ~ 0
|
||||
TMP36
|
||||
Wire Wire Line
|
||||
5400 2350 5700 2350
|
||||
Connection ~ 5500 2350
|
||||
Connection ~ 5600 2350
|
||||
$Comp
|
||||
L VDD #PWR205
|
||||
U 1 1 591D5F85
|
||||
P 5550 2350
|
||||
F 0 "#PWR205" H 5550 2200 50 0001 C CNN
|
||||
F 1 "VDD" H 5550 2500 50 0000 C CNN
|
||||
F 2 "" H 5550 2350 50 0001 C CNN
|
||||
F 3 "" H 5550 2350 50 0001 C CNN
|
||||
1 5550 2350
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Connection ~ 5550 2350
|
||||
Text HLabel 8100 3350 2 60 Input ~ 0
|
||||
K2
|
||||
$Comp
|
||||
L C C29
|
||||
U 1 1 591D61F5
|
||||
P 9000 4700
|
||||
F 0 "C29" H 9025 4800 50 0000 L CNN
|
||||
F 1 "103" H 9025 4600 50 0000 L CNN
|
||||
F 2 "" H 9038 4550 50 0001 C CNN
|
||||
F 3 "" H 9000 4700 50 0001 C CNN
|
||||
1 9000 4700
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Connection ~ 5800 4850
|
||||
Wire Wire Line
|
||||
9000 4550 9000 3450
|
||||
Wire Wire Line
|
||||
9000 3450 8100 3450
|
||||
Text HLabel 3100 4150 0 60 Input ~ 0
|
||||
SCL
|
||||
Text HLabel 3100 4250 0 60 Input ~ 0
|
||||
SDA
|
||||
Text HLabel 3100 3950 0 60 Input ~ 0
|
||||
Po
|
||||
Text HLabel 3100 3650 0 60 Input ~ 0
|
||||
Vb
|
||||
$Comp
|
||||
L R R25
|
||||
U 1 1 591D65E3
|
||||
P 1950 2600
|
||||
F 0 "R25" V 2030 2600 50 0000 C CNN
|
||||
F 1 "15K" V 1950 2600 50 0000 C CNN
|
||||
F 2 "" V 1880 2600 50 0001 C CNN
|
||||
F 3 "" H 1950 2600 50 0001 C CNN
|
||||
1 1950 2600
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L C C17
|
||||
U 1 1 591D663E
|
||||
P 1950 4700
|
||||
F 0 "C17" H 1975 4800 50 0000 L CNN
|
||||
F 1 "105" H 1975 4600 50 0000 L CNN
|
||||
F 2 "" H 1988 4550 50 0001 C CNN
|
||||
F 3 "" H 1950 4700 50 0001 C CNN
|
||||
1 1950 4700
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Wire Wire Line
|
||||
1950 4550 1950 2750
|
||||
Wire Wire Line
|
||||
1950 2750 3100 2750
|
||||
$Comp
|
||||
L VDD #PWR201
|
||||
U 1 1 591D66BF
|
||||
P 1950 2450
|
||||
F 0 "#PWR201" H 1950 2300 50 0001 C CNN
|
||||
F 1 "VDD" H 1950 2600 50 0000 C CNN
|
||||
F 2 "" H 1950 2450 50 0001 C CNN
|
||||
F 3 "" H 1950 2450 50 0001 C CNN
|
||||
1 1950 2450
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L MMA8652FC U3
|
||||
U 1 1 591D6A94
|
||||
P 3750 6350
|
||||
F 0 "U3" H 3400 5950 60 0000 C CNN
|
||||
F 1 "MMA8652FC" H 3950 5950 60 0000 C CNN
|
||||
F 2 "" H 3550 6100 60 0001 C CNN
|
||||
F 3 "" H 3550 6100 60 0000 C CNN
|
||||
1 3750 6350
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L GND #PWR204
|
||||
U 1 1 591D6B9E
|
||||
P 4650 6700
|
||||
F 0 "#PWR204" H 4650 6450 50 0001 C CNN
|
||||
F 1 "GND" H 4650 6550 50 0000 C CNN
|
||||
F 2 "" H 4650 6700 50 0001 C CNN
|
||||
F 3 "" H 4650 6700 50 0001 C CNN
|
||||
1 4650 6700
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Wire Wire Line
|
||||
4500 6600 4650 6600
|
||||
Wire Wire Line
|
||||
4650 6400 4650 6700
|
||||
Wire Wire Line
|
||||
4500 6400 4650 6400
|
||||
Connection ~ 4650 6600
|
||||
Wire Wire Line
|
||||
4500 6500 4650 6500
|
||||
Connection ~ 4650 6500
|
||||
$Comp
|
||||
L VDD #PWR203
|
||||
U 1 1 591D6DA1
|
||||
P 4650 5900
|
||||
F 0 "#PWR203" H 4650 5750 50 0001 C CNN
|
||||
F 1 "VDD" H 4650 6050 50 0000 C CNN
|
||||
F 2 "" H 4650 5900 50 0001 C CNN
|
||||
F 3 "" H 4650 5900 50 0001 C CNN
|
||||
1 4650 5900
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Wire Wire Line
|
||||
4650 5900 4650 6200
|
||||
Wire Wire Line
|
||||
4650 6100 4500 6100
|
||||
Wire Wire Line
|
||||
4650 6200 4500 6200
|
||||
Connection ~ 4650 6100
|
||||
$Comp
|
||||
L C C22
|
||||
U 1 1 591D70DB
|
||||
P 2250 6550
|
||||
F 0 "C22" H 2275 6650 50 0000 L CNN
|
||||
F 1 "104" H 2275 6450 50 0000 L CNN
|
||||
F 2 "" H 2288 6400 50 0001 C CNN
|
||||
F 3 "" H 2250 6550 50 0001 C CNN
|
||||
1 2250 6550
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Text HLabel 3050 6350 0 60 Input ~ 0
|
||||
SDA
|
||||
Text HLabel 3050 6250 0 60 Input ~ 0
|
||||
SCL
|
||||
Wire Wire Line
|
||||
2250 6400 2250 6100
|
||||
Wire Wire Line
|
||||
2250 6100 3050 6100
|
||||
$Comp
|
||||
L GND #PWR202
|
||||
U 1 1 591D735E
|
||||
P 2250 6700
|
||||
F 0 "#PWR202" H 2250 6450 50 0001 C CNN
|
||||
F 1 "GND" H 2250 6550 50 0000 C CNN
|
||||
F 2 "" H 2250 6700 50 0001 C CNN
|
||||
F 3 "" H 2250 6700 50 0001 C CNN
|
||||
1 2250 6700
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L C C18
|
||||
U 1 1 591D7528
|
||||
P 8200 5800
|
||||
F 0 "C18" H 8225 5900 50 0000 L CNN
|
||||
F 1 "105" H 8225 5700 50 0000 L CNN
|
||||
F 2 "" H 8238 5650 50 0001 C CNN
|
||||
F 3 "" H 8200 5800 50 0001 C CNN
|
||||
1 8200 5800
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L C C19
|
||||
U 1 1 591D75B9
|
||||
P 8500 5800
|
||||
F 0 "C19" H 8525 5900 50 0000 L CNN
|
||||
F 1 "105" H 8525 5700 50 0000 L CNN
|
||||
F 2 "" H 8538 5650 50 0001 C CNN
|
||||
F 3 "" H 8500 5800 50 0001 C CNN
|
||||
1 8500 5800
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L C C20
|
||||
U 1 1 591D75EF
|
||||
P 8800 5800
|
||||
F 0 "C20" H 8825 5900 50 0000 L CNN
|
||||
F 1 "105" H 8825 5700 50 0000 L CNN
|
||||
F 2 "" H 8838 5650 50 0001 C CNN
|
||||
F 3 "" H 8800 5800 50 0001 C CNN
|
||||
1 8800 5800
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L C C25
|
||||
U 1 1 591D7626
|
||||
P 9100 5800
|
||||
F 0 "C25" H 9125 5900 50 0000 L CNN
|
||||
F 1 "104" H 9125 5700 50 0000 L CNN
|
||||
F 2 "" H 9138 5650 50 0001 C CNN
|
||||
F 3 "" H 9100 5800 50 0001 C CNN
|
||||
1 9100 5800
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L C C21
|
||||
U 1 1 591D7668
|
||||
P 9400 5800
|
||||
F 0 "C21" H 9425 5900 50 0000 L CNN
|
||||
F 1 "105" H 9425 5700 50 0000 L CNN
|
||||
F 2 "" H 9438 5650 50 0001 C CNN
|
||||
F 3 "" H 9400 5800 50 0001 C CNN
|
||||
1 9400 5800
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Wire Wire Line
|
||||
8200 5950 9400 5950
|
||||
Connection ~ 8500 5950
|
||||
Connection ~ 8800 5950
|
||||
Connection ~ 9100 5950
|
||||
Wire Wire Line
|
||||
8200 5650 9400 5650
|
||||
Connection ~ 9100 5650
|
||||
Connection ~ 8800 5650
|
||||
Connection ~ 8500 5650
|
||||
$Comp
|
||||
L GND #PWR208
|
||||
U 1 1 591D78AD
|
||||
P 8800 5950
|
||||
F 0 "#PWR208" H 8800 5700 50 0001 C CNN
|
||||
F 1 "GND" H 8800 5800 50 0000 C CNN
|
||||
F 2 "" H 8800 5950 50 0001 C CNN
|
||||
F 3 "" H 8800 5950 50 0001 C CNN
|
||||
1 8800 5950
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L VDD #PWR207
|
||||
U 1 1 591D78DF
|
||||
P 8800 5650
|
||||
F 0 "#PWR207" H 8800 5500 50 0001 C CNN
|
||||
F 1 "VDD" H 8800 5800 50 0000 C CNN
|
||||
F 2 "" H 8800 5650 50 0001 C CNN
|
||||
F 3 "" H 8800 5650 50 0001 C CNN
|
||||
1 8800 5650
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Text Label 3050 6600 2 60 ~ 0
|
||||
ACC_INT2
|
||||
Text Label 3050 6500 2 60 ~ 0
|
||||
ACC_INT1
|
||||
Text Label 3100 3850 2 60 ~ 0
|
||||
ACC_INT2
|
||||
Text Label 3100 4050 2 60 ~ 0
|
||||
ACC_INT1
|
||||
$EndSCHEMATC
|
||||
63
TS100/KiCad/TS100.pro
Normal file
63
TS100/KiCad/TS100.pro
Normal file
@@ -0,0 +1,63 @@
|
||||
update=18/05/2017 9:29:06 PM
|
||||
version=1
|
||||
last_client=kicad
|
||||
[pcbnew]
|
||||
version=1
|
||||
LastNetListRead=
|
||||
UseCmpFile=1
|
||||
PadDrill=0.600000000000
|
||||
PadDrillOvalY=0.600000000000
|
||||
PadSizeH=1.500000000000
|
||||
PadSizeV=1.500000000000
|
||||
PcbTextSizeV=1.500000000000
|
||||
PcbTextSizeH=1.500000000000
|
||||
PcbTextThickness=0.300000000000
|
||||
ModuleTextSizeV=1.000000000000
|
||||
ModuleTextSizeH=1.000000000000
|
||||
ModuleTextSizeThickness=0.150000000000
|
||||
SolderMaskClearance=0.000000000000
|
||||
SolderMaskMinWidth=0.000000000000
|
||||
DrawSegmentWidth=0.200000000000
|
||||
BoardOutlineThickness=0.100000000000
|
||||
ModuleOutlineThickness=0.150000000000
|
||||
[cvpcb]
|
||||
version=1
|
||||
NetIExt=net
|
||||
[general]
|
||||
version=1
|
||||
[eeschema]
|
||||
version=1
|
||||
LibDir=
|
||||
[eeschema/libraries]
|
||||
LibName1=power
|
||||
LibName2=device
|
||||
LibName3=transistors
|
||||
LibName4=conn
|
||||
LibName5=linear
|
||||
LibName6=regul
|
||||
LibName7=74xx
|
||||
LibName8=cmos4000
|
||||
LibName9=adc-dac
|
||||
LibName10=memory
|
||||
LibName11=xilinx
|
||||
LibName12=microcontrollers
|
||||
LibName13=dsp
|
||||
LibName14=microchip
|
||||
LibName15=analog_switches
|
||||
LibName16=motorola
|
||||
LibName17=texas
|
||||
LibName18=intel
|
||||
LibName19=audio
|
||||
LibName20=interface
|
||||
LibName21=digital-audio
|
||||
LibName22=philips
|
||||
LibName23=display
|
||||
LibName24=cypress
|
||||
LibName25=siliconi
|
||||
LibName26=opto
|
||||
LibName27=atmel
|
||||
LibName28=contrib
|
||||
LibName29=valves
|
||||
LibName30=stm32
|
||||
LibName31=mma8652fc
|
||||
LibName32=switches
|
||||
151
TS100/KiCad/TS100.sch
Normal file
151
TS100/KiCad/TS100.sch
Normal file
@@ -0,0 +1,151 @@
|
||||
EESchema Schematic File Version 2
|
||||
LIBS:power
|
||||
LIBS:device
|
||||
LIBS:transistors
|
||||
LIBS:conn
|
||||
LIBS:linear
|
||||
LIBS:regul
|
||||
LIBS:74xx
|
||||
LIBS:cmos4000
|
||||
LIBS:adc-dac
|
||||
LIBS:memory
|
||||
LIBS:xilinx
|
||||
LIBS:microcontrollers
|
||||
LIBS:dsp
|
||||
LIBS:microchip
|
||||
LIBS:analog_switches
|
||||
LIBS:motorola
|
||||
LIBS:texas
|
||||
LIBS:intel
|
||||
LIBS:audio
|
||||
LIBS:interface
|
||||
LIBS:digital-audio
|
||||
LIBS:philips
|
||||
LIBS:display
|
||||
LIBS:cypress
|
||||
LIBS:siliconi
|
||||
LIBS:opto
|
||||
LIBS:atmel
|
||||
LIBS:contrib
|
||||
LIBS:valves
|
||||
LIBS:stm32
|
||||
LIBS:mma8652fc
|
||||
LIBS:switches
|
||||
LIBS:TS100-cache
|
||||
EELAYER 25 0
|
||||
EELAYER END
|
||||
$Descr A4 11693 8268
|
||||
encoding utf-8
|
||||
Sheet 1 2
|
||||
Title "TS100 Soldering Iron Schematic"
|
||||
Date "2017-05-18"
|
||||
Rev "2.46"
|
||||
Comp ""
|
||||
Comment1 ""
|
||||
Comment2 ""
|
||||
Comment3 "Converted by Ben V. Brown"
|
||||
Comment4 "KiCad port of published schematic"
|
||||
$EndDescr
|
||||
$Sheet
|
||||
S 1450 1000 1450 1850
|
||||
U 591D5966
|
||||
F0 "STM32 & Accel Sub Board" 60
|
||||
F1 "MCU_SubBoard.sch" 60
|
||||
F2 "SWDIO" I R 2900 1100 60
|
||||
F3 "SWCLK" I R 2900 1200 60
|
||||
F4 "USB_D-" I R 2900 1350 60
|
||||
F5 "USB_D+" I R 2900 1450 60
|
||||
F6 "K1" I R 2900 1650 60
|
||||
F7 "nCR" I R 2900 2150 60
|
||||
F8 "TMP36" I R 2900 2250 60
|
||||
F9 "K2" I R 2900 1750 60
|
||||
F10 "SCL" I R 2900 2550 60
|
||||
F11 "SDA" I R 2900 2650 60
|
||||
F12 "Po" I R 2900 2050 60
|
||||
F13 "Vb" I R 2900 1950 60
|
||||
$EndSheet
|
||||
$Comp
|
||||
L BARREL_JACK J101
|
||||
U 1 1 591D8B75
|
||||
P 1600 3600
|
||||
F 0 "J101" H 1600 3795 50 0000 C CNN
|
||||
F 1 "BARREL_JACK" H 1600 3445 50 0000 C CNN
|
||||
F 2 "" H 1600 3600 50 0001 C CNN
|
||||
F 3 "" H 1600 3600 50 0001 C CNN
|
||||
1 1600 3600
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Text Label 1900 3500 0 60 ~ 0
|
||||
VIN
|
||||
$Comp
|
||||
L GND #PWR103
|
||||
U 1 1 591D8F24
|
||||
P 2000 3800
|
||||
F 0 "#PWR103" H 2000 3550 50 0001 C CNN
|
||||
F 1 "GND" H 2000 3650 50 0000 C CNN
|
||||
F 2 "" H 2000 3800 50 0001 C CNN
|
||||
F 3 "" H 2000 3800 50 0001 C CNN
|
||||
1 2000 3800
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Wire Wire Line
|
||||
1900 3600 2000 3600
|
||||
Wire Wire Line
|
||||
2000 3600 2000 3800
|
||||
Wire Wire Line
|
||||
1900 3700 2000 3700
|
||||
Connection ~ 2000 3700
|
||||
$Comp
|
||||
L SW_Push SW1
|
||||
U 1 1 591D9BC6
|
||||
P 1400 4550
|
||||
F 0 "SW1" H 1450 4650 50 0000 L CNN
|
||||
F 1 "SW_Push" H 1400 4490 50 0000 C CNN
|
||||
F 2 "" H 1400 4750 50 0001 C CNN
|
||||
F 3 "" H 1400 4750 50 0001 C CNN
|
||||
F 4 "-" H 1400 4550 60 0001 C CNN "bom_partno"
|
||||
1 1400 4550
|
||||
0 1 1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L SW_Push SW101
|
||||
U 1 1 591DA371
|
||||
P 1700 4550
|
||||
F 0 "SW101" H 1750 4650 50 0000 L CNN
|
||||
F 1 "SW_Push" H 1700 4490 50 0000 C CNN
|
||||
F 2 "" H 1700 4750 50 0001 C CNN
|
||||
F 3 "" H 1700 4750 50 0001 C CNN
|
||||
1 1700 4550
|
||||
0 1 1 0
|
||||
$EndComp
|
||||
$Comp
|
||||
L GND #PWR102
|
||||
U 1 1 591DA3DA
|
||||
P 1700 4750
|
||||
F 0 "#PWR102" H 1700 4500 50 0001 C CNN
|
||||
F 1 "GND" H 1700 4600 50 0000 C CNN
|
||||
F 2 "" H 1700 4750 50 0001 C CNN
|
||||
F 3 "" H 1700 4750 50 0001 C CNN
|
||||
1 1700 4750
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L GND #PWR101
|
||||
U 1 1 591DA436
|
||||
P 1400 4750
|
||||
F 0 "#PWR101" H 1400 4500 50 0001 C CNN
|
||||
F 1 "GND" H 1400 4600 50 0000 C CNN
|
||||
F 2 "" H 1400 4750 50 0001 C CNN
|
||||
F 3 "" H 1400 4750 50 0001 C CNN
|
||||
1 1400 4750
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
Text Label 1400 4350 0 60 ~ 0
|
||||
K1
|
||||
Text Label 1700 4350 0 60 ~ 0
|
||||
K2
|
||||
Text Label 2900 1750 0 60 ~ 0
|
||||
K2
|
||||
Text Label 2900 1650 0 60 ~ 0
|
||||
K1
|
||||
$EndSCHEMATC
|
||||
BIN
sa-720x300.png
Normal file
BIN
sa-720x300.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
@@ -28,7 +28,7 @@
|
||||
</builder>
|
||||
<tool id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.1500724168" name="MCU GCC Compiler" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
|
||||
<option id="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level.963224364" name="Optimization Level" superClass="fr.ac6.managedbuild.gnu.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="fr.ac6.managedbuild.gnu.c.optimization.level.more" valueType="enumerated"/>
|
||||
<option id="gnu.c.compiler.option.debugging.level.400507088" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
|
||||
<option id="gnu.c.compiler.option.debugging.level.400507088" name="Debug Level" superClass="gnu.c.compiler.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
|
||||
<option id="gnu.c.compiler.option.include.paths.1436405353" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/StdPeriph_Driver/inc}""/>
|
||||
@@ -50,6 +50,8 @@
|
||||
<option id="gnu.c.compiler.option.dialect.std.1983627145" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.c11" valueType="enumerated"/>
|
||||
<option id="gnu.c.compiler.option.warnings.nowarn.1227270879" name="Inhibit all warnings (-w)" superClass="gnu.c.compiler.option.warnings.nowarn" useByScannerDiscovery="false" value="false" valueType="boolean"/>
|
||||
<option id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.fdata.1556802580" name="Place the data in their own section (-fdata-sections)" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.fdata" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||
<option id="gnu.c.compiler.option.warnings.extrawarn.826041739" name="Extra warnings (-Wextra)" superClass="gnu.c.compiler.option.warnings.extrawarn" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||
<option id="fr.ac6.managedbuid.gnu.c.compiler.option.misc.other.1256666959" superClass="fr.ac6.managedbuid.gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-fmessage-length=0 -fno-common" valueType="string"/>
|
||||
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c.1635097739" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.c"/>
|
||||
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s.211510996" superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.input.s"/>
|
||||
</tool>
|
||||
@@ -186,4 +188,5 @@
|
||||
<resource resourceType="PROJECT" workspacePath="/ts100"/>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
||||
</cproject>
|
||||
|
||||
@@ -62,7 +62,7 @@ _Min_Stack_Size = 0x400; /* required amount of stack */
|
||||
MEMORY
|
||||
{
|
||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
|
||||
ROM (rx) : ORIGIN = 0x08004000, LENGTH = 47K
|
||||
ROM (rx) : ORIGIN = 0x08004000, LENGTH = 46K
|
||||
|
||||
}
|
||||
/*ROM (rx) : ORIGIN = 0x08004000, LENGTH = 48K*/
|
||||
|
||||
@@ -1,342 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<link rel="File-List" href="Library_files/filelist.xml">
|
||||
<link rel="Edit-Time-Data" href="Library_files/editdata.mso"><!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--><title>Release Notes for STM32F10x Standard Peripherals Library Drivers</title><!--[if gte mso 9]><xml> <o:DocumentProperties> <o:Author>STMicroelectronics</o:Author> <o:LastAuthor>STMicroelectronics</o:LastAuthor> <o:Revision>37</o:Revision> <o:TotalTime>136</o:TotalTime> <o:Created>2009-02-27T19:26:00Z</o:Created> <o:LastSaved>2009-03-01T17:56:00Z</o:LastSaved> <o:Pages>1</o:Pages> <o:Words>522</o:Words> <o:Characters>2977</o:Characters> <o:Company>STMicroelectronics</o:Company> <o:Lines>24</o:Lines> <o:Paragraphs>6</o:Paragraphs> <o:CharactersWithSpaces>3493</o:CharactersWithSpaces> <o:Version>11.6568</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:Zoom>110</w:Zoom> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]-->
|
||||
|
||||
|
||||
|
||||
<style>
|
||||
<!--
|
||||
/* Style Definitions */
|
||||
p.MsoNormal, li.MsoNormal, div.MsoNormal
|
||||
{mso-style-parent:"";
|
||||
margin:0in;
|
||||
margin-bottom:.0001pt;
|
||||
mso-pagination:widow-orphan;
|
||||
font-size:12.0pt;
|
||||
font-family:"Times New Roman";
|
||||
mso-fareast-font-family:"Times New Roman";}
|
||||
h2
|
||||
{mso-style-next:Normal;
|
||||
margin-top:12.0pt;
|
||||
margin-right:0in;
|
||||
margin-bottom:3.0pt;
|
||||
margin-left:0in;
|
||||
mso-pagination:widow-orphan;
|
||||
page-break-after:avoid;
|
||||
mso-outline-level:2;
|
||||
font-size:14.0pt;
|
||||
font-family:Arial;
|
||||
font-weight:bold;
|
||||
font-style:italic;}
|
||||
a:link, span.MsoHyperlink
|
||||
{color:blue;
|
||||
text-decoration:underline;
|
||||
text-underline:single;}
|
||||
a:visited, span.MsoHyperlinkFollowed
|
||||
{color:blue;
|
||||
text-decoration:underline;
|
||||
text-underline:single;}
|
||||
p
|
||||
{mso-margin-top-alt:auto;
|
||||
margin-right:0in;
|
||||
mso-margin-bottom-alt:auto;
|
||||
margin-left:0in;
|
||||
mso-pagination:widow-orphan;
|
||||
font-size:12.0pt;
|
||||
font-family:"Times New Roman";
|
||||
mso-fareast-font-family:"Times New Roman";}
|
||||
@page Section1
|
||||
{size:8.5in 11.0in;
|
||||
margin:1.0in 1.25in 1.0in 1.25in;
|
||||
mso-header-margin:.5in;
|
||||
mso-footer-margin:.5in;
|
||||
mso-paper-source:0;}
|
||||
div.Section1
|
||||
{page:Section1;}
|
||||
-->
|
||||
</style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]--><!--[if gte mso 9]><xml> <o:shapedefaults v:ext="edit" spidmax="5122"/> </xml><![endif]--><!--[if gte mso 9]><xml> <o:shapelayout v:ext="edit"> <o:idmap v:ext="edit" data="1"/> </o:shapelayout></xml><![endif]--></head>
|
||||
<body lang="EN-US" link="blue" vlink="blue">
|
||||
<div class="Section1">
|
||||
<p class="MsoNormal"><span style="font-family: Arial;"><o:p><br>
|
||||
</o:p></span></p>
|
||||
<div align="center">
|
||||
<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900">
|
||||
<tbody>
|
||||
<tr style="">
|
||||
<td style="padding: 0cm;" valign="top">
|
||||
<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" cellspacing="0" width="900">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="vertical-align: top;"><span style="font-size: 8pt; font-family: Arial; color: blue;"><a href="../../Release_Notes.html">Back to Release page</a></span></td>
|
||||
</tr>
|
||||
<tr style="">
|
||||
<td style="padding: 1.5pt;">
|
||||
<h1 style="margin-bottom: 18pt; text-align: center;" align="center"><span style="font-size: 20pt; font-family: Verdana; color: rgb(51, 102, 255);">Release
|
||||
Notes for STM32F10x Standard Peripherals Library Drivers
|
||||
(StdPeriph_Driver)</span><span style="font-size: 20pt; font-family: Verdana;"><o:p></o:p></span></h1>
|
||||
<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;">Copyright 2011 STMicroelectronics</span><span style="color: black;"><u1:p></u1:p><o:p></o:p></span></p>
|
||||
<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-size: 10pt; font-family: Arial; color: black;"><img alt="" id="_x0000_i1025" src="../../_htmresc/logo.bmp" style="border: 0px solid ; width: 86px; height: 65px;"></span><span style="font-size: 10pt;"><o:p></o:p></span></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p class="MsoNormal"><span style="font-family: Arial; display: none;"><o:p> </o:p></span></p>
|
||||
<table class="MsoNormalTable" style="width: 675pt;" border="0" cellpadding="0" width="900">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="padding: 0cm;" valign="top">
|
||||
<h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"><span style="font-size: 12pt; color: white;">Contents<o:p></o:p></span></h2>
|
||||
<ol style="margin-top: 0cm;" start="1" type="1">
|
||||
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><a href="#History">STM32F10x Standard Peripherals Library
|
||||
Drivers update History</a><o:p></o:p></span></li>
|
||||
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;"><a href="#License">License</a><o:p></o:p></span></li>
|
||||
</ol>
|
||||
<span style="font-family: "Times New Roman";">
|
||||
</span>
|
||||
<h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"><a name="History"></a><span style="font-size: 12pt; color: white;">STM32F10x Standard
|
||||
Peripherals Library Drivers update History</span></h2><br>
|
||||
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 500pt; width: 167px;"><span style="font-size: 10pt; font-family: Arial; color: white;">V3.5.0 / 11-March-2011<o:p></o:p></span></h3>
|
||||
<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt;"><b style=""><u><span style="font-size: 10pt; font-family: Verdana; color: black;">Main
|
||||
Changes<o:p></o:p></span></u></b></p>
|
||||
|
||||
<ul style="margin-top: 0cm;" type="square">
|
||||
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_can.h/.c files:</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add 5 new functions</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">3
|
||||
new functions controlling the counter errors: CAN_GetLastErrorCode(),
|
||||
CAN_GetReceiveErrorCounter() and CAN_GetLSBTransmitErrorCounter().</span></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">1 new function to select the CAN operating mode: CAN_OperatingModeRequest().</span></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">1 new function to support CAN TT mode: CAN_TTComModeCmd().</span><span style="font-size: 10pt; font-family: Verdana;"><br>
|
||||
</span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">CAN_TransmitStatus() function updated to support all CAN transmit intermediate states<br>
|
||||
</span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_i2c.h/.c files:</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Add 1 new function:</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">I2C_NACKPositionConfig():
|
||||
This function configures the same bit (POS) as I2C_PECPositionConfig()
|
||||
but is intended to be used in I2C mode while I2C_PECPositionConfig() is
|
||||
intended to used in SMBUS mode.</span></li>
|
||||
</ul>
|
||||
</ul>
|
||||
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_tim.h/.c files:</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style="color: black; margin-top: 4.5pt; margin-bottom: 4.5pt;"><span style="font-size: 10pt; font-family: Verdana;">Change the <span style="font-style: italic;">TIM_DMABurstLength_xBytes</span> definitions to <span style="font-style: italic;">TIM_DMABurstLength_xTansfers</span><br>
|
||||
</span></li>
|
||||
</ul>
|
||||
|
||||
|
||||
</ul>
|
||||
|
||||
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 558.05pt;"><span style="font-size: 10pt; font-family: Arial; color: white;">3.4.0
|
||||
- 10/15/2010</span></h3>
|
||||
|
||||
<ol style="margin-top: 0in;" start="1" type="1">
|
||||
<li class="MsoNormal" style=""><b><i><span style="font-size: 10pt; font-family: Verdana;">General</span></i></b><i><span style="font-size: 10pt; font-family: Verdana;"> </span></i><i><span style="font-size: 10pt;"><o:p></o:p></span></i></li>
|
||||
</ol>
|
||||
|
||||
<ul style="margin-top: 0in;" type="disc">
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Add support for <span style="font-weight: bold;">STM32F10x High-density value line </span>devices.</span></li>
|
||||
</ul>
|
||||
|
||||
<ol style="margin-top: 0in;" start="2" type="1">
|
||||
<li class="MsoNormal" style=""><b><i><span style="font-size: 10pt; font-family: Verdana;">STM32F10x_StdPeriph_Driver</span></i></b><b><i><span style="font-size: 10pt;"><o:p></o:p></span></i></b></li>
|
||||
</ol>
|
||||
|
||||
|
||||
<ul style="margin-top: 0in;" type="disc">
|
||||
|
||||
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_bkp.h/.c</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete BKP registers definition from stm32f10x_bkp.c and use defines within stm32f10x.h file. </span></span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_can.h/.c</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete CAN registers definition from stm32f10x_can.c and use defines within stm32f10x.h file.<br>
|
||||
</span></span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Update the wording of some defines and Asserts macro. <br>
|
||||
</span></span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">CAN_GetFlagStatus()
|
||||
and CAN_ClearFlag() functions: updated to support new flags (were not
|
||||
supported in previous version). These flags are: CAN_FLAG_RQCP0,
|
||||
CAN_FLAG_RQCP1, CAN_FLAG_RQCP2, CAN_FLAG_FMP1, CAN_FLAG_FF1,
|
||||
CAN_FLAG_FOV1, CAN_FLAG_FMP0, CAN_FLAG_FF0, CAN_FLAG_FOV0,
|
||||
CAN_FLAG_WKU, CAN_FLAG_SLAK and CAN_FLAG_LEC. <br>
|
||||
</span></span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">CAN_GetITStatus()
|
||||
function: add a check of the interrupt enable bit before getting the
|
||||
status of corresponding interrupt pending bit. <br>
|
||||
</span></span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">CAN_ClearITPendingBit() function: correct the procedure to clear the interrupt pending bit. <br>
|
||||
</span></span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_crc.h/.c</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete CRC registers definition from stm32f10x_crc.c and use defines within stm32f10x.h file.</span></span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_dac.h/.c</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete DAC registers definition from stm32f10x_dac.c and use defines within stm32f10x.h file. </span></span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_dbgmcu.h/.c</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete DBGMCU registers definition from stm32f10x_dbgmcu.c and use defines within stm32f10x.h file. </span></span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_dma.h/.c</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete DMA registers definition from stm32f10x_dma.c and use defines within stm32f10x.h file.</span></span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Add new function "void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber);"<br>
|
||||
</span></span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_flash.h/.c</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">FLASH functions (Erase and Program) updated to always clear the "PG", "MER" and "PER" bits even in case of TimeOut Error.</span><span style="font-style: italic;"></span></span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_fsmc.h/.c</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Add new member "FSMC_AsynchronousWait" in "FSMC_NORSRAMInitTypeDef" structure.</span><span style="font-style: italic;"></span></span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_gpio.h/.c</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">GPIO_PinRemapConfig()</span> function: add new values for <span style="font-style: italic;">GPIO_Remap</span> parameter, to support new <span style="font-style: italic;">remap for TIM6, TIM7 and DAC DMA requests, TIM12 and DAC Triggers / DMA2_Channel5 Interrupt mapping.</span></span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_pwr.h/.c</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete PWR registers definition from stm32f10x_pwr.c and use defines within stm32f10x.h and core_cm3.h files.</span></span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_rtc.h/.c</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Delete RTC registers definition from stm32f10x_rtc.c and use defines within stm32f10x.h file.</span></span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_spi.h/.c</span></li>
|
||||
<ul>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Add new definition for I2S Audio Clock frequencies "I2S_AudioFreq_192k".</span></span></li>
|
||||
</ul>
|
||||
<li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_tim.h/.c</span></li>
|
||||
<ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">Add new definition for TIM Input Capture Polarity "TIM_ICPolarity_BothEdge".</span></span></li></ul>
|
||||
|
||||
</ul>
|
||||
|
||||
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 558.05pt;"><span style="font-size: 10pt; font-family: Arial; color: white;">3.3.0
|
||||
- 04/16/2010</span></h3>
|
||||
|
||||
<ol style="margin-top: 0in;" start="1" type="1"><li class="MsoNormal" style=""><b><i><span style="font-size: 10pt; font-family: Verdana;">General</span></i></b><i><span style="font-size: 10pt; font-family: Verdana;"> </span></i><i><span style="font-size: 10pt;"><o:p></o:p></span></i></li></ol>
|
||||
<ul style="margin-top: 0in;" type="disc"><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Add support for <span style="font-weight: bold;">STM32F10x XL-density </span>devices.</span></li><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">I2C driver: events description and management enhancement.</span></li></ul>
|
||||
<ol style="margin-top: 0in;" start="2" type="1"><li class="MsoNormal" style=""><b><i><span style="font-size: 10pt; font-family: Verdana;">STM32F10x_StdPeriph_Driver</span></i></b><b><i><span style="font-size: 10pt;"><o:p></o:p></span></i></b></li></ol>
|
||||
<ul style="margin-top: 0in;" type="disc"><li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_dbgmcu.h/.c</span></li><ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">DBGMCU_Config()</span> function: add new values <span style="font-style: italic;">DBGMCU_TIMx_STOP</span> (x: 9..14) for <span style="font-style: italic;">DBGMCU_Periph</span> parameter.</span></li></ul><li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_flash.h/.c:
|
||||
updated to support Bank2 of XL-density devices (up to 1MByte of Flash
|
||||
memory). For more details, refer to the description provided within
|
||||
stm32f10x_flash.c file.</span></li><li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_gpio.h/.c</span></li><ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">GPIO_PinRemapConfig()</span> function: add new values for <span style="font-style: italic;">GPIO_Remap</span> parameter, to support new <span style="font-style: italic;">remap for FSMC_NADV pin and TIM9..11,13,14.</span></span></li></ul><li class="MsoNormal"><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_i2c.h/.c: I2C events description and management enhancement. <br></span></li><ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;"><span style="font-style: italic;">I2C_CheckEvent()</span>
|
||||
function: updated to check whether the last event contains the
|
||||
I2C_EVENT (instead of check whether the last event is equal to
|
||||
I2C_EVENT)<br></span></li></ul><ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Add
|
||||
detailed description of I2C events and how to manage them using the
|
||||
functions provided by this driver. For more information, refer to
|
||||
stm32f10x_i2c.h and stm32f10x_i2c.c files.</span></li></ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_rcc.h/.c: updated to support TIM9..TIM14 APB clock and reset configuration</span></li><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_tim.h/.c: updated to support new Timers TIM9..TIM14.</span></li><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">stm32f10x_sdio.h: </span></li><ul><li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">SDIO_SetSDIOReadWaitMode() function: correct values of SDIO_ReadWaitMode parameter<br>change <br>
|
||||
#define
|
||||
SDIO_ReadWaitMode_CLK
|
||||
((uint32_t)0x00000000)<br> #define
|
||||
SDIO_ReadWaitMode_DATA2
|
||||
((uint32_t)0x00000001)<br>by<br> #define
|
||||
SDIO_ReadWaitMode_CLK
|
||||
((uint32_t)0x00000001)<br> #define
|
||||
SDIO_ReadWaitMode_DATA2
|
||||
((uint32_t)0x00000000)</span></li></ul></ul>
|
||||
<h3 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; margin-right: 558.05pt;"><span style="font-size: 10pt; font-family: Arial; color: white;">3.2.0
|
||||
- 03/01/2010</span></h3>
|
||||
<ol style="margin-top: 0in;" start="1" type="1">
|
||||
<li class="MsoNormal" style=""><b><i><span style="font-size: 10pt; font-family: Verdana;">General</span></i></b><i><span style="font-size: 10pt; font-family: Verdana;"> </span></i><i><span style="font-size: 10pt;"><o:p></o:p></span></i></li>
|
||||
</ol>
|
||||
<ul style="margin-top: 0in;" type="disc">
|
||||
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Add support
|
||||
for <b>STM32 Low-density Value line (STM32F100x4/6) and
|
||||
Medium-density Value line (STM32F100x8/B) devices</b>.</span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Almost
|
||||
peripherals drivers were updated to support Value
|
||||
line devices features</span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Drivers limitations fix and enhancements. </span><span style="font-size: 10pt;"><o:p></o:p></span></li>
|
||||
|
||||
</ul>
|
||||
<ol style="margin-top: 0in;" start="2" type="1">
|
||||
<li class="MsoNormal" style=""><b><i><span style="font-size: 10pt; font-family: Verdana;">STM32F10x_StdPeriph_Driver</span></i></b><b><i><span style="font-size: 10pt;"><o:p></o:p></span></i></b></li>
|
||||
</ol>
|
||||
<ul style="margin-top: 0in;" type="disc">
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Add new
|
||||
firmware driver for CEC peripheral: stm32f10x_cec.h and stm32f10x_cec.c</span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">Timers drivers stm32f10x_tim.h/.c: add support for new General Purpose Timers: TIM15, TIM16 and TIM17.</span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">RCC driver: add support for new Value peripherals: HDMI-CEC, TIM15, TIM16 and TIM17.</span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">GPIO driver: add new remap parameters for TIM1, TIM15, TIM16, TIM17 and HDMI-CEC: </span><span style="font-size: 10pt; font-family: Verdana;">GPIO_Remap_TIM1_DMA, </span><span style="font-size: 10pt; font-family: Verdana;">GPIO_Remap_TIM15, GPIO_Remap_TIM16, GPIO_Remap_TIM17, GPIO_Remap_CEC.</span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">USART
|
||||
driver: add support for Oversampling by 8 mode and onebit method. 2
|
||||
functions has been added: USART_OverSampling8Cmd() and
|
||||
USART_OneBitMethodCmd().<br>
|
||||
</span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">DAC
|
||||
driver: add new functions handling the DAC under run feature:
|
||||
DAC_ITConfig(), DAC_GetFlagStatus(), DAC_ClearFlag(), DAC_GetITStatus()
|
||||
and DAC_ClearITPendingBit().</span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">DBGMCU driver: add new parameters for TIM15, TIM16 and TIM17: DBGMCU_TIM15_STOP, DBGMCU_TIM16_STOP, DBGMCU_TIM17_STOP.<br>
|
||||
</span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">FLASH
|
||||
driver: the FLASH_EraseOptionBytes() function updated. This is now just
|
||||
erasing the option bytes without modifying the RDP status either
|
||||
enabled or disabled.</span></li>
|
||||
<li class="MsoNormal" style=""><span style="font-size: 10pt; font-family: Verdana;">PWR
|
||||
driver: the PWR_EnterSTOPMode() function updated. When woken up from
|
||||
STOP mode, this function resets again the SLEEPDEEP bit in the
|
||||
Cortex-M3 System Control register to allow Sleep mode entering.</span></li>
|
||||
|
||||
|
||||
</ul>
|
||||
<h2 style="background: rgb(51, 102, 255) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;"><a name="License"></a><span style="font-size: 12pt; color: white;">License<o:p></o:p></span></h2>
|
||||
<p class="MsoNormal" style="margin: 4.5pt 0cm;"><span style="font-size: 10pt; font-family: Verdana; color: black;">The
|
||||
enclosed firmware and all the related documentation are not covered by
|
||||
a License Agreement, if you need such License you can contact your
|
||||
local STMicroelectronics office.<u1:p></u1:p><o:p></o:p></span></p>
|
||||
<p class="MsoNormal"><b style=""><span style="font-size: 10pt; font-family: Verdana; color: black;">THE
|
||||
PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
|
||||
WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO
|
||||
SAVE TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR
|
||||
ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY
|
||||
CLAIMS ARISING FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY
|
||||
CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH
|
||||
THEIR PRODUCTS. <o:p></o:p></span></b></p>
|
||||
<p class="MsoNormal"><span style="color: black;"><o:p> </o:p></span></p>
|
||||
<div class="MsoNormal" style="text-align: center;" align="center"><span style="color: black;">
|
||||
<hr align="center" size="2" width="100%"></span></div>
|
||||
<p class="MsoNormal" style="margin: 4.5pt 0cm 4.5pt 18pt; text-align: center;" align="center"><span style="font-size: 10pt; font-family: Verdana; color: black;">For
|
||||
complete documentation on </span><span style="font-size: 10pt; font-family: Verdana;">STM32(<span style="color: black;">CORTEX M3) 32-Bit Microcontrollers
|
||||
visit </span><u><span style="color: blue;"><a href="http://www.st.com/stm32" target="_blank">www.st.com/STM32</a></span></u></span><span style="color: black;"><o:p></o:p></span></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p class="MsoNormal"><span style="font-size: 10pt;"><o:p></o:p></span></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<p class="MsoNormal"><o:p> </o:p></p>
|
||||
</div>
|
||||
</body></html>
|
||||
@@ -406,12 +406,12 @@ typedef struct
|
||||
* 1) In normal case (only one address managed by the slave), when the address
|
||||
* sent by the master matches the own address of the peripheral (configured by
|
||||
* I2C_OwnAddress1 field) the I2C_EVENT_SLAVE_XXX_ADDRESS_MATCHED event is set
|
||||
* (where XXX could be TRANSMITTER or RECEIVER).
|
||||
* (where XX could be TRANSMITTER or RECEIVER).
|
||||
*
|
||||
* 2) In case the address sent by the master matches the second address of the
|
||||
* peripheral (configured by the function I2C_OwnAddress2Config() and enabled
|
||||
* by the function I2C_DualAddressCmd()) the events I2C_EVENT_SLAVE_XXX_SECONDADDRESS_MATCHED
|
||||
* (where XXX could be TRANSMITTER or RECEIVER) are set.
|
||||
* (where XX could be TRANSMITTER or RECEIVER) are set.
|
||||
*
|
||||
* 3) In case the address sent by the master is General Call (address 0x00) and
|
||||
* if the General Call is enabled for the peripheral (using function I2C_GeneralCallCmd())
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
extern volatile uint16_t ADC1ConvertedValue[2];
|
||||
|
||||
uint16_t Get_ADC1Value(uint8_t i);
|
||||
uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read,uint16_t setPointTemp); //read the iron temp in C X10
|
||||
uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read,
|
||||
uint16_t setPointTemp); //read the iron temp in C X10
|
||||
uint16_t readDCVoltage(uint16_t divFactor);/*Get the system voltage X10*/
|
||||
int16_t readTipTemp();
|
||||
int readSensorTemp(void);
|
||||
#endif /* ANALOG_H_ */
|
||||
|
||||
@@ -9,7 +9,9 @@
|
||||
|
||||
#ifndef FONT_H_
|
||||
#define FONT_H_
|
||||
|
||||
/*
|
||||
* Remember screen is LSB at the top, MSB at the bottom of the strip!
|
||||
*/
|
||||
#define FONT_WIDTH 12 /*How many pixels wide the font is*/
|
||||
const uint8_t FONT[]={
|
||||
0x00,0xF0,0xFC,0x0E,0x82,0xC2,0x62,0x1E,0xFC,0xF0,0x00,0x00,
|
||||
@@ -95,8 +97,175 @@ const uint8_t FONT[]={
|
||||
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,/*.*/
|
||||
};
|
||||
|
||||
};
|
||||
const uint8_t extendedFont[] = {
|
||||
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
|
||||
0x00,0x00,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x00,0x00,/*Battery Empty*/
|
||||
|
||||
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
|
||||
0x00,0x00,0x7F,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0x00,0x00,/*Battery 1*/
|
||||
|
||||
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
|
||||
0x00,0x00,0x7F,0x70,0x70,0x70,0x70,0x70,0x70,0x7F,0x00,0x00,/*Battery 2*/
|
||||
|
||||
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
|
||||
0x00,0x00,0x7F,0x78,0x78,0x78,0x78,0x78,0x78,0x7F,0x00,0x00,/*Battery 3*/
|
||||
|
||||
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
|
||||
0x00,0x00,0x7F,0x7C,0x7C,0x7C,0x7C,0x7C,0x7C,0x7F,0x00,0x00,/*Battery 4*/
|
||||
|
||||
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
|
||||
0x00,0x00,0x7F,0x7E,0x7E,0x7E,0x7E,0x7E,0x7E,0x7F,0x00,0x00,/*Battery 5*/
|
||||
|
||||
0x00,0x00,0xF8,0x08,0x0E,0x02,0x02,0x0E,0x08,0xF8,0x00,0x00,
|
||||
0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x00,/*Battery 6*/
|
||||
|
||||
0x00,0x00,0xF8,0x88,0x8E,0x82,0x82,0x8E,0x88,0xF8,0x00,0x00,
|
||||
0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x00,/*Battery 7*/
|
||||
|
||||
0x00,0x00,0xF8,0xC8,0xCE,0xC2,0xC2,0xCE,0xC8,0xF8,0x00,0x00,
|
||||
0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x00,/*Battery 8*/
|
||||
|
||||
0x00,0x00,0xF8,0xE8,0xEE,0xE2,0xE2,0xEE,0xE8,0xF8,0x00,0x00,
|
||||
0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x00,/*Battery 9*/
|
||||
|
||||
0x00,0x00,0xF8,0xF8,0xFE,0xF2,0xF2,0xFE,0xF8,0xF8,0x00,0x00,
|
||||
0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x00,/*Battery 10*/
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF,/*Bar Graph empty (0)*/
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xFF,/*Bar 1*/
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xFF,/*Bar 2*/
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xFF,/*Bar 3*/
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xFF,/*Bar 4*/
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFF,/*Bar 5*/
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,/*Bar 6*/
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*Bar 7*/
|
||||
|
||||
0xFF,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*Bar 8*/
|
||||
|
||||
0xFF,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*Bar 9*/
|
||||
|
||||
0xFF,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*Bar 10*/
|
||||
|
||||
0xFF,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*Bar 11*/
|
||||
|
||||
0xFF,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*Bar 12*/
|
||||
|
||||
0xFF,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*Bar 13*/
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*Bar 14*/
|
||||
};
|
||||
const uint8_t DoubleWidthChars[]={
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF,/*Bar 0*/
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xC0,0x80,0xC0,0x80,0xC0,0x80,0xC0,0x80,0xC0,0x80,0xC0,0x80,0xC0,0x80,0xC0,0x80,0xC0,0x80,0xC0,0x80,0xC0,0x80,0xFF,
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xFF,
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xE0,0xC0,0xE0,0xC0,0xE0,0xC0,0xE0,0xC0,0xE0,0xC0,0xE0,0xC0,0xE0,0xC0,0xE0,0xC0,0xE0,0xC0,0xE0,0xC0,0xE0,0xC0,0xFF,
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xFF,
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xF0,0xE0,0xF0,0xE0,0xF0,0xE0,0xF0,0xE0,0xF0,0xE0,0xF0,0xE0,0xF0,0xE0,0xF0,0xE0,0xF0,0xE0,0xF0,0xE0,0xF0,0xE0,0xFF,
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xFF,
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xF8,0xF0,0xF8,0xF0,0xF8,0xF0,0xF8,0xF0,0xF8,0xF0,0xF8,0xF0,0xF8,0xF0,0xF8,0xF0,0xF8,0xF0,0xF8,0xF0,0xF8,0xF0,0xFF,
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xFF,
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xFC,0xF8,0xFC,0xF8,0xFC,0xF8,0xFC,0xF8,0xFC,0xF8,0xFC,0xF8,0xFC,0xF8,0xFC,0xF8,0xFC,0xF8,0xFC,0xF8,0xFC,0xF8,0xFF,
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFF,
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xFE,0xFC,0xFE,0xFC,0xFE,0xFC,0xFE,0xFC,0xFE,0xFC,0xFE,0xFC,0xFE,0xFC,0xFE,0xFC,0xFE,0xFC,0xFE,0xFC,0xFE,0xFC,0xFF,
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,
|
||||
|
||||
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0x81,0x01,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xC1,0x81,0xC1,0x81,0xC1,0x81,0xC1,0x81,0xC1,0x81,0xC1,0x81,0xC1,0x81,0xC1,0x81,0xC1,0x81,0xC1,0x81,0xC1,0x81,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xE1,0xC1,0xE1,0xC1,0xE1,0xC1,0xE1,0xC1,0xE1,0xC1,0xE1,0xC1,0xE1,0xC1,0xE1,0xC1,0xE1,0xC1,0xE1,0xC1,0xE1,0xC1,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xE1,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xF1,0xE1,0xF1,0xE1,0xF1,0xE1,0xF1,0xE1,0xF1,0xE1,0xF1,0xE1,0xF1,0xE1,0xF1,0xE1,0xF1,0xE1,0xF1,0xE1,0xF1,0xE1,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xF1,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xF9,0xF1,0xF9,0xF1,0xF9,0xF1,0xF9,0xF1,0xF9,0xF1,0xF9,0xF1,0xF9,0xF1,0xF9,0xF1,0xF9,0xF1,0xF9,0xF1,0xF9,0xF1,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xF9,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFD,0xF9,0xFD,0xF9,0xFD,0xF9,0xFD,0xF9,0xFD,0xF9,0xFD,0xF9,0xFD,0xF9,0xFD,0xF9,0xFD,0xF9,0xFD,0xF9,0xFD,0xF9,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFD,0xFF,0xFD,0xFF,0xFD,0xFF,0xFD,0xFF,0xFD,0xFF,0xFD,0xFF,0xFD,0xFF,0xFD,0xFF,0xFD,0xFF,0xFD,0xFF,0xFD,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
};
|
||||
const uint8_t Iron_Base[] ={
|
||||
0x00,0x20,0x60,0x60,0x60,0x60,0x60,0x60,0x90,0x90,0x90,0x90,
|
||||
0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,
|
||||
@@ -163,4 +332,30 @@ const uint8_t Iron_RightArrow_DOWN[] = {
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
};
|
||||
|
||||
const uint8_t SymbolTable[]={
|
||||
|
||||
0x0E,0x11,0x11,0x0E,0xE0,0xF8,0x0C,0x06,0x03,0x01,0x01,0x01,0x01,0x02,0x1E,0x00,
|
||||
0x00,0x00,0x00,0x00,0x0F,0x3F,0x70,0xC0,0x80,0x80,0x80,0x80,0x80,0x40,0x20,0x00, // Degrees C
|
||||
|
||||
0x08,0x14,0x22,0x14,0x08,0x02,0x02,0xFE,0x06,0x02,0x02,0x02,0xC2,0x02,0x06,0x1E,
|
||||
0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xFF,0x81,0x81,0x01,0x01,0x03,0x00,0x00,0x00, // Degrees F
|
||||
|
||||
0xC0,0x30,0x08,0x04,0x04,0x02,0xFA,0xAA,0xFA,0x02,0x04,0x04,0x08,0x30,0xC0,0x00,
|
||||
0x07,0x18,0x20,0x40,0x58,0xA4,0xDB,0xDE,0xDB,0xA4,0x58,0x40,0x20,0x18,0x07,0x00, // Temp symbol
|
||||
|
||||
0x00,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0xF0,0x00,0x00,0xFC,0xF8,0xF0,0xE0,0xC0,0x80, //Right Arrow
|
||||
0x00,0x0F,0x0F,0x00,0x00,0x0F,0x0F,0x0F,0x00,0x00,0x3F,0x1F,0x0F,0x07,0x03,0x01,
|
||||
|
||||
0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x00,0x00,0xF0,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0x00, //Left Arrow
|
||||
0x01,0x03,0x07,0x0F,0x1F,0x3F,0x00,0x00,0x0F,0x0F,0x0F,0x00,0x00,0x0F,0x0F,0x00,
|
||||
|
||||
0x11,0x33,0x66,0xCC,0x98,0x30,0x60,0xC0,0xC0,0x60,0x30,0x98,0xCC,0x66,0x33,0x11,
|
||||
0x01,0x03,0x06,0x0C,0x19,0x33,0x66,0xCC,0xCC,0x66,0x33,0x19,0x0C,0x06,0x03,0x01, //Down Chevron
|
||||
|
||||
0x80,0xC0,0x60,0x30,0x98,0xCC,0x66,0x33,0x33,0x66,0xCC,0x98,0x30,0x60,0xC0,0x80,
|
||||
0x88,0xCC,0x66,0x33,0x19,0x0C,0x06,0x03,0x03,0x06,0x0C,0x19,0x33,0x66,0xCC,0x88, //Up Chevron
|
||||
|
||||
0x00,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x00, // Flat Lines
|
||||
0x00,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x00,
|
||||
};
|
||||
#endif /* FONT_H_ */
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
void I2C_Configuration(void);
|
||||
void I2C_PageWrite(u8* pbuf, u8 numbyte, u8 deviceaddr);
|
||||
void I2C_PageRead(u8* pbuf, u8 numbyte, u8 deviceaddr, u8 readaddr);
|
||||
int I2C_Master_Read(uint8_t deviceAddr, uint8_t readAddr, uint8_t* pBuffer,
|
||||
uint16_t numByteToRead);
|
||||
#endif
|
||||
/******************************** END OF FILE *********************************/
|
||||
|
||||
@@ -8,10 +8,12 @@
|
||||
/* Functions for access to data */
|
||||
extern volatile uint32_t system_Ticks;
|
||||
void delayMs(uint32_t ticks);
|
||||
volatile extern uint32_t lastKeyPress;
|
||||
volatile extern uint32_t lastMovement;
|
||||
extern volatile uint32_t lastKeyPress;
|
||||
extern volatile uint32_t lastMovement;
|
||||
|
||||
extern volatile uint8_t keyState;
|
||||
extern volatile uint8_t rawKeys;
|
||||
|
||||
volatile extern uint16_t keyState;
|
||||
inline uint32_t millis() {
|
||||
return system_Ticks;
|
||||
}
|
||||
@@ -24,9 +26,9 @@ inline void resetLastButtonPress() {
|
||||
|
||||
}
|
||||
inline void resetButtons() {
|
||||
lastKeyPress = millis();
|
||||
keyState = 0;
|
||||
}
|
||||
|
||||
inline uint32_t getLastMovement() {
|
||||
return lastMovement;
|
||||
}
|
||||
@@ -34,6 +36,12 @@ inline uint32_t getLastMovement() {
|
||||
inline uint16_t getButtons() {
|
||||
return keyState;
|
||||
}
|
||||
inline uint16_t getRawButtons() {
|
||||
return rawKeys;
|
||||
}
|
||||
inline void restoreButtons() {
|
||||
keyState = getRawButtons();
|
||||
}
|
||||
|
||||
/*IRQ prototypes*/
|
||||
void NMI_Handler(void);
|
||||
|
||||
@@ -14,9 +14,8 @@
|
||||
#ifndef __MMA8652FC__H
|
||||
#define __MMA8652FC__H
|
||||
|
||||
|
||||
void StartUp_Accelerometer(uint8_t sensitivity);//This is the only function we expose
|
||||
|
||||
void StartUp_Accelerometer(uint8_t sensitivity); //This is the only function we expose
|
||||
uint8_t getOrientation();
|
||||
//--------------MMA8652 Device ID----------------------------------------------//
|
||||
|
||||
#define DEVICE_ADDR 0X1D
|
||||
@@ -99,8 +98,6 @@ void StartUp_Accelerometer(uint8_t sensitivity);//This is the only function we e
|
||||
#define INT_SOURCE 0X0C
|
||||
#define DEVICE_ID 0X0D
|
||||
|
||||
|
||||
|
||||
//-----STATUS_REG(0X00)-----Bit Define----------------------------------------//
|
||||
#define ZYXDR_BIT 0X08
|
||||
//----XYZ_DATA_CFG_REG(0xE)-Bit Define----------------------------------------//
|
||||
@@ -123,7 +120,7 @@ void StartUp_Accelerometer(uint8_t sensitivity);//This is the only function we e
|
||||
//---------CTRL_REG2(0X2B)Bit Define------------------------------------------//
|
||||
#define MODS_MASK 0x03 //Oversampling Mode 4
|
||||
#define Normal_Mode 0x0 //Normal=0,Low Noise Low Power MODS=1,
|
||||
//HI RESOLUTION=2,LOW POWER MODS = 11
|
||||
//HI RESOLUTION=2,LOW POWER MODS = 11
|
||||
//----CTRL_REG4---Interrupt Enable BIT ---------------------------------------//
|
||||
//0 interrupt is disabled (default)
|
||||
//1 interrupt is enabled
|
||||
|
||||
@@ -16,7 +16,9 @@
|
||||
#include "PID.h"
|
||||
#include "Settings.h"
|
||||
#include "Analog.h"
|
||||
enum {
|
||||
#include "MMA8652FC.h"
|
||||
#include <string.h>
|
||||
typedef enum {
|
||||
STARTUP, //we are sitting on the prompt to push a button
|
||||
SOLDERING, //Normal operating mode
|
||||
TEMP_ADJ, //Adjust the set temperature
|
||||
@@ -28,17 +30,23 @@ enum {
|
||||
DCINDISP, //Disp the input voltage && Cal the DCin voltage divider
|
||||
TEMPCAL, //Cal tip temp offset
|
||||
|
||||
} operatingMode;
|
||||
} operatingModeEnum;
|
||||
#define SETTINGSOPTIONSCOUNT 11 /*Number of settings in the settings menu*/
|
||||
|
||||
enum {
|
||||
typedef enum {
|
||||
UVCO = 0,
|
||||
SLEEP_TEMP,
|
||||
SLEEP_TIME,
|
||||
MOTIONDETECT,
|
||||
SHUTDOWN_TIME,
|
||||
MOTIONSENSITIVITY,
|
||||
TEMPDISPLAY,
|
||||
LEFTY,
|
||||
} settingsPage;
|
||||
TEMPROUNDING,
|
||||
DISPUPDATERATE,
|
||||
SCREENROTATION,
|
||||
BOOSTMODE,
|
||||
BOOSTTEMP,
|
||||
POWERDISPLAY,
|
||||
} settingsPageEnum;
|
||||
|
||||
void ProcessUI();
|
||||
void DrawUI();
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* Oled.h
|
||||
* Functions for writing to the OLED screen
|
||||
* Basically wraps drawing text and numbers to the OLED
|
||||
* Uses font.h -> 14 pixel wide fixed width
|
||||
* Uses font.h -> 12 pixel wide fixed width
|
||||
*/
|
||||
#ifndef _OLED_SSD1306_H
|
||||
#define _OLED_SSD1306_H
|
||||
@@ -14,18 +14,24 @@
|
||||
void Oled_DisplayOn(void);
|
||||
void Oled_DisplayOff(void);
|
||||
|
||||
u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr);
|
||||
const u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, const u8* ptr);
|
||||
void Set_ShowPos(u8 x, u8 y);
|
||||
void Oled_DisplayFlip();
|
||||
void GPIO_Init_OLED(void);
|
||||
void Init_Oled(uint8_t leftHanded);
|
||||
u8* Data_Command(u8 len, u8* ptr);
|
||||
void Clear_Screen(void);//Clear the screen
|
||||
const u8* Data_Command(u8 len, const u8* ptr);
|
||||
void Clear_Screen(void); //Clear the screen
|
||||
/*Functions for writing to the screen*/
|
||||
void OLED_DrawString(char* string, uint8_t length);
|
||||
void OLED_DrawString(const char* string, const uint8_t length);
|
||||
void OLED_DrawChar(char c, uint8_t x);
|
||||
void OLED_DrawExtendedChar(uint8_t id, uint8_t x);
|
||||
void OLED_DrawWideChar(uint8_t id, uint8_t x);
|
||||
void OLED_DrawTwoNumber(uint8_t in, uint8_t x);
|
||||
void OLED_BlankSlot(uint8_t xStart, uint8_t width);
|
||||
void OLED_DrawThreeNumber(uint16_t in, uint8_t x);
|
||||
void OLED_DrawIDLELogo();
|
||||
void OLED_DrawSymbol(uint8_t x, uint8_t symbol);
|
||||
const u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, const u8* ptr);
|
||||
void OLED_SetOrientation(uint8_t ori);
|
||||
uint8_t OLED_GetOrientation();
|
||||
#endif
|
||||
/******************************** END OF FILE *********************************/
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
#include "Analog.h"
|
||||
#include "Interrupt.h"
|
||||
|
||||
struct {
|
||||
typedef struct {
|
||||
uint32_t kp, ki, kd; //PID values
|
||||
} pidSettings;
|
||||
} pidSettingsType;
|
||||
|
||||
int32_t computePID(uint16_t setpoint);
|
||||
void setupPID(void);
|
||||
|
||||
@@ -11,29 +11,44 @@
|
||||
#define SETTINGS_H_
|
||||
#include <stdint.h>
|
||||
#include "stm32f10x_flash.h"
|
||||
#define SETTINGSVERSION 0x04 /*Change this if you change the struct below to prevent people getting out of sync*/
|
||||
#define SETTINGSOPTIONSCOUNT 6 /*Number of settings in the settings menu*/
|
||||
#define MOTION_HIGH (0x00)
|
||||
#define MOTION_MED (0x10)
|
||||
#define MOTION_LOW (0x20)
|
||||
#include "Oled.h"
|
||||
#define SETTINGSVERSION 14 /*Change this if you change the struct below to prevent people getting out of sync*/
|
||||
//Display Speeds
|
||||
#define DISPLAYMODE_FAST (0x00)
|
||||
#define DISPLAYMODE_MEDIUM (0x01)
|
||||
#define DISPLAYMODE_SLOW (0x02)
|
||||
//Rounding Modes
|
||||
#define ROUNDING_NONE (0x00)
|
||||
#define ROUNDING_FIVE (0x01)
|
||||
#define ROUNDING_TEN (0x02)
|
||||
|
||||
/*
|
||||
* This struct must be a multiple of 2 bytes as it is saved / restored from flash in uint16_t chunks
|
||||
*/
|
||||
struct {
|
||||
uint32_t SolderingTemp; //current setpoint for the iron
|
||||
typedef struct {
|
||||
uint16_t SolderingTemp; //current set point for the iron
|
||||
uint32_t SleepTemp; //temp to drop to in sleep
|
||||
uint8_t version; //Used to track if a reset is needed on firmware upgrade
|
||||
uint8_t SleepTime; //minutes timeout to sleep
|
||||
uint8_t cutoutVoltage:5; //The voltage we cutout at for undervoltage
|
||||
uint8_t movementEnabled:1; //If movement is enabled
|
||||
uint8_t cutoutSetting:3; //(3 bits) The voltage we cut out at for under voltage
|
||||
uint8_t powerDisplay:1; //Toggle to swap the arrows with a power readout instead
|
||||
uint8_t displayTempInF:1; //If we need to convert the C reading to F
|
||||
uint8_t flipDisplay:1; //If true we want to invert the display for lefties
|
||||
uint8_t sensitivity:7; //Sensitivity of accelerometer
|
||||
uint8_t OrientationMode:2; //If true we want to invert the display for lefties
|
||||
uint8_t sensitivity:6; //Sensitivity of accelerometer (5 bits)
|
||||
uint8_t ShutdownTime:6; //Time until unit shuts down if left alone
|
||||
uint8_t displayUpdateSpeed:2; //How fast the display updates / temp showing mode
|
||||
uint8_t temperatureRounding:2; //Rounding mode for the temperature
|
||||
uint8_t boostModeEnabled:1; //Boost mode swaps BUT_A in soldering mode to temporary soldering temp over-ride
|
||||
uint16_t tempCalibration; //Temperature calibration value
|
||||
uint16_t voltageDiv; //Voltage divisor factor
|
||||
} systemSettings;
|
||||
uint16_t BoostTemp; //Boost mode set point for the iron
|
||||
} systemSettingsType;
|
||||
|
||||
extern systemSettingsType systemSettings;
|
||||
|
||||
void saveSettings();
|
||||
void restoreSettings();
|
||||
uint8_t lookupVoltageLevel(uint8_t level);
|
||||
void resetSettings();
|
||||
void showBootLogoIfavailable();
|
||||
#endif /* SETTINGS_H_ */
|
||||
|
||||
@@ -23,7 +23,7 @@ uint16_t readDCVoltage(uint16_t divFactor) {
|
||||
//This allows us to read it in X10 mode
|
||||
//Returns temperature in C X10 mode
|
||||
int16_t readTipTemp() {
|
||||
static uint32_t rollingAverage[4];
|
||||
static uint32_t rollingAverage[16];
|
||||
static uint8_t rIndex = 0;
|
||||
|
||||
/*The head has a thermocouple inline with the heater
|
||||
@@ -54,9 +54,13 @@ int16_t readTipTemp() {
|
||||
ad_sum = ad_sum - max - min; //remove the two outliers
|
||||
avg_data = ad_sum / 8; //take the average
|
||||
rollingAverage[rIndex] = avg_data;
|
||||
rIndex = (rIndex + 1) % 4;
|
||||
rIndex = (rIndex + 1) % 16;
|
||||
return (rollingAverage[0] + rollingAverage[1] + rollingAverage[2]
|
||||
+ rollingAverage[3]) / 4; //get the average
|
||||
+ rollingAverage[3] + rollingAverage[4] + rollingAverage[5]
|
||||
+ rollingAverage[6] + rollingAverage[7] + rollingAverage[8]
|
||||
+ rollingAverage[9] + rollingAverage[10] + rollingAverage[11]
|
||||
+ rollingAverage[12] + rollingAverage[13] + rollingAverage[14]
|
||||
+ rollingAverage[15]) / 16; //get the average
|
||||
|
||||
}
|
||||
|
||||
@@ -110,7 +114,7 @@ uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read,
|
||||
static uint16_t calTemp = 0;
|
||||
static uint16_t lastVal = 0;
|
||||
static uint16_t lastSetTemp;
|
||||
if(setPointTemp!=0xFFFF)
|
||||
if (setPointTemp != 0xFFFF)
|
||||
lastSetTemp = setPointTemp;
|
||||
if (calibration_temp != 0)
|
||||
calTemp = calibration_temp;
|
||||
|
||||
@@ -250,7 +250,7 @@ void Clear_Watchdog(void) {
|
||||
|
||||
//TIM3_ISR handles the tick of the timer 3 IRQ
|
||||
void TIM3_ISR(void) {
|
||||
volatile static u8 heat_flag = 0;
|
||||
static volatile u8 heat_flag = 0;
|
||||
//heat flag == used to make the pin toggle
|
||||
//As the output is passed through a cap, the iron is on whilever we provide a square wave drive output
|
||||
|
||||
|
||||
@@ -4,6 +4,19 @@
|
||||
*/
|
||||
#include "I2C.h"
|
||||
|
||||
/* I2C STOP mask */
|
||||
#define CR1_STOP_Set ((uint16_t)0x0200)
|
||||
#define CR1_STOP_Reset ((uint16_t)0xFDFF)
|
||||
|
||||
/* I2C ACK mask */
|
||||
#define CR1_ACK_Set ((uint16_t)0x0400)
|
||||
#define CR1_ACK_Reset ((uint16_t)0xFBFF)
|
||||
|
||||
/* I2C POS mask */
|
||||
#define CR1_POS_Set ((uint16_t)0x0800)
|
||||
#define CR1_POS_Reset ((uint16_t)0xF7FF)
|
||||
|
||||
#define NULL ((void *)0)
|
||||
/*
|
||||
* Configure the I2C port hardware
|
||||
*/
|
||||
@@ -60,89 +73,222 @@ void I2C_PageWrite(u8* buf, u8 nbyte, u8 deviceaddr) {
|
||||
}
|
||||
|
||||
}
|
||||
//Based on code from http://iamjustinwang.blogspot.com.au/2016/03/stm32f103-i2c-master-driver.html
|
||||
int I2C_Master_Read(uint8_t deviceAddr, uint8_t readAddr, uint8_t* pBuffer,
|
||||
uint16_t numByteToRead) {
|
||||
|
||||
/*
|
||||
* Read Page of data using I2C1 peripheral
|
||||
*/
|
||||
__IO uint32_t temp = 0;
|
||||
volatile int I2C_TimeOut = 0;
|
||||
|
||||
void I2C_PageRead(u8* buf, u8 nbyte, u8 deviceaddr, u8 readaddr) {
|
||||
I2C_GenerateSTART(I2C1, ENABLE);
|
||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_SB) == RESET)
|
||||
;
|
||||
I2C_Send7bitAddress(I2C1, deviceaddr << 1, I2C_Direction_Transmitter);
|
||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR) == RESET)
|
||||
;
|
||||
I2C_GetFlagStatus(I2C1, I2C_FLAG_MSL);
|
||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE) == RESET)
|
||||
;
|
||||
// Send an 8bit byte address
|
||||
I2C_SendData(I2C1, readaddr);
|
||||
// /* While the bus is busy * /
|
||||
I2C_TimeOut = 3000;
|
||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) {
|
||||
}
|
||||
I2C_AcknowledgeConfig(I2C1, DISABLE);
|
||||
I2C_NACKPositionConfig(I2C1, I2C_NACKPosition_Current);
|
||||
I2C_GenerateSTART(I2C1, ENABLE);
|
||||
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) {
|
||||
}
|
||||
I2C_Send7bitAddress(I2C1, deviceaddr << 1, I2C_Direction_Receiver);
|
||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR)) {
|
||||
}
|
||||
if (nbyte == 1) {
|
||||
// Clear Ack bit
|
||||
I2C_AcknowledgeConfig(I2C1, DISABLE);
|
||||
// EV6_1 -- must be atomic -- Clear ADDR, generate STOP
|
||||
__disable_irq();
|
||||
(void) I2C1->SR2;
|
||||
I2C_GenerateSTOP(I2C1, ENABLE);
|
||||
__enable_irq();
|
||||
// Receive data EV7
|
||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE)) {
|
||||
}
|
||||
*buf++ = I2C_ReceiveData(I2C1);
|
||||
} else if (nbyte == 2) {
|
||||
// Set POS flag
|
||||
I2C_NACKPositionConfig(I2C1, I2C_NACKPosition_Next);
|
||||
// EV6_1 -- must be atomic and in this order
|
||||
__disable_irq();
|
||||
(void) I2C1->SR2; // Clear ADDR flag
|
||||
I2C_AcknowledgeConfig(I2C1, DISABLE); // Clear Ack bit
|
||||
__enable_irq();
|
||||
// EV7_3 -- Wait for BTF, program stop, read data twice
|
||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
||||
}
|
||||
__disable_irq();
|
||||
I2C_GenerateSTOP(I2C1, ENABLE);
|
||||
*buf++ = I2C1->DR;
|
||||
__enable_irq();
|
||||
*buf++ = I2C1->DR;
|
||||
} else {
|
||||
(void) I2C1->SR2; // Clear ADDR flag
|
||||
while (nbyte-- != 3) {
|
||||
// EV7 -- cannot guarantee 1 transfer completion time, wait for BTF
|
||||
// instead of RXNE
|
||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
||||
}
|
||||
*buf++ = I2C_ReceiveData(I2C1);
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
||||
// * Send START condition * /
|
||||
I2C_GenerateSTART(I2C1, ENABLE);
|
||||
|
||||
// / * Test on EV5 and clear it * /
|
||||
I2C_TimeOut = 3000;
|
||||
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) {
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
// EV7_2 -- Figure 1 has an error, doesn't read N-2 !
|
||||
I2C_AcknowledgeConfig(I2C1, DISABLE); // clear ack bit
|
||||
}
|
||||
|
||||
// / * Send address for write * /
|
||||
I2C_Send7bitAddress(I2C1, deviceAddr, I2C_Direction_Transmitter);
|
||||
|
||||
// / * Test on EV6 and clear it * /
|
||||
I2C_TimeOut = 3000;
|
||||
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) {
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// / * Send the internal address to read from: Only one byte address * /
|
||||
I2C_SendData(I2C1, readAddr);
|
||||
|
||||
/// * Test on EV8 and clear it * /
|
||||
I2C_TimeOut = 3000;
|
||||
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) {
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/// * Send STRAT condition a second time * /
|
||||
I2C_GenerateSTART(I2C1, ENABLE);
|
||||
|
||||
/// * Test on EV5 and clear it * /
|
||||
I2C_TimeOut = 3000;
|
||||
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) {
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// * Send address for read * /
|
||||
I2C_Send7bitAddress(I2C1, deviceAddr, I2C_Direction_Receiver);
|
||||
|
||||
if (numByteToRead == 1) {
|
||||
/* Wait until ADDR is set */
|
||||
I2C_TimeOut = 3000;
|
||||
while ((I2C1->SR1 & 0x0002) != 0x0002) {
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/* Clear ACK bit */
|
||||
I2C1->CR1 &= CR1_ACK_Reset;
|
||||
/* Disable all active IRQs around ADDR clearing and STOP programming because the EV6_3
|
||||
software sequence must complete before the current byte end of transfer */
|
||||
__disable_irq();
|
||||
*buf++ = I2C_ReceiveData(I2C1); // receive byte N-2
|
||||
I2C_GenerateSTOP(I2C1, ENABLE); // program stop
|
||||
/* Clear ADDR flag */
|
||||
temp = I2C1->SR2;
|
||||
/* Program the STOP */
|
||||
I2C_GenerateSTOP(I2C1, ENABLE);
|
||||
/* Re-enable IRQs */
|
||||
__enable_irq();
|
||||
*buf++ = I2C_ReceiveData(I2C1); // receive byte N-1
|
||||
// wait for byte N
|
||||
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) {
|
||||
/* Wait until a data is received in DR register (RXNE = 1) EV7 */
|
||||
I2C_TimeOut = 3000;
|
||||
while ((I2C1->SR1 & 0x00040) != 0x000040) {
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
*buf++ = I2C_ReceiveData(I2C1);
|
||||
nbyte = 0;
|
||||
/* Read the data */
|
||||
*pBuffer = I2C1->DR;
|
||||
|
||||
} else if (numByteToRead == 2) {
|
||||
|
||||
/* Set POS bit */
|
||||
I2C1->CR1 |= CR1_POS_Set;
|
||||
/* Wait until ADDR is set: EV6 */
|
||||
I2C_TimeOut = 3000;
|
||||
while ((I2C1->SR1 & 0x0002) != 0x0002) {
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/* EV6_1: The acknowledge disable should be done just after EV6,
|
||||
that is after ADDR is cleared, so disable all active IRQs around ADDR clearing and
|
||||
ACK clearing */
|
||||
__disable_irq();
|
||||
/* Clear ADDR by reading SR2 register */
|
||||
temp = I2C1->SR2;
|
||||
/* Clear ACK */
|
||||
I2C1->CR1 &= CR1_ACK_Reset;
|
||||
/*Re-enable IRQs */
|
||||
__enable_irq();
|
||||
/* Wait until BTF is set */
|
||||
I2C_TimeOut = 3000;
|
||||
while ((I2C1->SR1 & 0x00004) != 0x000004) {
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/* Disable IRQs around STOP programming and data reading */
|
||||
__disable_irq();
|
||||
/* Program the STOP */
|
||||
I2C_GenerateSTOP(I2C1, ENABLE);
|
||||
/* Read first data */
|
||||
*pBuffer = I2C1->DR;
|
||||
/* Re-enable IRQs */
|
||||
__enable_irq();
|
||||
/**/
|
||||
pBuffer++;
|
||||
/* Read second data */
|
||||
*pBuffer = I2C1->DR;
|
||||
/* Clear POS bit */
|
||||
I2C1->CR1 &= CR1_POS_Reset;
|
||||
}
|
||||
// Wait for stop
|
||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF)) {
|
||||
|
||||
else { //numByteToRead > 2
|
||||
// * Test on EV6 and clear it * /
|
||||
I2C_TimeOut = 3000;
|
||||
while (!I2C_CheckEvent(I2C1,
|
||||
I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) {
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
// * While there is data to be read * /
|
||||
while (numByteToRead) {
|
||||
/* Receive bytes from first byte until byte N-3 */
|
||||
if (numByteToRead != 3) {
|
||||
/* Poll on BTF to receive data because in polling mode we can not guarantee the
|
||||
EV7 software sequence is managed before the current byte transfer completes */
|
||||
I2C_TimeOut = 3000;
|
||||
while ((I2C1->SR1 & 0x00004) != 0x000004) {
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/* Read data */
|
||||
*pBuffer = I2C1->DR;
|
||||
pBuffer++;
|
||||
/* Decrement the read bytes counter */
|
||||
numByteToRead--;
|
||||
}
|
||||
|
||||
/* it remains to read three data: data N-2, data N-1, Data N */
|
||||
if (numByteToRead == 3) {
|
||||
/* Wait until BTF is set: Data N-2 in DR and data N -1 in shift register */
|
||||
I2C_TimeOut = 3000;
|
||||
while ((I2C1->SR1 & 0x00004) != 0x000004) {
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/* Clear ACK */
|
||||
I2C1->CR1 &= CR1_ACK_Reset;
|
||||
|
||||
/* Disable IRQs around data reading and STOP programming */
|
||||
__disable_irq();
|
||||
/* Read Data N-2 */
|
||||
*pBuffer = I2C1->DR;
|
||||
/* Increment */
|
||||
pBuffer++;
|
||||
/* Program the STOP */
|
||||
I2C1->CR1 |= CR1_STOP_Set;
|
||||
/* Read DataN-1 */
|
||||
*pBuffer = I2C1->DR;
|
||||
/* Re-enable IRQs */
|
||||
__enable_irq();
|
||||
/* Increment */
|
||||
pBuffer++;
|
||||
/* Wait until RXNE is set (DR contains the last data) */
|
||||
I2C_TimeOut = 3000;
|
||||
while ((I2C1->SR1 & 0x00040) != 0x000040) {
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/* Read DataN */
|
||||
*pBuffer = I2C1->DR;
|
||||
/* Reset the number of bytes to be read by master */
|
||||
numByteToRead = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
/* Make sure that the STOP bit is cleared by Hardware before CR1 write access */
|
||||
I2C_TimeOut = 3000;
|
||||
while ((I2C1->CR1 & 0x200) == 0x200) {
|
||||
if (I2C_TimeOut-- <= 0) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// * Enable Acknowledgment to be ready for another reception * /
|
||||
I2C_AcknowledgeConfig(I2C1, ENABLE);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
|
||||
volatile uint32_t system_Ticks;
|
||||
volatile uint32_t lastKeyPress; //millis() at the last button event
|
||||
volatile uint16_t keyState; //tracks the button status
|
||||
volatile uint8_t keyState; //tracks the button status
|
||||
volatile uint8_t rawKeys;
|
||||
volatile uint32_t lastMovement; //millis() at last movement event
|
||||
|
||||
//Delay in milliseconds using systemTick
|
||||
@@ -55,18 +56,24 @@ void EXTI9_5_IRQHandler(void) {
|
||||
//we are interested in line 9 and line 6 for buttons
|
||||
//Line 5 == movement
|
||||
if (EXTI_GetITStatus(EXTI_Line9) != RESET) {
|
||||
if (GPIO_ReadInputDataBit(GPIOA, KEY_A) == SET)
|
||||
if (GPIO_ReadInputDataBit(GPIOA, KEY_A) == SET) {
|
||||
keyState &= ~(BUT_A);
|
||||
else
|
||||
rawKeys &= ~BUT_A;
|
||||
} else {
|
||||
keyState |= BUT_A;
|
||||
lastKeyPress = millis();
|
||||
rawKeys |= BUT_A;
|
||||
lastKeyPress = millis();
|
||||
}
|
||||
EXTI_ClearITPendingBit(EXTI_Line9);
|
||||
} else if (EXTI_GetITStatus(EXTI_Line6) != RESET) {
|
||||
if (GPIO_ReadInputDataBit(GPIOA, KEY_B) == SET)
|
||||
if (GPIO_ReadInputDataBit(GPIOA, KEY_B) == SET) {
|
||||
keyState &= ~(BUT_B);
|
||||
else
|
||||
rawKeys &= ~BUT_B;
|
||||
} else {
|
||||
keyState |= BUT_B;
|
||||
lastKeyPress = millis();
|
||||
rawKeys |= BUT_B;
|
||||
lastKeyPress = millis();
|
||||
}
|
||||
EXTI_ClearITPendingBit(EXTI_Line6);
|
||||
} else if (EXTI_GetITStatus(EXTI_Line5) != RESET) { //Movement Event
|
||||
lastMovement = millis();
|
||||
@@ -205,4 +212,3 @@ void USB_LP_CAN1_RX0_IRQHandler(void) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -23,21 +23,38 @@ void I2C_RegisterWrite(uint8_t reg, uint8_t data) {
|
||||
}
|
||||
|
||||
uint8_t I2C_RegisterRead(uint8_t reg) {
|
||||
u8 tx_data[3];
|
||||
tx_data[0] = reg;
|
||||
I2C_PageRead(tx_data, 1, DEVICE_ADDR, reg);
|
||||
u8 tx_data[1];
|
||||
I2C_Master_Read(DEVICE_ADDR << 1, reg, tx_data, 1);
|
||||
return tx_data[0];
|
||||
}
|
||||
|
||||
uint8_t getOrientation() {
|
||||
//First read the PL_STATUS register
|
||||
uint8_t plStatus = I2C_RegisterRead(PL_STATUS_REG);
|
||||
plStatus >>= 1; //We dont need the up/down bit
|
||||
plStatus &= 0x03; //mask to the two lower bits
|
||||
//0 == left handed
|
||||
//1 == right handed
|
||||
|
||||
return plStatus;
|
||||
}
|
||||
|
||||
void StartUp_Accelerometer(uint8_t sensitivity) {
|
||||
I2C_RegisterWrite(CTRL_REG2, 0); //Normal mode
|
||||
I2C_RegisterWrite( CTRL_REG2, 0x40); // Reset all registers to POR values
|
||||
delayMs(2); // ~1ms delay
|
||||
I2C_RegisterWrite(FF_MT_CFG_REG, 0x78); // Enable motion detection for X and Y axis, latch enabled
|
||||
I2C_RegisterWrite(FF_MT_THS_REG, sensitivity|0x0F); // Set threshold
|
||||
I2C_RegisterWrite(FF_MT_COUNT_REG, 0x01); // Set debounce to 100ms
|
||||
uint8_t sens = 9 * 6 + 5;
|
||||
sens -= 6 * sensitivity;
|
||||
|
||||
I2C_RegisterWrite(FF_MT_THS_REG, 0x80 | sens); // Set threshold
|
||||
I2C_RegisterWrite(FF_MT_COUNT_REG, 0x02); // Set debounce to 100ms
|
||||
I2C_RegisterWrite(PL_CFG_REG, 0x40); //Enable the orientation detection
|
||||
I2C_RegisterWrite(PL_COUNT_REG, 200); //200 count debounce
|
||||
I2C_RegisterWrite(PL_BF_ZCOMP_REG, 0b01000111); //Set the threshold to 42 degrees
|
||||
I2C_RegisterWrite(P_L_THS_REG, 0b10011100);//Up the trip angles
|
||||
I2C_RegisterWrite( CTRL_REG4, 0x04); // Enable motion interrupt
|
||||
I2C_RegisterWrite( CTRL_REG5, 0x04);// Route motion interrupts to INT1 ->PB5 ->EXTI5
|
||||
I2C_RegisterWrite( CTRL_REG1, 0x19); // ODR=100 Hz, Active mode
|
||||
I2C_RegisterWrite( CTRL_REG1, 0x11); // ODR=800 Hz, Active mode
|
||||
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "Oled.h"
|
||||
#include "Settings.h"
|
||||
#include "I2C.h"
|
||||
|
||||
void setup();
|
||||
|
||||
int main(void) {
|
||||
@@ -18,26 +19,33 @@ int main(void) {
|
||||
ProcessUI();
|
||||
DrawUI();
|
||||
delayMs(50); //Slow the system down a little bit
|
||||
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5) == Bit_RESET) {
|
||||
lastMovement = millis();
|
||||
//This is a workaround for the line staying low as the user is still moving. (ie sensitivity is too high for their amount of movement)
|
||||
}
|
||||
}
|
||||
}
|
||||
void setup() {
|
||||
RCC_Config(); //setup system clock
|
||||
NVIC_Config(0x4000); //this shifts the NVIC table to be offset, for the usb bootloader's size
|
||||
GPIO_Config(); //setup all the GPIO pins
|
||||
NVIC_Config(0x4000); //this shifts the NVIC table to be offset, for the usb bootloader's size
|
||||
GPIO_Config(); //setup all the GPIO pins
|
||||
Init_EXTI(); //Init the EXTI inputs
|
||||
Init_Timer3(); //Used for the soldering iron tip
|
||||
Init_Timer3(); //Used for the soldering iron tip
|
||||
Adc_Init(); //Init adc and DMA
|
||||
I2C_Configuration(); //Start the I2C hardware
|
||||
GPIO_Init_OLED(); //Init the GPIO ports for the OLED
|
||||
GPIO_Init_OLED(); //Init the GPIO ports for the OLED
|
||||
restoreSettings(); //Load settings
|
||||
|
||||
StartUp_Accelerometer(systemSettings.sensitivity); //start the accelerometer
|
||||
|
||||
StartUp_Accelerometer(systemSettings.sensitivity); //Start the accelerometer
|
||||
setupPID(); //Init the PID values
|
||||
readIronTemp(systemSettings.tempCalibration, 0,0); //load the default calibration value
|
||||
Init_Oled(systemSettings.flipDisplay); //Init the OLED display
|
||||
readIronTemp(systemSettings.tempCalibration, 0, 0); //load the default calibration value
|
||||
if (systemSettings.OrientationMode == 2)
|
||||
Init_Oled(!getOrientation()); //Init the OLED display
|
||||
else
|
||||
Init_Oled(systemSettings.OrientationMode); //Init the OLED display
|
||||
|
||||
OLED_DrawString("VER 1.16", 8); //Version Number
|
||||
delayMs(400); //Pause to show version number
|
||||
showBootLogoIfavailable();
|
||||
Start_Watchdog(5000); //start the system watch dog as 5 second timeout
|
||||
|
||||
OLED_DrawString("VER 1.05", 8); //
|
||||
delayMs(800); //Pause to show version number
|
||||
Start_Watchdog(1000); //start the system watch dog as 1 second timeout
|
||||
}
|
||||
|
||||
@@ -5,44 +5,92 @@
|
||||
* Author: Ralim <ralim@ralimtek.com>
|
||||
*/
|
||||
#include "Modes.h"
|
||||
uint8_t CalStatus = 0;
|
||||
const char *SettingsLongNames[] =
|
||||
{ " Power source. Sets cutoff voltage. <DC 10V> <S 3.3V per cell>",
|
||||
" Sleep Temperature <C>", " Sleep Timeout <Minutes>",
|
||||
" Shutdown Timeout <Minutes>",
|
||||
" Motion Sensitivity <0.Off 1.least sensitive 9.most sensitive>",
|
||||
" Temperature Unit", " Temperature Rounding Amount",
|
||||
" Temperature Display Update Rate",
|
||||
" Display Orientation <A. Automatic L. Left Handed R. Right Handed>",
|
||||
" Enable front key boost 450C mode when soldering",
|
||||
" Temperature when in boost mode",
|
||||
" Changes the arrows to a power display when soldering" };
|
||||
uint8_t StatusFlags = 0;
|
||||
uint32_t temporaryTempStorage = 0;
|
||||
|
||||
operatingModeEnum operatingMode;
|
||||
settingsPageEnum settingsPage;
|
||||
|
||||
//This does the required processing and state changes
|
||||
void ProcessUI() {
|
||||
uint8_t Buttons = getButtons(); //read the buttons status
|
||||
static uint32_t lastModeChange = 0;
|
||||
if (millis() - getLastButtonPress() < 30)
|
||||
if (getRawButtons() && ((millis() - getLastButtonPress()) > 1000)) {
|
||||
lastKeyPress = millis() - 700;
|
||||
Buttons = getRawButtons();
|
||||
} else if (millis() - getLastButtonPress() < 100) {
|
||||
Buttons = 0;
|
||||
else if (Buttons != 0) {
|
||||
resetLastButtonPress();
|
||||
} else if (Buttons != 0) {
|
||||
resetButtons();
|
||||
}
|
||||
//rough prevention for de-bouncing and allocates settling time
|
||||
|
||||
switch (operatingMode) {
|
||||
case STARTUP:
|
||||
|
||||
if (Buttons == (BUT_A | BUT_B)) {
|
||||
operatingMode = THERMOMETER;
|
||||
} else if (Buttons == BUT_A) {
|
||||
//A key pressed so we are moving to soldering mode
|
||||
operatingMode = SOLDERING;
|
||||
Oled_DisplayOn();
|
||||
} else if (Buttons == BUT_B) {
|
||||
//B Button was pressed so we are moving to the Settings menu
|
||||
operatingMode = SETTINGS;
|
||||
Oled_DisplayOn();
|
||||
}
|
||||
break;
|
||||
case SOLDERING:
|
||||
//We need to check the buttons if we need to jump out
|
||||
if (Buttons == BUT_A || Buttons == BUT_B) {
|
||||
if ((Buttons == BUT_A && !systemSettings.boostModeEnabled)
|
||||
|| Buttons == BUT_B) {
|
||||
//A or B key pressed so we are moving to temp set
|
||||
operatingMode = TEMP_ADJ;
|
||||
if (StatusFlags == 8) {
|
||||
//Boost mode was enabled before
|
||||
//We need to cancel the temp
|
||||
systemSettings.SolderingTemp = temporaryTempStorage;
|
||||
StatusFlags = 0;
|
||||
}
|
||||
} else if (Buttons == (BUT_A | BUT_B)) {
|
||||
|
||||
//Both buttons were pressed, exit back to the cooling screen
|
||||
operatingMode = COOLING;
|
||||
if (StatusFlags == 8) {
|
||||
//Boost mode was enabled before
|
||||
//We need to cancel the temp
|
||||
systemSettings.SolderingTemp = temporaryTempStorage;
|
||||
StatusFlags = 0;
|
||||
}
|
||||
|
||||
} else if ((getRawButtons() == BUT_A && systemSettings.boostModeEnabled)) {
|
||||
if (StatusFlags != 8) {
|
||||
StatusFlags = 8;
|
||||
temporaryTempStorage = systemSettings.SolderingTemp;
|
||||
systemSettings.SolderingTemp = systemSettings.BoostTemp;
|
||||
}
|
||||
//Update the PID Loop
|
||||
int32_t newOutput = computePID(systemSettings.SolderingTemp);
|
||||
setIronTimer(newOutput);
|
||||
} else {
|
||||
if (StatusFlags == 8) {
|
||||
//Boost mode was enabled before
|
||||
//We need to cancel the temp
|
||||
systemSettings.SolderingTemp = temporaryTempStorage;
|
||||
StatusFlags = 0;
|
||||
}
|
||||
//We need to check the timer for movement in case we need to goto idle
|
||||
if (systemSettings.movementEnabled)
|
||||
if (systemSettings.sensitivity)
|
||||
if (millis() - getLastMovement()
|
||||
> (systemSettings.SleepTime * 60000)) {
|
||||
if (millis() - getLastButtonPress()
|
||||
@@ -52,7 +100,7 @@ void ProcessUI() {
|
||||
}
|
||||
}
|
||||
uint16_t voltage = readDCVoltage(systemSettings.voltageDiv); //get X10 voltage
|
||||
if ((voltage / 10) < systemSettings.cutoutVoltage) {
|
||||
if ((voltage) < lookupVoltageLevel(systemSettings.cutoutSetting)) {
|
||||
operatingMode = UVLOWARN;
|
||||
lastModeChange = millis();
|
||||
}
|
||||
@@ -62,78 +110,131 @@ void ProcessUI() {
|
||||
}
|
||||
break;
|
||||
case TEMP_ADJ:
|
||||
if (Buttons == BUT_A) {
|
||||
//A key pressed so we are moving down in temp
|
||||
if (OLED_GetOrientation() == 1) {
|
||||
if (Buttons == BUT_B) {
|
||||
//A key pressed so we are moving down in temp
|
||||
|
||||
if (systemSettings.SolderingTemp > 1000)
|
||||
systemSettings.SolderingTemp -= 100;
|
||||
} else if (Buttons == BUT_B) {
|
||||
//B key pressed so we are moving up in temp
|
||||
if (systemSettings.SolderingTemp < 4500)
|
||||
systemSettings.SolderingTemp += 100;
|
||||
if (systemSettings.SolderingTemp > 1000)
|
||||
systemSettings.SolderingTemp -= 100;
|
||||
} else if (Buttons == BUT_A) {
|
||||
//B key pressed so we are moving up in temp
|
||||
if (systemSettings.SolderingTemp < 4500)
|
||||
systemSettings.SolderingTemp += 100;
|
||||
} else {
|
||||
//we check the timeout for how long the buttons have not been pushed
|
||||
//if idle for > 3 seconds then we return to soldering
|
||||
//Or if both buttons pressed
|
||||
if (Buttons == (BUT_A | BUT_B)) {
|
||||
operatingMode = STARTUP;
|
||||
saveSettings();
|
||||
} else if ((millis() - getLastButtonPress() > 2000)) {
|
||||
operatingMode = SOLDERING;
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
//we check the timeout for how long the buttons have not been pushed
|
||||
//if idle for > 3 seconds then we return to soldering
|
||||
//Or if both buttons pressed
|
||||
if ((millis() - getLastButtonPress() > 2000)
|
||||
|| Buttons == (BUT_A | BUT_B)) {
|
||||
operatingMode = SOLDERING;
|
||||
saveSettings();
|
||||
if (Buttons == BUT_A) {
|
||||
//A key pressed so we are moving down in temp
|
||||
|
||||
if (systemSettings.SolderingTemp > 1000)
|
||||
systemSettings.SolderingTemp -= 100;
|
||||
} else if (Buttons == BUT_B) {
|
||||
//B key pressed so we are moving up in temp
|
||||
if (systemSettings.SolderingTemp < 4500)
|
||||
systemSettings.SolderingTemp += 100;
|
||||
} else {
|
||||
//we check the timeout for how long the buttons have not been pushed
|
||||
//if idle for > 3 seconds then we return to soldering
|
||||
//Or if both buttons pressed
|
||||
if ((millis() - getLastButtonPress() > 2000)
|
||||
|| Buttons == (BUT_A | BUT_B)) {
|
||||
operatingMode = SOLDERING;
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SETTINGS:
|
||||
//Settings is the mode with the most logic
|
||||
//Here we are in the menu so we need to increment through the sub menus / increase the value
|
||||
if (StatusFlags == 4 && Buttons != 0) {
|
||||
//The user pressed the button to breakout of the settings help prompt
|
||||
StatusFlags = 0;
|
||||
} else {
|
||||
if (Buttons & BUT_B) {
|
||||
//A key iterates through the menu
|
||||
if (settingsPage == SETTINGSOPTIONSCOUNT) {
|
||||
//Roll off the end
|
||||
settingsPage = 0; //reset
|
||||
operatingMode = STARTUP; //reset back to the startup
|
||||
saveSettings(); //Save the settings
|
||||
} else {
|
||||
++settingsPage; //move to the next option
|
||||
}
|
||||
} else if (Buttons & BUT_A) {
|
||||
//B changes the value selected
|
||||
switch (settingsPage) {
|
||||
case UVCO:
|
||||
//we are incrementing the cutout voltage
|
||||
systemSettings.cutoutSetting += 1; //Go up 1V at a jump
|
||||
systemSettings.cutoutSetting %= 5; //wrap 0->4
|
||||
break;
|
||||
case SLEEP_TEMP:
|
||||
systemSettings.SleepTemp += 100; //Go up 10C at a time
|
||||
if (systemSettings.SleepTemp > 3000)
|
||||
systemSettings.SleepTemp = 1000;//cant sleep higher than 300
|
||||
break;
|
||||
case SLEEP_TIME:
|
||||
++systemSettings.SleepTime; //Go up 1 minute at a time
|
||||
if (systemSettings.SleepTime > 30)
|
||||
systemSettings.SleepTime = 1;//can't set time over 30 mins
|
||||
//Remember that ^ is the time of no movement
|
||||
break;
|
||||
case SHUTDOWN_TIME:
|
||||
++systemSettings.ShutdownTime;
|
||||
if (systemSettings.ShutdownTime > 60)
|
||||
systemSettings.ShutdownTime = 0; //wrap to off
|
||||
break;
|
||||
case TEMPDISPLAY:
|
||||
systemSettings.displayTempInF =
|
||||
!systemSettings.displayTempInF;
|
||||
break;
|
||||
case SCREENROTATION:
|
||||
systemSettings.OrientationMode++;
|
||||
systemSettings.OrientationMode = systemSettings.OrientationMode % 3;
|
||||
|
||||
if (Buttons & BUT_A) {
|
||||
//A key iterates through the menu
|
||||
if (settingsPage == SETTINGSOPTIONSCOUNT) {
|
||||
//Roll off the end
|
||||
settingsPage = 0; //reset
|
||||
operatingMode = STARTUP; //reset back to the startup
|
||||
saveSettings(); //Save the settings
|
||||
} else
|
||||
++settingsPage; //move to the next option
|
||||
} else if (Buttons & BUT_B) {
|
||||
resetLastButtonPress();
|
||||
//B changes the value selected
|
||||
switch (settingsPage) {
|
||||
case UVCO:
|
||||
//we are incrementing the cutout voltage
|
||||
systemSettings.cutoutVoltage += 1; //Go up 1V at a jump
|
||||
if (systemSettings.cutoutVoltage > 24)
|
||||
systemSettings.cutoutVoltage = 10;
|
||||
break;
|
||||
case SLEEP_TEMP:
|
||||
systemSettings.SleepTemp += 100; //Go up 10c at a time
|
||||
if (systemSettings.SleepTemp > 3000)
|
||||
systemSettings.SleepTemp = 1000;//cant sleep higher than 300
|
||||
break;
|
||||
case SLEEP_TIME:
|
||||
++systemSettings.SleepTime; //Go up 1 minute at a time
|
||||
if (systemSettings.SleepTime > 30)
|
||||
systemSettings.SleepTime = 1; //cant set time over 30 mins
|
||||
//Remember that ^ is the time of no movement
|
||||
break;
|
||||
case MOTIONDETECT:
|
||||
systemSettings.movementEnabled =
|
||||
!systemSettings.movementEnabled;
|
||||
break;
|
||||
case TEMPDISPLAY:
|
||||
systemSettings.displayTempInF = !systemSettings.displayTempInF;
|
||||
break;
|
||||
case LEFTY:
|
||||
systemSettings.flipDisplay = !systemSettings.flipDisplay;
|
||||
break;
|
||||
case MOTIONSENSITIVITY:
|
||||
systemSettings.sensitivity += 0x10;
|
||||
if (systemSettings.sensitivity > 0x20)
|
||||
systemSettings.sensitivity = 0; //reset to high on wrap
|
||||
break;
|
||||
case MOTIONSENSITIVITY:
|
||||
systemSettings.sensitivity++;
|
||||
systemSettings.sensitivity = systemSettings.sensitivity
|
||||
% 10;
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
break;
|
||||
case TEMPROUNDING:
|
||||
systemSettings.temperatureRounding++;
|
||||
systemSettings.temperatureRounding =
|
||||
systemSettings.temperatureRounding % 3;
|
||||
break;
|
||||
case DISPUPDATERATE:
|
||||
systemSettings.displayUpdateSpeed++;
|
||||
systemSettings.displayUpdateSpeed =
|
||||
systemSettings.displayUpdateSpeed % 3;
|
||||
break;
|
||||
case BOOSTMODE:
|
||||
systemSettings.boostModeEnabled =
|
||||
!systemSettings.boostModeEnabled;
|
||||
break;
|
||||
case BOOSTTEMP:
|
||||
systemSettings.BoostTemp += 100; //Go up 10C at a time
|
||||
if (systemSettings.BoostTemp > 4500)
|
||||
systemSettings.BoostTemp = 2500; //loop back at 250
|
||||
break;
|
||||
case POWERDISPLAY:
|
||||
systemSettings.powerDisplay = !systemSettings.powerDisplay;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -142,16 +243,30 @@ void ProcessUI() {
|
||||
if (Buttons & BUT_A) {
|
||||
//A Button was pressed so we are moving back to soldering
|
||||
operatingMode = SOLDERING;
|
||||
Oled_DisplayOn();
|
||||
return;
|
||||
} else if (Buttons & BUT_B) {
|
||||
//B Button was pressed so we are moving back to soldering
|
||||
operatingMode = SOLDERING;
|
||||
Oled_DisplayOn();
|
||||
return;
|
||||
} else if (systemSettings.movementEnabled)
|
||||
} else if (systemSettings.sensitivity) {
|
||||
if (millis() - getLastMovement() < 1000) {//moved in the last second
|
||||
operatingMode = SOLDERING; //Goto active mode again
|
||||
Oled_DisplayOn();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (systemSettings.sensitivity) {
|
||||
//Check if we should shutdown
|
||||
if ((millis() - getLastMovement()
|
||||
> (systemSettings.ShutdownTime * 60000))
|
||||
|| (millis() - getLastButtonPress()
|
||||
> systemSettings.ShutdownTime * 60000)) {
|
||||
operatingMode = COOLING; //shutdown the tip
|
||||
Oled_DisplayOn();
|
||||
}
|
||||
}
|
||||
//else if nothing has been pushed we need to compute the PID to keep the iron at the sleep temp
|
||||
int32_t newOutput = computePID(systemSettings.SleepTemp);
|
||||
setIronTimer(newOutput);
|
||||
@@ -159,13 +274,22 @@ void ProcessUI() {
|
||||
case COOLING: {
|
||||
setIronTimer(0); //turn off heating
|
||||
//This mode warns the user the iron is still cooling down
|
||||
uint16_t temp = readIronTemp(0, 1, 0xFFFF); //take a new reading as the heater code is not taking new readings
|
||||
if (temp < 400) { //if the temp is < 40C then we can go back to IDLE
|
||||
operatingMode = STARTUP;
|
||||
} else if (Buttons & (BUT_A | BUT_B)) { //we check if the user has pushed a button to ack
|
||||
if (Buttons & (BUT_A | BUT_B)) { //we check if the user has pushed a button to exit
|
||||
//Either button was pushed
|
||||
operatingMode = STARTUP;
|
||||
}
|
||||
if (systemSettings.sensitivity) {
|
||||
if (millis() - getLastMovement()
|
||||
> (systemSettings.ShutdownTime * 60000)) {
|
||||
if ((millis() - getLastButtonPress()
|
||||
> systemSettings.ShutdownTime * 60000)) {
|
||||
Oled_DisplayOff();
|
||||
}
|
||||
} else {
|
||||
Oled_DisplayOn();
|
||||
}
|
||||
} else
|
||||
Oled_DisplayOn();
|
||||
}
|
||||
break;
|
||||
case UVLOWARN:
|
||||
@@ -180,10 +304,10 @@ void ProcessUI() {
|
||||
|
||||
if (Buttons == BUT_A) {
|
||||
//Single button press, cycle over to the DC display
|
||||
CalStatus = 0;
|
||||
StatusFlags = 0;
|
||||
operatingMode = DCINDISP;
|
||||
} else if (Buttons == BUT_B) {
|
||||
CalStatus = 0;
|
||||
StatusFlags = 0;
|
||||
operatingMode = TEMPCAL;
|
||||
} else if (Buttons == (BUT_A | BUT_B)) {
|
||||
//If the user is holding both button, exit the screen
|
||||
@@ -194,13 +318,13 @@ void ProcessUI() {
|
||||
break;
|
||||
case DCINDISP: {
|
||||
//This lets the user check the input voltage
|
||||
if (CalStatus == 0) {
|
||||
if (StatusFlags == 0) {
|
||||
if (Buttons == BUT_A) {
|
||||
//Single button press, cycle over to the temp display
|
||||
operatingMode = THERMOMETER;
|
||||
} else if (Buttons == BUT_B) {
|
||||
//dc cal mode
|
||||
CalStatus = 1;
|
||||
StatusFlags = 1;
|
||||
} else if (Buttons == (BUT_A | BUT_B)) {
|
||||
//If the user is holding both button, exit the screen
|
||||
operatingMode = STARTUP;
|
||||
@@ -208,17 +332,17 @@ void ProcessUI() {
|
||||
} else {
|
||||
//User is calibrating the dc input
|
||||
if (Buttons == BUT_A) {
|
||||
if (!systemSettings.flipDisplay)
|
||||
if (!systemSettings.OrientationMode)
|
||||
systemSettings.voltageDiv++;
|
||||
else
|
||||
systemSettings.voltageDiv--;
|
||||
} else if (Buttons == BUT_B) {
|
||||
if (!systemSettings.flipDisplay)
|
||||
if (!systemSettings.OrientationMode)
|
||||
systemSettings.voltageDiv--;
|
||||
else
|
||||
systemSettings.voltageDiv++;
|
||||
} else if (Buttons == (BUT_A | BUT_B)) {
|
||||
CalStatus = 0;
|
||||
StatusFlags = 0;
|
||||
saveSettings();
|
||||
}
|
||||
if (systemSettings.voltageDiv < 120)
|
||||
@@ -235,13 +359,13 @@ void ProcessUI() {
|
||||
operatingMode = THERMOMETER;
|
||||
} else if (Buttons == BUT_A) {
|
||||
//Try and calibrate
|
||||
if (CalStatus == 0) {
|
||||
if (StatusFlags == 0) {
|
||||
if ((readTipTemp() < 300) && (readSensorTemp() < 300)) {
|
||||
CalStatus = 1;
|
||||
StatusFlags = 1;
|
||||
systemSettings.tempCalibration = readTipTemp();
|
||||
saveSettings();
|
||||
} else {
|
||||
CalStatus = 2;
|
||||
StatusFlags = 2;
|
||||
}
|
||||
}
|
||||
} else if (Buttons == (BUT_A | BUT_B)) {
|
||||
@@ -258,19 +382,39 @@ void ProcessUI() {
|
||||
/*
|
||||
* Draws the temp with temp conversion if needed
|
||||
*/
|
||||
void drawTemp(uint16_t temp, uint8_t x) {
|
||||
void drawTemp(uint16_t temp, uint8_t x, uint8_t roundingMode) {
|
||||
if (systemSettings.displayTempInF)
|
||||
temp = (temp * 9 + 1600) / 5;/*Convert to F -> T*(9/5)+32*/
|
||||
if (temp % 10 > 5)
|
||||
temp += 10; //round up
|
||||
OLED_DrawThreeNumber(temp / 10, x);
|
||||
temp /= 10;
|
||||
//handle rounding modes
|
||||
if (roundingMode == ROUNDING_FIVE) {
|
||||
if (temp % 10 < 5)
|
||||
temp = (temp / 10) * 10;
|
||||
else
|
||||
temp = ((temp / 10) * 10) + 5;
|
||||
} else if (roundingMode == ROUNDING_TEN) {
|
||||
temp = (temp / 10) * 10;
|
||||
}
|
||||
|
||||
OLED_DrawThreeNumber(temp, x);
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs all the OLED drawing for the current operating mode
|
||||
*/
|
||||
void DrawUI() {
|
||||
static uint32_t lastOLEDDrawTime = 0;
|
||||
|
||||
static uint16_t lastSolderingDrawnTemp1 = 0;
|
||||
static uint16_t lastSolderingDrawnTemp2 = 0;
|
||||
static uint8_t settingsLongTestScrollPos = 0;
|
||||
uint16_t temp = readIronTemp(0, 0, 0xFFFF);
|
||||
if (systemSettings.OrientationMode == 2) {
|
||||
//Automatic mode
|
||||
OLED_SetOrientation(!getOrientation());
|
||||
}
|
||||
switch (operatingMode) {
|
||||
case STARTUP:
|
||||
//We are chilling in the idle mode
|
||||
@@ -281,110 +425,255 @@ void DrawUI() {
|
||||
Oled_DisplayOff();
|
||||
} else {
|
||||
Oled_DisplayOn();
|
||||
//OLED_DrawString(" IDLE ", 8); //write the word IDLE
|
||||
OLED_DrawIDLELogo();
|
||||
OLED_DrawIDLELogo(); //Draw the icons for prompting the user
|
||||
}
|
||||
break;
|
||||
case SOLDERING:
|
||||
//The user is soldering
|
||||
{
|
||||
if (getIronTimer() == 0) {
|
||||
OLED_DrawChar('C', 5);
|
||||
if (systemSettings.displayUpdateSpeed == DISPLAYMODE_SLOW
|
||||
&& (millis() - lastOLEDDrawTime < 200))
|
||||
return;
|
||||
else if (systemSettings.displayUpdateSpeed == DISPLAYMODE_MEDIUM
|
||||
&& (millis() - lastOLEDDrawTime < 100))
|
||||
return;
|
||||
else if (systemSettings.displayUpdateSpeed == DISPLAYMODE_FAST
|
||||
&& (millis() - lastOLEDDrawTime < 50))
|
||||
return;
|
||||
|
||||
uint32_t tempavg = (temp + lastSolderingDrawnTemp1
|
||||
+ lastSolderingDrawnTemp2);
|
||||
tempavg /= 3;
|
||||
drawTemp(tempavg, 0, systemSettings.temperatureRounding);
|
||||
lastSolderingDrawnTemp1 = temp;
|
||||
lastSolderingDrawnTemp2 = lastSolderingDrawnTemp1;
|
||||
lastOLEDDrawTime = millis();
|
||||
//Now draw symbols
|
||||
if (StatusFlags == 8)
|
||||
OLED_DrawChar('B', 4);
|
||||
else {
|
||||
OLED_DrawChar(' ', 4);
|
||||
}
|
||||
//Draw in battery symbol if desired
|
||||
if (systemSettings.cutoutSetting) {
|
||||
//User is on a lithium battery
|
||||
//we need to calculate which of the 10 levels they are on
|
||||
uint8_t cellCount = systemSettings.cutoutSetting + 2;
|
||||
uint16_t cellV = readDCVoltage(systemSettings.voltageDiv)
|
||||
/ cellCount;
|
||||
//Should give us approx cell voltage X10
|
||||
//Range is 42 -> 33 = 9 steps therefore we will use battery 1-10
|
||||
if (cellV < 33)
|
||||
cellV = 33;
|
||||
cellV -= 33; //Should leave us a number of 0-9
|
||||
if (cellV > 9)
|
||||
cellV = 9;
|
||||
OLED_DrawExtendedChar(cellV + 1, 5);
|
||||
} else {
|
||||
if (getIronTimer() < 900) {
|
||||
OLED_DrawChar(' ', 5);
|
||||
} else { //we are heating
|
||||
OLED_DrawChar('H', 5);
|
||||
OLED_DrawChar(' ', 5);
|
||||
}
|
||||
if (systemSettings.displayTempInF) {
|
||||
OLED_DrawChar('F', 3);
|
||||
} else {
|
||||
OLED_DrawChar('C', 3);
|
||||
}
|
||||
//Optionally draw the arrows, or draw the power instead
|
||||
if (systemSettings.powerDisplay) {
|
||||
//We want to draw in a neat little bar graph of power being pushed to the tip
|
||||
//ofset 11
|
||||
uint16_t count = getIronTimer() / (30000 / 28);
|
||||
if (count > 28)
|
||||
count = 28;
|
||||
OLED_DrawWideChar((count), 6);
|
||||
} else {
|
||||
//Draw in the arrows if the user has the power display turned off
|
||||
OLED_BlankSlot(6 * 12 + 16, 24 - 16);//blank out the tail after the arrows
|
||||
if (getIronTimer() == 0
|
||||
&& (temp / 10) > (systemSettings.SolderingTemp / 10)) {
|
||||
//Cooling
|
||||
OLED_DrawSymbol(6, 5);
|
||||
} else {
|
||||
if (getIronTimer() < 1500) {
|
||||
//Maintaining
|
||||
OLED_DrawSymbol(6, 7);
|
||||
} else { //we are heating
|
||||
OLED_DrawSymbol(6, 6);
|
||||
}
|
||||
}
|
||||
}
|
||||
drawTemp(temp, 0);
|
||||
OLED_DrawChar(' ', 3);
|
||||
OLED_DrawChar(' ', 4);
|
||||
OLED_DrawChar(' ', 6);
|
||||
OLED_DrawChar(' ', 7);
|
||||
|
||||
}
|
||||
break;
|
||||
case TEMP_ADJ:
|
||||
//We are prompting the user to change the temp so we draw the current setpoint temp
|
||||
//With the nifty arrows
|
||||
|
||||
OLED_DrawChar(' ', 0);
|
||||
OLED_DrawChar('<', 1);
|
||||
drawTemp(systemSettings.SolderingTemp, 2);
|
||||
drawTemp(systemSettings.SolderingTemp, 2, 0);
|
||||
OLED_DrawChar(' ', 5);
|
||||
OLED_DrawChar(' ', 6);
|
||||
OLED_DrawChar('>', 7);
|
||||
|
||||
OLED_DrawChar(' ', 7);
|
||||
OLED_DrawChar('>', 6);
|
||||
break;
|
||||
case SETTINGS:
|
||||
//We are prompting the user the setting name
|
||||
|
||||
switch (settingsPage) {
|
||||
case UVCO:
|
||||
OLED_DrawString("UVCO ", 5);
|
||||
OLED_DrawTwoNumber(systemSettings.cutoutVoltage, 5);
|
||||
OLED_DrawChar('V', 7);
|
||||
break;
|
||||
case SLEEP_TEMP:
|
||||
OLED_DrawString("STMP ", 5);
|
||||
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 5);
|
||||
break;
|
||||
case SLEEP_TIME:
|
||||
OLED_DrawString("STIME ", 6);
|
||||
OLED_DrawTwoNumber(systemSettings.SleepTime, 6);
|
||||
break;
|
||||
case MOTIONDETECT:/*Toggle the mode*/
|
||||
if (systemSettings.movementEnabled)
|
||||
OLED_DrawString("MOTION T", 8);
|
||||
else
|
||||
OLED_DrawString("MOTION F", 8);
|
||||
break;
|
||||
case TEMPDISPLAY:/*Are we showing in C or F ?*/
|
||||
if (systemSettings.displayTempInF)
|
||||
OLED_DrawString("TMPUNT F", 8);
|
||||
else
|
||||
OLED_DrawString("TMPUNT C", 8);
|
||||
break;
|
||||
|
||||
case LEFTY:
|
||||
|
||||
if (systemSettings.flipDisplay)
|
||||
OLED_DrawString("FLPDSP T", 8);
|
||||
else
|
||||
OLED_DrawString("FLPDSP F", 8);
|
||||
break;
|
||||
case MOTIONSENSITIVITY:
|
||||
switch (systemSettings.sensitivity) {
|
||||
case MOTION_HIGH:
|
||||
OLED_DrawString("SENSE H ", 8);
|
||||
if (millis() - getLastButtonPress() > 3000) {
|
||||
StatusFlags = 4;
|
||||
//If the user has idled for > 3 seconds, show the long name for the selected setting instead
|
||||
//draw from settingsLongTestScrollPos through to end of screen
|
||||
uint8_t lengthLeft = strlen(SettingsLongNames[settingsPage])
|
||||
- settingsLongTestScrollPos;
|
||||
if (lengthLeft < 1)
|
||||
settingsLongTestScrollPos = 0;
|
||||
//^ Reset once not much left
|
||||
if (lengthLeft > 8)
|
||||
lengthLeft = 8;
|
||||
OLED_DrawString(
|
||||
SettingsLongNames[(uint8_t) settingsPage]
|
||||
+ settingsLongTestScrollPos, lengthLeft);
|
||||
if (lengthLeft < 8)
|
||||
for (uint8_t i = lengthLeft; i < 8; i++)
|
||||
OLED_DrawChar(' ', i);
|
||||
if (millis() - lastOLEDDrawTime > 120) {
|
||||
settingsLongTestScrollPos++;
|
||||
lastOLEDDrawTime = millis();
|
||||
}
|
||||
} else {
|
||||
settingsLongTestScrollPos = 0;
|
||||
switch (settingsPage) {
|
||||
case UVCO:
|
||||
OLED_DrawString("PWRSC ", 6);
|
||||
if (systemSettings.cutoutSetting == 0) {
|
||||
//DC
|
||||
OLED_DrawChar('D', 6);
|
||||
OLED_DrawChar('C', 7);
|
||||
} else {
|
||||
//S count
|
||||
OLED_DrawChar('2' + systemSettings.cutoutSetting, 6);
|
||||
OLED_DrawChar('S', 7);
|
||||
}
|
||||
break;
|
||||
case MOTION_MED:
|
||||
OLED_DrawString("SENSE M ", 8);
|
||||
case SLEEP_TEMP:
|
||||
OLED_DrawString("STMP ", 5);
|
||||
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 5);
|
||||
break;
|
||||
case MOTION_LOW:
|
||||
OLED_DrawString("SENSE L ", 8);
|
||||
case SLEEP_TIME:
|
||||
OLED_DrawString("SLTME ", 6);
|
||||
OLED_DrawTwoNumber(systemSettings.SleepTime, 6);
|
||||
break;
|
||||
case SHUTDOWN_TIME:
|
||||
OLED_DrawString("SHTME ", 6);
|
||||
OLED_DrawTwoNumber(systemSettings.ShutdownTime, 6);
|
||||
break;
|
||||
case TEMPDISPLAY:/*Are we showing in C or F ?*/
|
||||
if (systemSettings.displayTempInF)
|
||||
OLED_DrawString("TMPUNT F", 8);
|
||||
else
|
||||
OLED_DrawString("TMPUNT C", 8);
|
||||
break;
|
||||
case SCREENROTATION:
|
||||
|
||||
switch (systemSettings.OrientationMode) {
|
||||
case 0:
|
||||
OLED_DrawString("DSPROT R", 8);
|
||||
break;
|
||||
case 1:
|
||||
OLED_DrawString("DSPROT L", 8);
|
||||
break;
|
||||
case 2:
|
||||
OLED_DrawString("DSPROT A", 8);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case MOTIONSENSITIVITY:
|
||||
OLED_DrawString("MSENSE ", 7);
|
||||
OLED_DrawChar('0' + systemSettings.sensitivity, 7);
|
||||
break;
|
||||
case TEMPROUNDING:
|
||||
//We are prompting the user about their display mode preferences
|
||||
{
|
||||
switch (systemSettings.temperatureRounding) {
|
||||
case ROUNDING_NONE:
|
||||
OLED_DrawString("TMPRND 1", 8);
|
||||
break;
|
||||
case ROUNDING_FIVE:
|
||||
OLED_DrawString("TMPRND 5", 8);
|
||||
break;
|
||||
case ROUNDING_TEN:
|
||||
OLED_DrawString("TMPRND10", 8);
|
||||
break;
|
||||
default:
|
||||
OLED_DrawString("TMPRND 1", 8);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DISPUPDATERATE:
|
||||
//We are prompting the user about their display mode preferences
|
||||
{
|
||||
switch (systemSettings.displayUpdateSpeed) {
|
||||
case DISPLAYMODE_FAST:
|
||||
OLED_DrawString("TMPSPD F", 8);
|
||||
break;
|
||||
case DISPLAYMODE_SLOW:
|
||||
OLED_DrawString("TMPSPD S", 8);
|
||||
break;
|
||||
case DISPLAYMODE_MEDIUM:
|
||||
OLED_DrawString("TMPSPD M", 8);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
case BOOSTMODE:
|
||||
switch (systemSettings.boostModeEnabled) {
|
||||
case 1:
|
||||
OLED_DrawString("BOOST T", 8);
|
||||
break;
|
||||
case 0:
|
||||
OLED_DrawString("BOOST F", 8);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case BOOSTTEMP:
|
||||
OLED_DrawString("BTMP ", 5);
|
||||
OLED_DrawThreeNumber(systemSettings.BoostTemp / 10, 5);
|
||||
break;
|
||||
case POWERDISPLAY:
|
||||
switch (systemSettings.powerDisplay) {
|
||||
case 1:
|
||||
OLED_DrawString("PWRDSP T", 8);
|
||||
break;
|
||||
case 0:
|
||||
OLED_DrawString("PWRDSP F", 8);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
OLED_DrawString("SENSE ", 8);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SLEEP:
|
||||
//The iron is in sleep temp mode
|
||||
//Draw in temp and sleep
|
||||
OLED_DrawString("SLP", 3);
|
||||
drawTemp(temp, 4);
|
||||
OLED_DrawString("SLP ", 4);
|
||||
drawTemp(temp, 4, systemSettings.temperatureRounding);
|
||||
OLED_BlankSlot(84, 96 - 85); //blank out after the temp
|
||||
|
||||
if (millis() - getLastMovement() > (10 * 60 * 1000)
|
||||
&& (millis() - getLastButtonPress() > (10 * 60 * 1000))) {
|
||||
//OLED off
|
||||
Oled_DisplayOff();
|
||||
} else {
|
||||
Oled_DisplayOn();
|
||||
}
|
||||
|
||||
break;
|
||||
case COOLING:
|
||||
//We are warning the user the tip is cooling
|
||||
OLED_DrawString("COOL", 4);
|
||||
drawTemp(temp, 5);
|
||||
OLED_DrawString("COOL ", 5);
|
||||
temp = readIronTemp(0, 1, 0xFFFF); //force temp re-reading
|
||||
drawTemp(temp, 5, systemSettings.temperatureRounding);
|
||||
break;
|
||||
case UVLOWARN:
|
||||
OLED_DrawString("LOW VOLT", 8);
|
||||
@@ -392,12 +681,12 @@ void DrawUI() {
|
||||
case THERMOMETER:
|
||||
temp = readIronTemp(0, 1, 0xFFFF); //Force a reading as heater is off
|
||||
OLED_DrawString("TEMP ", 5);//extra one to it clears the leftover 'L' from IDLE
|
||||
drawTemp(temp, 5);
|
||||
drawTemp(temp, 5, 0);
|
||||
break;
|
||||
case DCINDISP: {
|
||||
uint16_t voltage = readDCVoltage(systemSettings.voltageDiv); //get X10 voltage
|
||||
|
||||
if (CalStatus == 0 || ((millis() % 1000) > 500)) {
|
||||
if (StatusFlags == 0 || ((millis() % 1000) > 500)) {
|
||||
OLED_DrawString("IN", 2);
|
||||
OLED_DrawChar((voltage / 100) % 10, 2);
|
||||
voltage -= (voltage / 100) * 100;
|
||||
@@ -414,11 +703,11 @@ void DrawUI() {
|
||||
break;
|
||||
case TEMPCAL: {
|
||||
|
||||
if (CalStatus == 0) {
|
||||
if (StatusFlags == 0) {
|
||||
OLED_DrawString("CAL TEMP", 8);
|
||||
} else if (CalStatus == 1) {
|
||||
} else if (StatusFlags == 1) {
|
||||
OLED_DrawString("CAL OK ", 8);
|
||||
} else if (CalStatus == 2) {
|
||||
} else if (StatusFlags == 2) {
|
||||
OLED_DrawString("CAL FAIL", 8);
|
||||
}
|
||||
}
|
||||
@@ -427,4 +716,5 @@ void DrawUI() {
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -14,10 +14,12 @@
|
||||
|
||||
#include "Font.h"
|
||||
int8_t displayOffset = 32;
|
||||
uint8_t currentOrientation = 0;
|
||||
/*Setup params for the OLED screen*/
|
||||
/*http://www.displayfuture.com/Display/datasheet/controller/SSD1307.pdf*/
|
||||
/*All commands are prefixed with 0x80*/
|
||||
u8 OLED_Setup_Array[46] = { 0x80, 0xAE,/*Display off*/
|
||||
u8 OLED_Setup_Array[46] = { /**/
|
||||
0x80, 0xAE,/*Display off*/
|
||||
0x80, 0xD5,/*Set display clock divide ratio / osc freq*/
|
||||
0x80, 0x52,/*Unknown*/
|
||||
0x80, 0xA8,/*Set Multiplex Ratio*/
|
||||
@@ -60,31 +62,25 @@ void Oled_DisplayOff(void) {
|
||||
|
||||
I2C_PageWrite(data, 6, DEVICEADDR_OLED);
|
||||
}
|
||||
/*
|
||||
* This sets the OLED screen to invert the screen (flip it vertically)
|
||||
* This is used if the unit is set to left hand mode
|
||||
*/
|
||||
void Oled_DisplayFlip() {
|
||||
u8 data[2] = { 0x80, 0XC8 };
|
||||
I2C_PageWrite(data, 2, DEVICEADDR_OLED);
|
||||
data[1] = 0xA1;
|
||||
I2C_PageWrite(data, 2, DEVICEADDR_OLED);
|
||||
displayOffset = 0;
|
||||
|
||||
}
|
||||
/*
|
||||
Description: write a command to the Oled display
|
||||
Input: number of bytes to write, array to write
|
||||
Output:
|
||||
*/
|
||||
u8* Data_Command(u8 length, u8* data) {
|
||||
const u8* Data_Command(u8 length, const u8* data) {
|
||||
int i;
|
||||
u8 tx_data[129];
|
||||
//here are are inserting the data write command at the beginning
|
||||
tx_data[0] = 0x40;
|
||||
length++;
|
||||
for (i = 1; i < length; i++) //Loop through the array of data
|
||||
tx_data[i] = *data++;
|
||||
{
|
||||
if (data == 0)
|
||||
tx_data[i] = 0;
|
||||
else
|
||||
tx_data[i] = *data++;
|
||||
}
|
||||
I2C_PageWrite(tx_data, length, DEVICEADDR_OLED); //write out the buffer
|
||||
return data;
|
||||
}
|
||||
@@ -107,7 +103,7 @@ void Set_ShowPos(u8 x, u8 y) {
|
||||
Inputs:(x,y) start point, (width,height) of enclosing rect, pointer to data
|
||||
Output: pointer to the last byte written out
|
||||
*******************************************************************************/
|
||||
u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr) {
|
||||
const u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, const u8* ptr) {
|
||||
u8 m, n, y;
|
||||
|
||||
n = y0 + high;
|
||||
@@ -145,8 +141,8 @@ void GPIO_Init_OLED(void) {
|
||||
Description: Initializes the Oled screen
|
||||
*******************************************************************************/
|
||||
void Init_Oled(uint8_t leftHanded) {
|
||||
currentOrientation = leftHanded;
|
||||
u8 param_len;
|
||||
|
||||
OLED_RST();
|
||||
delayMs(5);
|
||||
OLED_ACT(); //Toggling reset to reset the oled
|
||||
@@ -156,6 +152,10 @@ void Init_Oled(uint8_t leftHanded) {
|
||||
OLED_Setup_Array[11] = 0xC8;
|
||||
OLED_Setup_Array[19] = 0xA1;
|
||||
displayOffset = 0;
|
||||
} else {
|
||||
OLED_Setup_Array[11] = 0xC0;
|
||||
OLED_Setup_Array[19] = 0x40;
|
||||
displayOffset = 32;
|
||||
}
|
||||
I2C_PageWrite((u8 *) OLED_Setup_Array, param_len, DEVICEADDR_OLED);
|
||||
}
|
||||
@@ -174,7 +174,7 @@ void Clear_Screen(void) {
|
||||
/*
|
||||
* Draws a string onto the screen starting at the left
|
||||
*/
|
||||
void OLED_DrawString(char* string, uint8_t length) {
|
||||
void OLED_DrawString(const char* string, const uint8_t length) {
|
||||
for (uint8_t i = 0; i < length; i++) {
|
||||
OLED_DrawChar(string[i], i);
|
||||
}
|
||||
@@ -188,7 +188,9 @@ void OLED_DrawChar(char c, uint8_t x) {
|
||||
x *= FONT_WIDTH; //convert to a x coordinate
|
||||
|
||||
u8* ptr = (u8*) FONT;
|
||||
if (c >= 'A' && c <= 'Z') {
|
||||
if (c >= 'a' && c <= 'z') {
|
||||
ptr += (c - 'a' + 10) * (FONT_WIDTH * 2); //alpha is ofset 10 chars into the array
|
||||
} else if (c >= 'A' && c <= 'Z') {
|
||||
ptr += (c - 'A' + 10) * (FONT_WIDTH * 2); //alpha is ofset 10 chars into the array
|
||||
} else if (c >= '0' && c <= '9')
|
||||
ptr += (c - '0') * (FONT_WIDTH * 2);
|
||||
@@ -207,6 +209,28 @@ void OLED_DrawChar(char c, uint8_t x) {
|
||||
|
||||
Oled_DrawArea(x, 0, FONT_WIDTH, 16, (u8*) ptr);
|
||||
}
|
||||
void OLED_DrawExtendedChar(uint8_t id, uint8_t x) {
|
||||
u8* ptr = (u8*) extendedFont;
|
||||
ptr += (id) * (FONT_WIDTH * 2);
|
||||
x *= FONT_WIDTH; //convert to a x coordinate
|
||||
|
||||
Oled_DrawArea(x, 0, FONT_WIDTH, 16, (u8*) ptr);
|
||||
}
|
||||
|
||||
void OLED_DrawWideChar(uint8_t id, uint8_t x) {
|
||||
u8* ptr = (u8*) DoubleWidthChars;
|
||||
ptr += (id) * (FONT_WIDTH * 4);
|
||||
x *= FONT_WIDTH; //convert to a x coordinate
|
||||
|
||||
Oled_DrawArea(x, 0, FONT_WIDTH * 2, 16, (u8*) ptr);
|
||||
}
|
||||
void OLED_BlankSlot(uint8_t xStart, uint8_t width) {
|
||||
u8* ptr = (u8*) FONT;
|
||||
ptr += (36) * (FONT_WIDTH * 2);
|
||||
|
||||
Oled_DrawArea(xStart, 0, width, 16, (u8*) ptr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Draw a 2 digit number to the display at letter slot x
|
||||
*/
|
||||
@@ -254,3 +278,17 @@ void OLED_DrawIDLELogo() {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void OLED_DrawSymbol(uint8_t x, uint8_t symbol) {
|
||||
Oled_DrawArea(x * FONT_WIDTH, 0, 16, 16, SymbolTable + (symbol * 32));
|
||||
}
|
||||
|
||||
void OLED_SetOrientation(uint8_t ori) {
|
||||
if (ori != currentOrientation) {
|
||||
Init_Oled(ori);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t OLED_GetOrientation() {
|
||||
return currentOrientation;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
|
||||
#include "PID.h"
|
||||
#define MAXPIDOUTPUT 50000
|
||||
|
||||
pidSettingsType pidSettings;
|
||||
|
||||
//This function computes the new value for the ON time of the system
|
||||
//This is the return value from this function
|
||||
int32_t computePID(uint16_t setpoint) {
|
||||
@@ -15,8 +18,8 @@ int32_t computePID(uint16_t setpoint) {
|
||||
uint16_t currentReading = readIronTemp(0, 1,setpoint); //get the current temp of the iron
|
||||
int16_t error = (int16_t) setpoint - (int16_t) currentReading; //calculate the error term
|
||||
ITerm += (pidSettings.ki * error);
|
||||
if (ITerm > MAXPIDOUTPUT)
|
||||
ITerm = MAXPIDOUTPUT;
|
||||
if (ITerm > MAXPIDOUTPUT/2)
|
||||
ITerm = MAXPIDOUTPUT/2;
|
||||
else if (ITerm < 0)
|
||||
ITerm = 0; //cap at 0 since we cant force the iron to cool itself :)
|
||||
|
||||
@@ -34,8 +37,8 @@ int32_t computePID(uint16_t setpoint) {
|
||||
}
|
||||
/*Sets up the pid values*/
|
||||
void setupPID(void) {
|
||||
pidSettings.kp = 25;
|
||||
pidSettings.ki = 7;
|
||||
pidSettings.kd = 2;
|
||||
pidSettings.kp = 15;
|
||||
pidSettings.ki = 2;
|
||||
pidSettings.kd = 3;
|
||||
|
||||
}
|
||||
|
||||
@@ -8,7 +8,11 @@
|
||||
*/
|
||||
|
||||
#include "Settings.h"
|
||||
#define FLASH_ADDR (0x8000000|48896)/*Flash start OR'ed with the maximum amount of flash - 256 bytes*/
|
||||
#define FLASH_ADDR (0x8000000|0xBC00)/*Flash start OR'ed with the maximum amount of flash - 1024 bytes*/
|
||||
#define FLASH_LOGOADDR (0x8000000|0xB800) /*second last page of flash set aside for logo image*/
|
||||
|
||||
systemSettingsType systemSettings;
|
||||
|
||||
void saveSettings() {
|
||||
//First we erase the flash
|
||||
FLASH_Unlock(); //unlock flash writing
|
||||
@@ -38,19 +42,75 @@ void restoreSettings() {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Lookup function for cutoff setting -> X10 voltage
|
||||
/*
|
||||
* 0=DC
|
||||
* 1=3S
|
||||
* 2=4S
|
||||
* 3=5S
|
||||
* 4=6S
|
||||
*/
|
||||
uint8_t lookupVoltageLevel(uint8_t level) {
|
||||
if (level == 0)
|
||||
return 100; //10V since iron does not function below this
|
||||
else
|
||||
return (level * 33) + (33 * 2);
|
||||
}
|
||||
void resetSettings() {
|
||||
|
||||
systemSettings.SleepTemp = 1500; //Temperature the iron sleeps at - default 150.0 C
|
||||
systemSettings.SleepTime = 1; //How many minutes we wait until going to sleep - default 1 min
|
||||
systemSettings.SolderingTemp = 3200; //Default soldering temp is 320.0 C
|
||||
systemSettings.movementEnabled = 1; //we use movement detection by default
|
||||
systemSettings.cutoutVoltage = 10; //10V is the minium cutout voltage as the unit V measurement is unstable below 9.5V
|
||||
systemSettings.version = SETTINGSVERSION; //Store the version number to allow for easier upgrades
|
||||
systemSettings.displayTempInF =0; //default to C
|
||||
systemSettings.flipDisplay=0; //Default to right handed mode
|
||||
systemSettings.sensitivity=0x00; //Default high sensitivity
|
||||
systemSettings.tempCalibration=239; //Default to their calibration value
|
||||
systemSettings.voltageDiv=144; //Default divider from schematic
|
||||
systemSettings.SleepTemp = 1500;//Temperature the iron sleeps at - default 150.0 C
|
||||
systemSettings.SleepTime = 1;//How many minutes we wait until going to sleep - default 1 min
|
||||
systemSettings.SolderingTemp = 3200; //Default soldering temp is 320.0 C
|
||||
systemSettings.cutoutSetting = 0; //default to no cut-off voltage
|
||||
systemSettings.version = SETTINGSVERSION;//Store the version number to allow for easier upgrades
|
||||
systemSettings.displayTempInF = 0; //default to C
|
||||
systemSettings.OrientationMode = 2; //Default to automatic
|
||||
systemSettings.sensitivity = 6; //Default high sensitivity
|
||||
systemSettings.tempCalibration = 239; //Default to their calibration value
|
||||
systemSettings.voltageDiv = 144; //Default divider from schematic
|
||||
systemSettings.ShutdownTime = 30;//How many minutes until the unit turns itself off
|
||||
systemSettings.displayUpdateSpeed = 1; //How fast the LCD updates
|
||||
systemSettings.temperatureRounding = 0; //How the temperature is rounded off
|
||||
systemSettings.boostModeEnabled = 0;//Default to safe, with no boost mode
|
||||
systemSettings.BoostTemp = 4000; //default to 400C
|
||||
systemSettings.powerDisplay = 0; //default to power display being off
|
||||
}
|
||||
|
||||
void showBootLogoIfavailable() {
|
||||
//check if the header is there (0xAA,0x55,0xF0,0x0D)
|
||||
//If so display logo
|
||||
uint16_t temp[98];
|
||||
|
||||
for (uint8_t i = 0; i < (98); i++) {
|
||||
temp[i] = *(uint16_t *) (FLASH_LOGOADDR + (i * 2));
|
||||
}
|
||||
uint8_t temp8[98 * 2];
|
||||
for (uint8_t i = 0; i < 98; i++) {
|
||||
temp8[i * 2] = temp[i] >> 8;
|
||||
temp8[i * 2 + 1] = temp[i] & 0xFF;
|
||||
|
||||
}
|
||||
/*char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
|
||||
'C', 'D', 'E', 'F' };
|
||||
|
||||
OLED_DrawChar(hex[(temp8[0] >> 4) & 0x0F], 0);
|
||||
OLED_DrawChar(hex[(temp8[0] >> 0) & 0x0F], 1);
|
||||
OLED_DrawChar(hex[(temp8[1] >> 4) & 0x0F], 2);
|
||||
OLED_DrawChar(hex[(temp8[1] >> 0) & 0x0F], 3);
|
||||
OLED_DrawChar(hex[(temp8[2] >> 4) & 0x0F], 4);
|
||||
OLED_DrawChar(hex[(temp8[2] >> 0) & 0x0F], 5);
|
||||
OLED_DrawChar(hex[(temp8[3] >> 4) & 0x0F], 6);
|
||||
OLED_DrawChar(hex[(temp8[3] >> 0) & 0x0F], 7);*/
|
||||
if (temp8[0] != 0xAA)
|
||||
return;
|
||||
if (temp8[1] != 0x55)
|
||||
return;
|
||||
if (temp8[2] != 0xF0)
|
||||
return;
|
||||
if (temp8[3] != 0x0D)
|
||||
return;
|
||||
|
||||
Oled_DrawArea(0, 0, 96, 16, (uint8_t*) (temp8 + 4));
|
||||
|
||||
delayMs(1000);
|
||||
}
|
||||
|
||||
@@ -1,9 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<targetDefinitions xmlns="http://openstm32.org/stm32TargetDefinitions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://openstm32.org/stm32TargetDefinitions stm32TargetDefinitions.xsd">
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE targetDefinitions [
|
||||
<!ELEMENT targetDefinitions (board)>
|
||||
<!ELEMENT board (name, dbgIF+, dbgDEV, mcuId)>
|
||||
<!ELEMENT name (#PCDATA)>
|
||||
<!ELEMENT dbgIF (#PCDATA)>
|
||||
<!ELEMENT dbgDEV (#PCDATA)>
|
||||
<!ELEMENT mcuId (#PCDATA)>
|
||||
<!ATTLIST board id CDATA #REQUIRED>
|
||||
]>
|
||||
|
||||
<targetDefinitions>
|
||||
<board id="ts100">
|
||||
<name>ts100</name>
|
||||
<mcuId>stm32f103t8ux</mcuId>
|
||||
<dbgIF>SWD</dbgIF>
|
||||
<dbgDEV>ST-LinkV2</dbgDEV>
|
||||
<dbgDEV>ST-Link</dbgDEV>
|
||||
<mcuId>stm32f103t8ux</mcuId>
|
||||
</board>
|
||||
</targetDefinitions>
|
||||
|
||||
Reference in New Issue
Block a user